作者:夕夕石(硕爷)
QQ:2470798103
Postman介绍
- Postman是一个 Chrome 扩展,能提供强大的 Web API & HTTP 请求调试功能。
- Postman能够发送任何类型的http请求,支持GET/PUT/POST/DELETE等,请求头中可以附带任何数量的headers信息。
- Postman支持不同的认证机制(basic,digest,OAuth)。
- Postman非常简单易用,通过填写URL、header、body等就可以发送一个请求。
- 没有中文支持。
- Postman是使用chrome里面的接口。
- Postman是基于js语言的。
官方地址
- 官网地址:https://www.getpostman.com/
- 官方文档地址: https://www.getpostman.com/docs/
- 问题反馈官方地址:https://go.pstmn.io/app-issues
- 官方git地址:https://github.com/postmanlabs
- 官方实例学习:http://blog.getpostman.com/case-studies/
- 官方blog: http://blog.getpostman.com/
- 官方下载地址:https://www.getpostman.com/apps/
版本分别有:
- chrome插件版本
- mac版本
- linux版本(32/64)
- windows客户端版本(32/64)
newman:
https://www.npmjs.com/package/newman
- 用来运行postman脚本的包。
- 基于nodejs。
- 专为postman而生。
- 功能强大,可以生成html等各种报告,可以做持续集成。
一、postman下载与安装
1、下载
- (1)第一种:夕夕石百度网盘下载地址:
链接:https://pan.baidu.com/s/1hlKY_X8rFdUj2hq3X2K2SQ
提取码:w465
- (2)第二种:官网下载:
点我打开postman官网下载
2、安装
windows版本,下载后一路安装即可。
安装完毕后打开,注册一个账号就能用。
注册账号需要一个个人邮箱,自己取一个用户名,设置密码
二、postman界面熟悉
1、集合栏
2、请求栏
3、新建栏
4、有用的小按钮
三、详细功能介绍
1、全局设置
(1)全局设置入口
- 入口1:
- 入口2:
(2)全局设置--Genaral
全局设置--Genaral:可以设置字号、SSL证书认证等
(3)全局设置--主题
可以设置两个主题:默认白、暗黑
(4)全局设置--查看版本
2、集合
(1)新建集合
(2)新建集合时编辑各字段
可以编辑集合的 名称、描述、认证、前置脚本、后置脚本、变量。
一般只编辑名称、描述、即可。
(3)集合可以进行哪些操作?
重命名、编辑、添加接口请求、添加文件夹、复制、导出、删除
3、接口请求
(1)接口请求的url
(2)发送接口请求
(3)保存接口请求
有 save(保存)和 save as(另存为)两种
(4)get请求的入参
get请求的入参要写在 Params 中:
(5)post请求的入参
- post请求的入参要放在 body 中
- postman支持的post入参类型
- 常用的 urlencoded 与 form-data 类型的区别:
post请求不同的传参方式 | 特点 |
application/x-www-form-urlencoded | 不指定时默认方式, key1=value1&key2=value2 |
multipart/form-data | 一般用于表单需要文件上传 |
(6)前置脚本
- 前置脚本放在 Pre-request Script 中:
(7)后置脚本
- 后置脚本放在 Tests 中:
(8)响应数据
- Pretty查看(美化查看) :
- Raw 查看:
- Preview 查看:
(9)运行集合
- A.运行入口:
- B.运行集合界面认识:
- C.运行完一个集合后,会看到运行结果:
- D.点击下图中的橘黄色按钮“Run Summary”,查看汇总结果:
- E.汇总结果展示:
四、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);
—— 硕爷
—— 专注互联网测试