postman是一个强大的接口调试工具,可打包、发送http请求,保存响应及断言等
postman是一款REST接口的客户端软件,支持所有http协议的请求方式。
支持的请求数据类型除了表单以外,还支持文件(图片、视频)等。
支持接口的全业务流程(从开发、测试、运维等):
开发:mock挡板测试
后端:接口测试
postman支持云服务、协同测试。
postman的使用
postman是采用collection-集合来管理请求的(测试用例)。
第一步:创建一个collection
第二步:创建一个request,重名名为:百度翻译
第三步:打包请求
请求方式:get
请求地址:https://fanyi-api.baidu.com/api/trans/vip/translate
query string parameters(params):
第四步:点击发送send
三、接口测试的流程(postman)
1、需求分析
分析的对象是接口API文档中对接口的描述(接口文档+抓包)。
接口实现的功能。
接口的url地址
接口的参数(query string paramters ):是可以通过?&拼接到url后面的
请求的头部:
Content-Type : get请求没有这个字段,post请求有
Cookie:保存在浏览器中的登录数据,只要在当前会话session,如果接口带了有效的cookie,其实就保持了登录的状态。
请求数据:payload(载荷)-- form data
通过接口传递给服务器的有效数据。
2、测试用例设计
主要指的是设计测试用例。
采用等价类思想、边界值思想、因果图、参数组合发等,设计form data、query string parameter中的参数(数据)的值,然后根据模板形成接口测试的用例。
3、测试脚本(请求-request)开发
使用postman工具开发一个请求,打包我们测试用例中所设计的报文参数,形成一个接口的请求,点击send即可。
4、响应结果分析
拿到了响应的结果,就可以查看响应正文、响应状态码、响应时间(发送请求到返回响应结果的时间)、查看断言结果(需要请求中添加断言)。
四、使用postman进行http接口协议的测试
1、快递查询接口-get
四个参数:
请求方式:get
请求地址:https://www.kuaidi100.com/query?type=debangwuliu&postid=DPK300327071093&temp=0.4039240061952669&phone=
请求头部:对于当前这个get请求,不需要指定
请求数据:get请求,没有请求数据
2.视频评论接口-get
请求方式:get
请求地址:https://ke.qq.com/cgi-bin/comment_new/course_comment_list?cid=302090&count=10&page=0&filter_rating=0&bkn=&r=0.9658793132640322
通过响应结果中给的提升:refer错误
refer是一个头部字段,一般用于防盗链(不是当前页面下的请求,不反回响应数据)
所以在打包请求的时候要加上一个header中的referer字段。
3、电商注册接口(Content-Type:x-www-form-urlencoded)
请求正文的数据类型表单数据,就是一键值对的形式来发送。
请求方式:post
请求地址:http://39.101.167.251/qftest/index.php
请求参数(query string parameter)- params:
c:user
a: register
step: submit
请求的头部:-- headers
Content-Type:x-www-form-urlencoded
请求的正文数据:
username: bk2105_001
email: bk2105_001@163.com
password: 123456
repassword: 123456
agree: on
4、电商个人资料更新接口
1、接口说明:Verydows电商网站登录成功后修改个人基础参数
2、接口的地址:http://39.101.167.251/qftest/user/profile.html
3、请求方式:post
4、请求参数:
参数名 | 参数值 | 参数说明 | 参数数据类型 | 必填 | 备注 |
step | update | 功能 | string | 是 |
5、请求数据:
参数名 | 参数值 | 参数说明 | 参数数据类型 | 必填 | 备注 |
nickname | 昵称 | string | 否 | ||
| | string | 否 | ||
gender | 2 | 性别 | string | 是 | 保密:0 男:1 女:2 |
birth_year | 2020 | 出生年 | string | 是 | |
birth_month | 8 | 出生月 | string | 是 | |
birth_day | 12 | 出生日 | string | 是 | |
signature | 个人签名 | string | 否 |
6、头部信息:
参数名 | 参数值 | 参数说明 | 参数数据类型 | 必填 | 备注 |
Cookie | 登录 | string | 是 | ||
Content-type | x-www-form-urlencoded | 类型 | string | 是 |
7、响应数据:Content-Type: text/html
5、信呼系统办公系统登录(Content-Type:x-www-form-urlencoded)(请求正文有内容)
没有接口文档,获取到接口的四大要素:
Request URL: http://39.101.167.251/xinhu2/index.php?a=check&m=login&d=&ajaxbool=true&rnd=142167
Request Method: POST
Content-Type: application/x-www-form-urlencoded
form-data:
rempass: 0
jmpass: false
device:1636372043281
ltype: 0
adminuser: YWRtaW4:
adminpass: YTg5ODM5ODM:
yanzm:
6、信互图片上传接口(Content-Type:form-data)(文件上传)
form-data类型的数据,既可以是字符串键值对,也可以是文件(图片等超文本)。
Request URL: http://39.101.167.251/xinhu2/index.php?a=upfile&m=upload&d=public&maxsize=80&uptype=image&thumbnail=150x150&ajaxbool=true&rnd=399978
Request Method: POST
Content-Type: multipart/form-data
fomr-data:file: (binary)--python中的open图片需要指定rb、写入html文件指定wb
postman中cookie的使用:
在上传图片的接口的header中,postman默认给了一个cookie的字段,有了这个字段就保持了登录的状态,这个cookie是怎么来的?
在登录的时候,响应中会通过Set-Cookie将登录信息写入到浏览器的cookie管理器中。
在后续该服务器地址下的请求,都会默认从cookie管理器中带上对应的cookie值。
cookie是存储浏览器本地。
postman中也有一个cookie管理器,只要登录过,cookie管理器也会保持对应的值,后续的请求也会从管理器中获取这些值,可以先登录一次,后续接口就可以以登录状态运行了。
7、json类型数据类型
json是独立于语言(java、python等)的一种可读性好的一种数据结构。
主要用于前后端系统传递数据:
前端给后端:请求数据是json的
后端给前端:响应结果是json的(百度翻译接口、信互登录(json数据结构的字符串))
'{“name”:"aa"}'
{"success":true,"face":"http:\/\/39.101.167.251\/xinhu2\/upload\/face\/1_5076.jpg"}这是文本字符串
下面就是转化为了json的数据类型了。
{
"success": true,
"face": "http://39.101.167.251/xinhu2/upload/face/1_5076.jpg"
}
json数据结构的表示:[]或者{}来表示
[] : 表示一个组合,里面可以有多组数据
{}:表示数据,以键值对的形式来表示数据,可读性就比较好
用json数据来表示一个学生信息,会有3人:
info=[
{
"studentName":"lucy",
"studentID":["12345667","12121212"],
"gender":"女",
.....
},
{
"studentName":"petter",
"studentID":"1235667",
"gender":"男",
.....
},
{
"studentName":"李磊",
"studentID":"2323232",
"gender":"男",
.....
}
]
info[2].studentName
info[0].studentName[1]
独立于语言:
在java:[]表示数组、{}表示map集合
在python:[]表示list列表,{}表示字典
8、住逻辑登录接口(Content-Type:application/json)(请求正文json格式)
Request URL: https://b.zhulogic.com/designer_api/account/login_quick
Request Method: POST
Content-Type: application/json
request payload(json结构的请求数据):
{"phone":"18621984010","code":"12121212","messageType":3,"key":"9a95f60f-343e-45b8-bcc0-7cd5d2cbb0e1","registration_type":1,"channel":"zhulogic","unionid":""}
五、postman中的环境和变量的使用
1、postman的环境
postman中提供2种环境:globals和environment环境
globals:只有一个全局环境,在其中可以定义多个变量,不需要指定给某个请求或者集合。
environment环境:是局部环境,可以有多个局部环境,每个局部环境可以设置多个变量。
使用环境的主要的作用:
测试环境、预发布环境、线上环境的差别是什么?就是部署在不同的服务器(ip不一样)
便于测试脚本(测试环境、预发布环境、线上环境之间)的迁移。
将不同环境(测试环境、预发布环境、线上环境)的服务器ip定义在postman环境的变量中,如果需要迁移脚本,更换变量值即可。
设置environment环境
2、测试集合(collection)变量(variable)
给当前的测试集合创建能使用的变量的,当前集合下的所有请求都可以使用的变量。
六、预处理脚本(pre request script)和断言脚本(tests)-- 理解,能写即可
预处理脚本和断言脚本都是使用的js语法。
执行顺序:点了send之后
pre request script (给当前请求提供执行的条件)--> 当前的请求 --> tests中的脚本(请求发送之后,就已经返回了响应报文,就可以判断是否正确了)
1、pre request script预处理脚本
一定是在当前请求发送之前运行的脚本。
//清理collection集合的变量to
// pm.collectionVariables.unset("to");
//发送请求--get请求
//场景发送一个百度翻译接口
//第一个参数是打包的请求的报文
// 如果是get请求,只给一个url地址即可
// pm.sendRequest("https://fanyi-api.baidu.com/api/trans/vip/translate?q=apple2&from=auto&to=jp&appid=20190630000313415&salt=888888&sign=a9adc2d687fbacecc3b5059b9ccedc95", function (err, response) {
// //将地址对应的get请求的响应正文打印在控制台
// console.log(response.json());
// });
//如果是post请求,需要提供一个变量,将参数打包在变量中
//场景:直接发上传图片接口,是失败的?原因是没登录
//能不能在发图片之前,在脚本发送一次登录的接口
//%3A--->改为冒号:
var loginPara = {
"url":"http://39.101.167.251/xinhu/index.php?a=check&m=login&d=&ajaxbool=true&rnd=736580",
"method":"post",
"body":{
"mode":"urlencoded",
"urlencoded":"rempass=0&jmpass=false&device=1636372043281<ype=0&adminuser=YWRtaW4:&adminpass=YTg5ODM5ODM:&yanzm="
}
}
//loginPara不要带引号
pm.sendRequest(loginPara, function (err, response) {
//响应正文打印在控制台
//如果正文是json的结构,可以使用response.json()
//如果正文是html等字符串结构,则使用response.text()
//{"success":true,"face":"http:\/\/39.101.167.251\/xinhu\/upload\/face\/1_4553.jpg"}
console.log(response.text());
});
2、tests断言的使用
在接口测试中,可以对响应状态码、响应正文中的数据,还可以是响应头中的字段。
正文断言:
以字符串的形式断言(大串包小串)
以json数据的键的值断言(提取键的值)
// 1、断言响应状态码
// test:断言方法
// pm:postman的一个对象
// pm.response:当前请求的响应报文(响应状态行、头部、响应正文)
// pm.test("状态码为200吗?", function () {
// pm.response.to.have.status(201);
// });
// 2、响应正文中是否包括指定一个字符串
// pm.expect:判断的作用(需要有预期(小串)和实际(大串))
// pm.response.text():获取响应正文的字符串格式
// pm.test("Body matches string", function () {
// var strBody = pm.response.text()
// console.log(strBody)
// var xiaoChuan = "apple"
// pm.expect(strBody).to.include(xiaoChuan);
// });
// 3、响应正文中的数据是json类型的,提取其中某个键的值作为判断的标准
// pm.response.json(): 将json正文转化为js中可以处理的数据结构
pm.test("json值是否符合预期?", function () {
var jsonData = pm.response.json();
//输出数据到控制台的一句
//如果是{}定义的,就可以通过jsonData对象.键
//如果看到是[],就需要通过下标来获取数据,0表示第一个索引
// console.log(jsonData.trans_result[0].dst)
var actualvalue = jsonData.trans_result[0].dst;
var expectValue = "苹果"
pm.expect(actualvalue).to.eql(expectValue);
});
//4、响应时间的断言(请求从发送到返回响应结果的时间差)
// pm.response.responseTime:获取的就是响应报文的响应时间数据
//to.be.below:只要低于指定的值即可通过
pm.test("响应时间小于200ms吗?", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
//5、判断请求成功的状态
// to.be.oneOf:只要其中一个符合要求即可通过
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([200,201, 202]);
});
// 6、响应状态信息(和响应状态码是一一对应的)
pm.test("Status code name has string", function () {
pm.response.to.have.status("OK");
});
// 参数化时候的断言使用
七、runner运行器的使用
辅助进行测试用例(postman中的请求)的模块,而且提供参数化、迭代次数设置和报告输出的功能。还能调整测试执行测试用例的条数和执行顺序。
runner运行器执行是测试集合collection中的测试用例(请求)。
1、启动runner
2、设置runner运行器
3、运行测试集合
点击运行run,结果为
4、runner运行器中的参数化-csv\txt文件
第一步:创建外部参数文件,改后缀名为csv
第二步:存入数据,并转码为utf-8
第三步:使用csv文件中字段名(第一行数据),参数化postman中电商注册接口的数据。
格式{{username}}
点击运行即可。
第四步:添加断言
第五步:设置参数化文件
在runner运行器中-->data,点击加载csv\text文件(手动点一下文件类型)-->预览没有乱码即可。
点击运行即可。
第六步:运行,查看执行结果
5、runner运行器中的参数化-json文件
第一步:创建外部参数文件,改后缀名为json
第二步:存入数据,并转码为utf-8
第三步:使用json文件中键,参数化postman中电商注册接口的数据。格式{{username}}
第四步:添加断言
第五步:设置参数化文件
在runner运行器中-->data,点击加载csv\text文件(手动点一下文件类型)-->预览没有乱码即可。
点击运行即可。
八、电商系统后台相关的接口(需要预处理或者关联执行)
1、分析接口的特点:
第一次登录的接口数据
第二次登录接口的数据:
区别是什么:两次发送接口的请求数据不一样。
总结技术点:
cookie技术:账号信息保存再本地浏览器(postman)中的cookie管理器中。
session技术:用户信息是在服务器端,这个区域有个编号叫sessionid,这个sessionid会发送给客户端,要求你需要带着这个sessionid来请求。这种技术的缺点就是服务器端的压力会更大些。
关联技术(解决session用法):服务器每次会给客户端一个新的sessionid,在下次发送请求的时候就要带着最新的sessionid值去发,也就是说要获取每次更新过来的sessionid,
通过上面分析,发现,在电商后台首页刷新的时候,会得到这两个变化的值(每次刷新都变):
2、如何实现
1、从首页接口中获取这两个值
先创建一个首页接口。
Request URL: http://39.101.167.251/qftest/index.php?m=backend&c=main&a=index
Request Method: GET
2、通过js脚获取值并写入一个变量中(可以是环境变量、也可以是集合变量)
在首页接口的tests模块中,以js脚本形式处理。
//定义变量,先把响应正文数据获取出来
var strData = pm.response.text();
// console.log(strData);
// 怎么提取<input type="hidden" name="NKJVp" value="445842429" />
// 可以使用正则表达式提取,想提取哪一个值,就用(.*?)来替换一下
//.表示任意字符
//.*表示任意多个字符
//.*?表示只取一组匹配到的任意字符,贪婪匹配
var regData = strData.match(new RegExp("name=\"(.*?)\" value=\"(.*?)\""))
// console.log(regData);
var nameData = regData[1];
var valueData = regData[2];
// console.log(nameData);
// console.log(valueData);
//把这两个值写入到集合变量
pm.collectionVariables.set("name", nameData);
pm.collectionVariables.set("value", valueData);
实现的效果,把两个值提取出来并保存在collection集合变量中。
3、使用变量参数化登录接口的数据({{变量名}})
4、使用runner运行按照先首页再登录的顺序执行两个接口即可
3、登录成功之后,实现商品删除接口
Request URL: http://39.101.167.251/qftest/index.php?m=backend&c=goods&a=delete&id=368
Request Method: GET
实现方式:
按照首页、登录、删除的顺序执行。(按照这种方式来)
在删除接口中添加cookie值(浏览器中抓取,会有时效性)
九、云学习平台(json类型)-- 最常见的接口类型
案例特点:
请求数据类型是json结构
响应正文数据类型也是json结构
token技术(令牌技术):把账号信息进行加密之后,作为一个响应结果传到客户端,要求后续操作都要带上这个token值,才能正常实现某些功能,token技术是可以跨平台的(web和app)。
JWT技术:json web token技术,它利用简洁且自包含的 JSON 对象形式进行信息安全传递。
头部(加密算法和token类型):eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
载荷(用户id、签发者、过期时间等)eyJhdWQiOiJRRkVEVV9Qc1lEMkdkM3lvMFg2bGttQXJyTnRBPT0iLCJleHAiOjE2NDg3ODkzOTV9.
签名(头部+载荷进行base64的加密):8UFIFMbuARLhr2Cpz_5_zIwDnNFrFEuXnZ7kuqr3bkc
关联技术:把上一个接口的数据通过各种手段获取,之后参数化给后面的接口使用。
1、云学习平台验证码接口
Request URL: http://study.qfedu.com/student/api/capchaRestController/captcha
Request Method: POST
tests断言中添加的代码:
//获取响应正文
var jsonData = pm.response.json();
var imgToken = jsonData.data.imgAuthCodeToken;
var imgCode = jsonData.data.code;
imgToken = "\"" + imgToken + "\"";
imgCode = "\"" + imgCode + "\"";
//将这两个值写入到集合变量中
pm.collectionVariables.set("imgToken", imgToken);
pm.collectionVariables.set("imgCode", imgCode);
2、云学习平台的登录接口
Request URL: http://study.qfedu.com/student/api/login
Request Method: POST
请求数据:{"mobile":"18621984010","password":"123456","imgCode":"79365","imgToken":"a667f1e9-75bf-4dd0-a1e9-945c21d2c5c6"}
标红色的是来自有第一个验证码接口的响应正文中的数据。
tests中的脚本
//获取响应正文
var jsonData = pm.response.json();
var token = jsonData.data.token;
pm.collectionVariables.set("token", token);
3、云学习平台的在线刷题接口
Request URL: http://study.qfedu.com/student/api/question/label/list
Request Method: POST
Request Header:
Token:xxxx
Content-Type: application/json