postman接口测试工具详解【全】
目录
(2)Response body:Contains string
一、postman简介
1、postman介绍
postman是一个接口测试工具,在做接口测试的时候,postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。
它主要是用来模拟各种HTTP请求的(如:get/post/delete/put…等等),postman与浏览器的区别在于有的浏览器不能输出json格式,而postman可以更直观看到接口返回的结果。
2、postman特点
- 简单易用的图形化用户界面
- 支持保存接口请求的历史记录
- 使用测试集合Collection可以更有效的管理组织接口
- 支持团队之间同步接口数据
- 做接口功能性的测试
3、postman下载与安装
(1)下载
直接在官网下载即可
Download Postman | Get Started for Free
(2)安装
双击打开安装包直接进行安装
4、postman注册登录
刚打开时,需要注册新用户,点击【Create Acount】进行注册
输入邮箱、用户名、密码,点击注册
如图所示,即登录成功
5、postman卸载
postman如果需要卸载的话,右键图标打开文件所在位置,退回到AppData文件夹,删除local、Roaming文件夹下的postman文件夹即可
二、postman工具初识
1、界面导航说明
由于界面纯英文显示,第一次接触postman的小伙伴可能不太熟悉,这里以主界面的图做注解,来说明下各个元素的含义(后面会详细介绍到)
2、发送第一个请求
第一次使用postman时,这里以一个百度翻译接口为例:发起一个get类型的请求
(1)创建一个工程目录
注意:如果没有特别的要求,只需要创建一次即可
(2)创建collection集合
collection是postman管理接口请求的基本单位,首先就是把他创建出来,我们在自己的工程下,点击【+】号,再点击【Blank collection】创建空集合后,可进行重命名
(3)创建一个接口请求
在新建的空集合下右键点击【Add request】,新建一个接口请求,即接口用例,新建后也可重命名
(4)拼装一个接口请求参数
对于一个接口请求来说,需要三部分内容:
- 请求地址:https://fanyi-api.baidu.com/api/trans/vip/translate
- 请求方式:get
- 请求参数:params
入参示例:
q=apple
from=auto
to=zh
appid=20190630000313415
salt=888888
sign=a9adc2d687fbacecc3b5059b9ccedc95
(5)发送请求
点击url地址栏后面的send按钮发送请求
返回结果如下:
{
"from": "en",
"to": "zh",
"trans_result": [
{
"src": "apple",
"dst": "苹果"
}
]
}
三、接口测试流程
1、接口测试分类
(1)测试外部接口
是被测系统和外部系统之间的接口(一般只需要正常调用即可)
(2)测试内部接口
是被测系统内部各个模块之间的接口
- 内部接口提供给内部系统使用(一般只需要正常调用即可)
- 内部接口提供给外部系统使用(测试必须非常全面)
2、接口测试重点
测试接口参数传递的正确性,接口功能的正确性以及各种异常情况下系统的容错能力、接口的权限控制、接口的兼容性
3、接口测试流程
(1)拿到api接口文档(可以找开发拿,也可以抓包自己创建,也可以录制后自己创建),熟悉接口文档业务、接口地址、接口鉴权(鉴定是否有访问接口的权限)方式、接口入参、出参、是否有完善的错误码机制
(2)编写接口测试用例
正例:输入正常的入参,接口能够正常返回(get/post)
反例:
- 鉴权反例:必填、错误的鉴权码、鉴权码已过期......
- 参数反例:必填,参数类型异常、参数长度异常......
- 错误码反例
- 其他场景:黑名单、接口调用次数限制、分页场景
- 接口的兼容性:一个接口是否能兼容多个版本的前端
(3)使用接口测试工具postman/jmeter/apifox执行接口测试,提供bug以及bug验证
(4)Postman+Newman+Jenkins+git实现持续集成并且生成报告
四、执行接口测试
1、postman元素含义
以上图为例,对各个元素进行拆解
(1)请求
请求有四大块组成:请求方式、请求路径、请求头、请求参数
请求方式和请求路径这里就不多做解释了
Params:get请求传参
Authorization:鉴权
Headers:请求头
- accept:客户端接收的数据类型
- content-type:客户端发送给服务器的数据类型
- user-agent:客户端的类型
- xmlhttprequest:异步请求
- ......
Body:post请求传参
- none:没有参数
- from-data:文件上传以及键值对(两种请求,可选)
- x-www-form-urlencoded:表单请求(键值对)
- raw:使用原始数据格式请求(JSON、XML、HTML、Text、JavaScript)
- binary:二进制文件上传
- GraphQL:不怎么使用,可忽略
Pre-request Script:请求之前的脚本
Tests:请求之后的脚本
Settings:设置
Cookies:Postman用于自动管理Cookie的功能
(2)响应
Body:返回的值
- Pretty:以不同的格式查看返回结果
- Raw:以文本格式查看返回结果
- Preview:以网页格式查看返回结果
Cookies:响应的Cookie
Headers:响应头
Test Results:断言的结果
(3)调试
Console:控制台,用于调试,位于界面左下角
2、实例演示
这里的实例在后续的内容描述中都会用到
(1)获取鉴权码access token接口
- 请求方式:GET
- 请求路径:https://api.weixin.qq.com/cgi-bin/token
- 请求参数:
grant_type=client_credential
appid=wx74a8627810cfa308
secret=e40a02f9d79a8097df497e6aaf93ab80
如图所示,点击send发起请求,下边为响应,即接口返回了一个token
(2)获取公众号已创建的标签接口
- 请求方式:GET
- 请求路径:https://api.weixin.qq.com/cgi-bin/tags/get
- 请求参数:
access_token=ACCESS_TOKEN
参数【access_token】取值需要从“获取鉴权码access token接口”中接口返回的值获取
注意:因为接口2用到了接口1返回的结果,因此存在接口关联的情况,也就是需要把接口1的值提取出来放在接口2的参数值中,具体内容见第五章
(3)创建标签接口
- 请求方式:POST
- 请求路径:https://api.weixin.qq.com/cgi-bin/tags/create?access_token={{token}}
- 请求参数:
json格式
{"tag":{"name":"陕西西安"}}
(4)文件上传接口
- 请求方式:POST
- 请求路径:https:///api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={{token}}
- 请求参数:
media=文件附件
返回格式如下,这里可以根据返回地址查看浏览器中上传的图片
{"url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/GXkibaAlg9h9tgVicG4UrkHUyDAvgicOPfbGkTcytsfQUsgfgh2L9jAEN8X8qEnvjOOcKRgsxoEMwH4FPWPY4y0nw\/0"}
(5)删除标签接口
- 请求方式:POST
- 请求路径:https://api.weixin.qq.com/cgi-bin/tags/delete?access_token={{token}}
- 请求参数:
{"tag":{"id":15475}}
这里的id取值也可以直接使用全局变量【tag_id】,删除新建的标签,使接口形成一个业务闭环案例
(6)编辑标签接口
- 请求方式:POST
- 请求路径:https://api.weixin.qq.com/cgi-bin/tags/get?access_token={{token}}
- 请求参数:
{
"tag": {
"id": {{tag_id}},
"name": "陕西西安{{$timestamp}}"
}
}
这里的id直接使用全局变量【tag_id】,要修改标签信息,则需要先获取到目标标签的id,这里的目标标签则是新建的标签,因此在新建标签接口请求后获取其返回结果的id作为全局变量,在编辑标签接口中调用即可
五、接口关联
1、JSON提取器
(1)取值并设置全局变量
首先获取到目标接口中的token值,将其设置为全局变量,以便别的接口能调用到该值
注意:接口返回值设置为全局变量时可以点击右边的【Set a global variable】按钮功能直接调用方法
//打印用于调试
console.log(responseBody);
//把返回的字符串转成JSON对象
var jsobj = JSON.parse(responseBody);
//取值并设置为全局变量
pm.globals.set("token", jsobj.access_token);
//console.log(jsobj.access_token);
(2)使用全局变量
在需要的接口里面通过{{token}}取得全局变量的值
{{token}}
2、正则表达式提取器
根据正则表达式获取到接口中的token值,将其设置为全局变量,其他步骤同方式1一致
//正则表达式提取器
console.log(responseBody);
//通过正则表达式匹配值(match匹配)
var datas = responseBody.match(new RegExp('"access_token":"(.*?)"'));
console.log(datas[1]);
//设置成全局变量
pm.globals.set("token",datas[1] );
六、环境变量和全局变量
全局变量:在所有的接口里面都可以访问的变量
环境变量:在当前环境里面可以访问的变量
1、环境变量
(1)设置环境变量
(2)修改请求ip地址
把所有请求中的ip地址改成获取环境变量的方式,如下图所示
{{ip}}
(3)切换环境进行测试
在postman右上角选择不同的环境即可,这里环境可选项就是在【Environments】中新建的环境
注意:不同环境中的变量必须是一致的,变量值不一致
2、全局变量
【Environments】中的Globals即为全局变量统称,点击它就会看到全局变量了,具体构建全局变量可参考第五章
七、动态参数
1、系统自带的动态参数
{{$timestamp}} //动态时间戳
{{$randomInt}} //动态0-100的整型
{{$guid}} //动态的guid字符串
2、自定义动态参数
//自定义动态参数生成随机数
var times = Date.now();
pm.globals.set("times", times);
//定时5秒再执行
const sleep = (milliseconds) => {
const start = Date.now();
while(Date.now() <= start + milliseconds) {}
};
sleep(5000);
八、Postman业务闭环用例
我们以第四章的实例来做讲解
一个完整的接口业务闭环案例如下步骤:
- 获取鉴权码
- 新建标签
- 编辑标签
- 查询标签
- 删除标签
1、实例介绍
拿到鉴权码,新建标签后,获取新建的标签id,根据该id对标签进行修改,修改后全量查询标签,接着再根据id删除该标签,这样就形成了一个完整的闭环
2、效果图展示
各个接口详图展示如下,仅作参考(与第四章的实例构建差别不大,这里不清晰的话可以返回上面根据请求路径自己创建)
(1)获取鉴权码
(2)新建标签
(3)编辑标签
(4)查询标签
(5)删除标签
九、断言
1、断言定义
所谓断言,就是对返回的响应结果,做正误判断,如果结果符合设定的预期则判定为pass,如果结果与预期不符则判定为fail。
断言主要是在Test操作框内进行设置,使用JavaScript语言编写,断言的结果在下方响应内容的TestResult内。
2、常见断言
- Status code:Code is 200----------------------------------检查返回的状态码是否为200
- Response body:Contains string-------------------------检查返回的数据中包括有指定的字符串
- Response body:JSON value check---------------------检查json中的其中一个字段的值
- Response body:Is equal to a string---------------------检查返回的值等于一个指定的字符串
- Response headers:Content-Type header check----检查是否包含响应头Content-Type
- Response time id less than 200ms----------------------检查请求耗时小于200ms
- Status code:Successful POST request-----------------检查返回的状态码是否在数组中
- Status code:Code name has string----------------------检查状态信息是指定的字符串
有背景底色的为常用断言
3、八种断言写法
//--------------------断言---获取鉴权码access token接口---
pm.test("检查返回状态码为200", function () {
pm.response.to.have.status(200);
});
pm.test("检查返回的结果中包含指令字符串", function () {
pm.expect(pm.response.text()).to.include("access_token");
});
pm.test("检查json中其中一个字段的值", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.字段名).to.eql(7200);
});
//-----------在编辑标签接口中加的断言-----------------------------
pm.test("检查返回的值等于一个指定的字符串", function () {
pm.response.to.have.body('{"errcode":0,"errmsg":"ok"}');
});
//--------------------------------------------------------------
pm.test("检查是否包含响应头Content-Type", function () {
pm.response.to.have.header("Content-Type");
});
pm.test("检查请求耗时小于300ms", function () {
pm.expect(pm.response.responseTime).to.be.below(300);
});
pm.test("检查返回的状态码是否在数组中", function () {
pm.expect(pm.response.code).to.be.oneOf([200, 202]);
});
pm.test("检查状态信息是指定的字符串", function () {
pm.response.to.have.status("OK");
});
4、常用断言应用
(1)Status code:Code is 200
在创建标签接口中加检查返回的状态码的断言,断言即在请求之后,如下图所示:
//状态断言
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
(2)Response body:Contains string
检查返回的数据中是否包含指定的字符串,创建标签接口返回的结果中包含id和name,其中name为字符串格式,因此我们可以给该接口加断言
//检查返回结果是否包含指定字符串
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("陕西西安"+pm.globals.get("times"));
});
注意:这里获取到的随机数【times】是因为设置了前置脚本-自定义动态参数,因此断言中可以获取到接口返回结果中文后的随机数
//自定义动态参数生成随机数
var times = Date.now();
pm.globals.set("times", times);
5、断言随机数
一旦需要断言随机数,那么必须使用自定义动态参数
注意事项:
- 在断言中不能使用【{{}}】的方式取全局变量,要通过【pm.globals.get("times")】方式获取全局变量
- 在断言中取数据文件的值,不能使用【pm.globals.get("times")】方式,需要使用【文件名.文件字段名】
十、postman批量运行测试用例
在自己创建的collection集合右上角点击【Run collection】,打开批量执行窗口,设置执行次数以及间隔时长,点击执行
十一、postman的参数化(CSV、JSON)
1、适用场景
当一个接口需要测试多个场景用例:正向用例、反向异常用例,可以使用数据驱动的形式实现
2、接口信息
以【获取鉴权码access token接口】为例,该接口有三个必传参数:grant_type、appid、secret
3、接口用例设计
正向用例 | 反向用例 |
grant_type、appid、secret必填 | grant_type无值,appid、secret必填 |
grant_type、secret必填,appid无值 | |
grant_type、appid必填,secret无值 |
4、数据驱动实现(参数化)
(1)data.csv文件设置
grant_type | appid | secret |
client_credential | wx74a8627810cfa308 | e40a02f9d79a8097df497e6aaf93ab80 |
wx74a8627810cfa308 | e40a02f9d79a8097df497e6aaf93ab80 | |
client_credential | e40a02f9d79a8097df497e6aaf93ab80 | |
client_credential | wx74a8627810cfa308 |
(2)data.json文件设置
[
{"grant_type":"client_credential","appid":"wx74a8627810cfa308","secret":"e40a02f9d79a8097df497e6aaf93ab80"},
{"grant_type":"","appid":"wx74a8627810cfa308","secret":"e40a02f9d79a8097df497e6aaf93ab80"},
{"grant_type":"client_credential","appid":"","secret":"e40a02f9d79a8097df497e6aaf93ab80"},
{"grant_type":"client_credential","appid":"wx74a8627810cfa308","secret":""},
]
(3)接口传参设置
变量名与文件中的变量名一致,变量值直接调用全局变量(文件中的变量都默认为全局变量)
(4)批量执行用例
在自己创建的collection集合右上角点击【Run collection】,打开批量执行窗口,选择csv或者json文件,选择后会自动带入执行次数,再勾选要测试的接口,点击执行
(5)执行结果
正例测试通过,反例发送请求时报错
十二、Cookie鉴权
1、cookie定义
存储在客户端的一小段文本信息,格式为键值对的形式
2、cookie查找
以下面的网页为例,打开谷歌浏览器,右键点击检查【F12】,查看界面cookie
3、cookie分类
(1)会话Cookie
保存在内存,当浏览器关闭之后会自动删除cookie
(2)持久Cookie
保存在磁盘,当浏览器关闭之后不会清除,只有在失效时间到了之后才会清除
注意:Cookie的值是在服务端设置,在客户端存储,可以设置Cookie的失效时间
4、Cookie的鉴权原理
(1)当客户端第一次访问服务器的时候,服务器就会生成Cookie信息,并且通过响应里的Set-Cookie将Cookie值传输给客户端,客户端接收并自动存储Cookie值。
(2)当客户端第二次访问服务器的时候,客户端就会自动读取本地的cookie,然后根据主机IP或者域名添加对应的cookie,从而实现鉴权
5、Postman实现Cookie鉴权
Postman会自动完成cookie鉴权,无需手动完成。
获取cookie以后,postman发请求不用自己手动添加cookie,他会自动帮我们填写cookie在请求头上
十三、Mock测试
1、Mock定义
Mock是一种比较特殊的测试技巧,可以在没有依赖项的情况下进行接口或单元测试,通常情况下,Mock与其他方法的区别是,用于模拟代码依赖对象,并允许设置对应的期望值
2、Mock目的
因项目中任务的不同分工,会出现每个人的任务进度不一样的情况,就会出现模块A开发完成,但其依赖项模块B还未完成,这时候如果进行集成测试时,就会出现两个模块无法有效完成工作。针对这种情况,Mock服务便应运而生。Postman中的Mock服务器可以减轻团队开发中这种不同步的情况。
3、Mock意义
在API开发的前期,构建Mock集合可以帮助团队之间进行清晰有效沟通,并尽快就预期结果达成一致,在实际开发过程中,所有人员可以同步并行工作,减少因相互依赖而导致延期的风险
4、Mock应用场景
- 前后端联调
- 调用第三方接口测试错误场景
- demo演示
5、Mock服务
Mock不是一个真实的服务,仅是一个被伪装成真实服务的假服务,通过Mock,可以测试我们API并检验结果是否正确。
Postman可以创建两种类型的Mock服务
- 私有Mock:私有Mock服务需要在请求头中添加Postman API key,如X-Api-Key:postman API key
- 公有Mock:公有Mock服务可以被任何人访问,在使用过程中不需要添加Postman API key
6、Postman创建Mock服务
(1)点击左侧图标【Mock Servers】,点击【Create Mock Server】,在右侧填写相应的Mock服务器参数,并点击【Next】,如下所示
(2)填写Mock服务器的相关信息并点击【Create Mock Server】
(3)在创建Mock Server成功后,会出现如下界面
7、Postman访问Mock服务
不需要做任何配置,创建Mock服务后,postman会自动创建集合以及环境变量,直接发送请求即可(切换至Collections,发送请求)
(1)GET请求Mock示例
(2)POST请求Mock示例
十四、处理加/解密接口
1、市面上加密技术
(1)对称式加密:DES,AES,Base64加密
(2)非对称式加密:RSA加密 (BEJSON网址可用)
非对称式加密也叫双钥加密(公钥和私钥【公钥加密,私钥解密】/【私钥加密,公钥解密】)
(3)只加密不解密:MD5,SHA1,SHA3
(4)混合加密(自定义加密方式):使用多种加密方式
(5)接口签名Sign
2、案例应用
这里以一个简单的用户登录接口为例,讲解如何测试加/解密,接口文档中有描述用哪种加密技术(这里是我的本地接口,想要实操的小伙伴可以自己搭建)
(1)新建用户接口
- 请求方式:POST
- 请求路径:http://127.0.0.1:8787/dar/user/login
- 请求参数:user_name、passwd
(2)用户名密码进行加密
在前置脚本中使用Base64位进行加密,分别对入参【user_name和passwd】取值进行加密
//Base64位加密
//把需要加密的值转换成utf-8的编码格式
var us = CryptoJS.enc.Utf8.parse("test01");
var pw = CryptoJS.enc.Utf8.parse("admin123");
//对转换后的值做Base64加密
var bs64_us = CryptoJS.enc.Base64.stringify(us);
var bs64_pw = CryptoJS.enc.Base64.stringify(pw);
//设置为全局变量
pm.globals.set("bs64_us", bs64_us.toString().toUpperCase());
pm.globals.set("bs64_pw", bs64_us.toString().toUpperCase());
(3)发起请求
如图所示,用户登录成功
十五、Newman工具介绍
Newman 是一款基于Node.js开发的,专为 postman 而生的命令行工具,通过命令行执行
通过 Newman 执行脚本,可以在 Jenkins 上实现 postman 接口测试持续集成,是一种非常简单方便进行接口测试的方法
1、工具安装
(1)安装Node.js
下载地址:下载 | Node.js 中文网 (nodejs.cn)
下载后一路next ,安装后,打开cmd,输入node -v ,看到输出node的版本信息,即代表安装成功,环境变量设置也正确
注意:安装的时候多等待一会,不要着急点击取消
(2)安装newman
点击【win+R】,输入cmd打开命令行,直接在命令行输入安装命令即可安装
//安装命令
npm install -g newman
验证是否安装成功
//验证命令
newman -v
newman安装报错
安装newman时如果遇到了如下报错,CERT_HAS_EXPIRED是一个由Node.js和npm抛出的错误,表示你正在尝试访问的服务器的SSL证书已经过期
解决办法:
1、清除npm缓存
npm cache clean --force
2、取消ssl验证:
npm config set strict-ssl false
3、再进行安装(1)正常安装:
npm install -g newman
(2)npm镜像源安装:
npm install -g newman --registry=https://registry.npm.taobao.org
如果上面的步骤还是安装失败的话,再试试更换镜像源
npm config set registry http://registry.cnpmjs.org
npm config set registry http://registry.npm.taobao.org
(3)安装newman-reporter-html
使用命令安装 html 报告模板,方便查看测试用例执行结果
//安装html报告模板
npm install -g newman-reporter-html
2、导出postman案例脚本
这里需要导出接口用例、环境变量以及全局变量三部分内容
(1)接口案例导出
(2)环境变量导出
(3)全局变量导出
(4)导出结果
导出文件都为json格式,这里要注意的是,文件命名不要用中文命名
3、newman执行测试
(1)newman参数设置
参数 | 用法 |
-e | – environment 后面跟环境变量文件 |
-g | – global 后面跟全局变量文件 |
-n | – iteration-count 后面跟迭代次数 |
-d | – iteration-data 指定用于迭代的数据源文件 |
-r | – reporters 后面跟数据结果 |
html | 将结果生成为html文件,指定生成到具体目录需要配合 --reporter-html-export 文件名 使用 |
(2)newman启动测试
使用指令newman run xxx.postman_collection.json 即可启动测试,我这里以上边的导出文件做示例,输入指令:
newman run "e:\\newmans\\yongli.json" -e "e:\\newmans\\huanjing.json" -g "e:\\newmans\\quanju.json"
(3)newman生成测试报告
输入指令后生成测试报告【report.html】
newman run "e:\\newmans\\yongli.json" -e "e:\\newmans\\huanjing.json" -g "e:\\newmans\\quanju.json" -r cli,html,json,junit --reporter-html-export "e:\\newmans\\report.html"
面试题
1、GET请求和POST请求的区别是什么?
答:
(1)GET请求一般用于获取数据,POST请求一般用于提交数据
(2)传参的方式不一样
# GET请求在接口地址里面以【?】的方式传参,多个参数之间用【&】分隔
# POST是在body当中传参
(3)POST请求比GET请求安全
(4)GET请求只发一个数据报文,POST请求发送两个数据报文
更多推荐
所有评论(0)