postman初步及常用脚本


作者:夕夕石(硕爷)

QQ:2470798103


Postman介绍

  1. Postman是一个 Chrome 扩展,能提供强大的 Web API & HTTP 请求调试功能。
  2. Postman能够发送任何类型的http请求,支持GET/PUT/POST/DELETE等,请求头中可以附带任何数量的headers信息。
  3. Postman支持不同的认证机制(basic,digest,OAuth)。
  4. Postman非常简单易用,通过填写URL、header、body等就可以发送一个请求。
  5. 没有中文支持。
  6. Postman是使用chrome里面的接口。
  7. Postman是基于js语言的。

官方地址

  1. 官网地址:https://www.getpostman.com/
  2. 官方文档地址: https://www.getpostman.com/docs/
  3. 问题反馈官方地址:https://go.pstmn.io/app-issues
  4. 官方git地址:https://github.com/postmanlabs
  5. 官方实例学习:http://blog.getpostman.com/case-studies/
  6. 官方blog: http://blog.getpostman.com/
  7. 官方下载地址:https://www.getpostman.com/apps/

版本分别有

  1. chrome插件版本
  2. mac版本
  3. linux版本(32/64)
  4. windows客户端版本(32/64)

newman

https://www.npmjs.com/package/newman

  1. 用来运行postman脚本的包。
  2. 基于nodejs。
  3. 专为postman而生。
  4. 功能强大,可以生成html等各种报告,可以做持续集成。

一、postman下载与安装

1、下载

  • (1)第一种:夕夕石百度网盘下载地址:

链接:https://pan.baidu.com/s/1hlKY_X8rFdUj2hq3X2K2SQ

提取码:w465

image
  • (2)第二种:官网下载:

点我打开postman官网下载

image

2、安装

  • windows版本,下载后一路安装即可。

  • 安装完毕后打开,注册一个账号就能用。

注册账号需要一个个人邮箱,自己取一个用户名,设置密码

image

二、postman界面熟悉

1、集合栏

image

2、请求栏

image

3、新建栏

image

4、有用的小按钮

image

三、详细功能介绍

1、全局设置

(1)全局设置入口

  • 入口1:
image
  • 入口2:
image

(2)全局设置--Genaral

全局设置--Genaral:可以设置字号、SSL证书认证等

image

(3)全局设置--主题

可以设置两个主题:默认白、暗黑

image

(4)全局设置--查看版本

image

2、集合

(1)新建集合

image

(2)新建集合时编辑各字段

可以编辑集合的 名称、描述、认证、前置脚本、后置脚本、变量。

一般只编辑名称、描述、即可。

image

(3)集合可以进行哪些操作?

重命名、编辑、添加接口请求、添加文件夹、复制、导出、删除

image

3、接口请求

(1)接口请求的url

image

(2)发送接口请求

image

(3)保存接口请求

有 save(保存)和 save as(另存为)两种

image

(4)get请求的入参

get请求的入参要写在 Params 中:

image

(5)post请求的入参

  • post请求的入参要放在 body
image
  • postman支持的post入参类型
image
  • 常用的 urlencodedform-data 类型的区别:














post请求不同的传参方式 特点
application/x-www-form-urlencoded 不指定时默认方式, key1=value1&key2=value2
multipart/form-data 一般用于表单需要文件上传

(6)前置脚本

  • 前置脚本放在 Pre-request Script 中:
image

(7)后置脚本

  • 后置脚本放在 Tests 中:
image

(8)响应数据

  • Pretty查看(美化查看) :
image
  • Raw 查看:
image
  • Preview 查看:
image

(9)运行集合

  • A.运行入口:
image
  • B.运行集合界面认识:
image
  • C.运行完一个集合后,会看到运行结果:
image
  • D.点击下图中的橘黄色按钮“Run Summary”,查看汇总结果:
image
  • E.汇总结果展示:
image
image

四、postman常用脚本之断言

1、状态码及说明

==(1)状态代码是200==

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200); # 200是int类型
});

(2)状态码名称(OK、Not Found……)

pm.test("Status code name has string", function () {
    pm.response.to.have.status("Created"); # Created:string类型
});

(3)实际状态码在预期几个状态码其中

pm.test("状态码是200或201", function () {
    pm.expect(pm.response.code).to.be.oneOf([201,202]);
});

2、响应中字符串断言

**(1)检查响应主体是否 **等于字符串****

pm.test("响应数据 = 某个string", function () {
    pm.response.to.have.body("response_body_string");
});

==**(2)检查响应主体是否 **包含字符串****==

pm.test("Body matches string", function () {
    pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});

3、检查JSON值(※极其重要※)

==(1)检查响应数据某 字段的值是否等于 xxx==

pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.student.count).to.eql(100);
});

==(2)判断响应中 某字段下是否包含某字段(用js语言)==

hasOwnProperty

pm.test("检查响应中choose_subject字段是否包含name字段",function(){
    var jsonData = pm.response.json();
    pm.expect(jsonData.choose_subject.hasOwnProperty("name")).to.eql(true);
});
jsonData.choose_subject.containsKey.every(item => "name" in item); //(这个不用看)

下面这是加了js循环的(可以不看):

pm.test("检查响应中choose_subject字段是否包含name字段",function(){
    var jsonData = pm.response.json();
    for (i=0; i "name" in item);

==(3)判断响应中某字段下某字段的值是否包含某字符串(用js语言)==

to.include

pm.test("响应中包含buy_status字段,其下subject_name字段值包含字符串语文、数学、英语", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.buy_status[0].subject_name).to.include('语文');
});

==(4)判断响应中某字段的值不为空(不为0、“”、[]、{}等)==

pm.test("响应content字段的值不为空", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.content ? true:false).to.eql(true);
});

4、header中某key存在

pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type");
});

5、判断响应中字段数据类型

我大概整理一下几种类型的:

number 、string 、object 、array 、boolean 、undefind(空)

pm.test("term_type 是整型", function () {
    pm.expect(typeof(jsonData.return_list[0].term_type) === "number").to.eql(true);
});

pm.test("id 是字符串", function () {
    pm.expect(typeof(jsonData.return_list[0].id) === "string").to.eql(true);
});

pm.test("success  是布尔值", function () {
    pm.expect(typeof(jsonData.success) === "boolean").to.eql(true);
});
pm.test("return_list 是 array数组", function () {
    pm.expect(jsonData.return_list instanceof Array).to.eql(true);
});
pm.test("name字段未定义(或者说不存在)", function () {
    var jsonData = pm.response.json();
    pm.expect(typeof(jsonData.name) === "undefined").to.eql(true);
});

扩展一下js语言(for循环):

var jsonData = pm.response.json();
for (i=0; i

6、响应时间

  • 响应时间小于200毫秒
pm.test("Response time is less than 200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});
  • 响应时间大于10毫秒
pm.test("响应时间小于200毫秒", function () {
    pm.expect(pm.response.responseTime).to.be.above(10);
});

7、json高级

(1)使用TinyValidator获取JSON数据

var schema = {
     "items": {
     "type": "boolean"
     }
};
var data1 = [true, false];
var data2 = [true, 123];

pm.test('Schema is valid', function() {
  pm.expect(tv4.validate(data1, schema)).to.be.true;
  pm.expect(tv4.validate(data2, schema)).to.be.true;
});

(2)JSON模式验证器

var Ajv = require('ajv'),
    ajv = new Ajv({logger: console}),
    schema = {
        "properties": {
            "alpha": {
                "type": "boolean"
            }
        }
    };

pm.test('Schema is valid', function() {
    pm.expect(ajv.validate(schema, {alpha: true})).to.be.true;
    pm.expect(ajv.validate(schema, {alpha: 123})).to.be.false;
});

(3)将XML主体转换为JSON对象

var jsonObject = xml2Json(responseBody);

8、解码base64编码数据

var intermediate,
    base64Content, // assume this has a base64 encoded value
    rawContent = base64Content.slice('data:application/octet-stream;base64,'.length);

intermediate = CryptoJS.enc.Base64.parse(base64content); // CryptoJS is an inbuilt object, documented here: https://www.npmjs.com/package/crypto-js
pm.test('Contents are valid', function() {
  pm.expect(CryptoJS.enc.Utf8.stringify(intermediate)).to.be.true; // a check for non-emptiness
});

五、postman进阶脚本

1、发送请求(pm.sendRequest)

(1)发送get请求

//const 是定义常量
const url = 'http://115.28.108.130:5000/api/user/getToken/?appid=136425';
// 发送get请求
pm.sendRequest(url, function (err, res) { //err, res这两个命名随便,但是必须第一个表示异常,第二个表示响应
  console.log(err ? err : res.text());  // 控制台打印请求文本。res.text()、res.json()
});

(2)发送表单式post请求

//构造一个登录请求
const loginRequest = {
    url: 'http://115.28.108.130:5000/api/user/login/',
    method: "POST",
    body: {
        mode: 'urlencoded',  // 模式为表单url编码模式
        urlencoded: 'name=张三&password=123456'
    }
};

// 发送请求
pm.sendRequest(loginRequest, function (err, res) {
    console.log(err ? err : res.text());
});

(3)发送JSON格式请求

// 构造一个注册请求
const regRequest = {
  url: 'http://115.28.108.130:5000/api/user/reg/',
  method: 'POST',
  header: 'Content-Type: application/json',  //注意要在Header中声明内容使用的类型
  body: {
    mode: 'raw',  // 使用raw(原始)格式
    raw: JSON.stringify({ name: '小小', password: '123456' }) //要将JSON对象转为文本发送
  }
};

// 发送请求
pm.sendRequest(regRequest, function (err, res) {
  console.log(err ? err : res.json());  // 响应为JSON格式可以使用res.json()获取到JSON对象
});

(4)发送XML格式请求

发送XML格式和发送JSON格式差不多, 只要指定内容格式并发送相应的内容即可

//构造请求
const demoRequest = {
  url: 'http://httpbin.org/post',
  method: 'POST',
  header: 'Content-Type: application/xml',  // 请求头种指定内容格式
  body: {
    mode: 'raw',
    raw: 'hello'  // 按文本格式发送xml
  }
};

//发送请求
pm.sendRequest(demoRequest, function (err, res) {
  console.log(err ? err : res.json());
});

2、更改接口请求顺序

用处:有时候我们不希望集合按照严格顺序执行接口。这时候就可以更改接口请求的顺序。

举例

假如你的集合下有三个接口A、B、C,其中A接口返回字段有一个content_type,

当content_type=1时,我们期望执行B接口,再执行C接口结束;

当content_type=2时,我们期望直接执行C接口结束;

(1)一般模式

  • postman.setNextRequest('接口请求的名称');
//更改接口执行顺序
postman.setNextRequest("用脚本发送post请求");

(2)分支模式

var jsonData = pm.response.json()

if(jsonData.args.a == 'a'){
    postman.setNextRequest("D");
}
else{
    postman.setNextRequest("B");
}

(3)轮询模式

场景:当本接口响应数据为 "{}\n"时,再一次执行本接口,直到响应数据改变

if(pm.response.text() == "{}\n"){
    postman.setNextRequest("自身接口的名称");
}

3、脚本中打印请求url、入参、响应信息

(1)打印请求所有信息(包括url、入参、headers等)

console.log(request);

(2)打印请求的 url

console.log(request.url);

get请求的url是带参数的;

post请求的url不带参数

(3)打印get请求的所有入参

如get请求的url是:

https://pMobile/recite_word/tlist.vpage?clazz_level={{tuobi_qiaoSuan_grade}}&sid={{student_id}}

console.log(request.url.split('?')[1]);

(4)打印get请求的所有入参某个入参

如get请求的url是:

https://pMobile/recite_word/tlist.vpage?clazz_level={{tuobi_qiaoSuan_grade}}&sid={{student_id}}

我想打印 sid 这个入参的值:

  • 第一种方法:
console.log(request.url.split('?')[1].split('&')[1].split('=')[1]);
  • 第二种方法:

上面这个方法,当入参顺序变化时,会取错值,为了取正确,优化成这样写:

var keys = request.url.split('?')[1].split('&');//获取到所有的参数,组成数组

for(index in keys){
    key = keys[index].split('=')[0]; //获取到参数对的key
    value = keys[index].split('=')[1]; //获取到参数对的value
    if(key === 'sid'){ //当参数对的key=我要的sid时
        let sid = value; 自定义一个变量叫sid,值等于上面参数对的value
        console.log(sid);
    }
}

(5)获取post参数的所有入参

console.log(request.data);

(6)获取post参数的入参中“mobile”这个参数

console.log(request.data.mobile);

(7)获取请求的headers

console.log(request.headers);

4、脚本中打印响应信息

(1)获取响应所有信息

console.log(pm.response);

(2)获取响应的headers

console.log(pm.response.headers.members[0]['key']);
console.log(pm.response.headers.members[2]['value']);

(3)获取响应状态码及说明

console.log(pm.response.code);
console.log(pm.response.status);

5、计算数组长度

function count(o){
    var t = typeof o;
    if(t == 'string'){ //计算字符串的长度
        return o.length;
    }else if(t == 'object'){//计算数组的长度
        var n = 0;
        for(var i in o){
            n++;
        }
        return n;
    }
    return false;
}

var lesson = jsonData.lessons[0];
console.log(count(lesson));//调用count方法

六、获取一个返回的HTML文件进行校验

详见我的另一篇文章

var html, titleText;
// load the response body as HTML using cheerio
// and using cheerio's jQuery like .find API, get the H1 tag
html = cheerio(responseBody);
titleText = html.find('h1').text();
// add a test that ensures that there is some H1 content
tests["page must have h1 heading"] = Boolean(titleText);

—— 硕爷

—— 专注互联网测试


你可能感兴趣的:(postman初步及常用脚本)