3.postman高级用法
# postman高级用法
(1).用例管理
(2).postman断言
(3).全局变量与环境变量
(4).请求前置脚本
(5).请求关联
(6).用例批量执行
(7).读取外部文件实现参数化
(8).测试报告产出
1.用例管理
在测试活动中, 针对需求和接口文档进行用例设计时, 我们会发现针对一个需求或一个接口要考虑多种情况, 设计的用例要尽量覆盖需求. 在接口测试中, 如果使用工具(postman, Jmeter)实现, 需要对用例进行管理.
postman具有用例管理的功能, 具体的实现步骤如下:
1. 创建测试集-<New Collection>
Collection可以理解成一个项目(系统),包含多个接口请求
2. 创建目录-<Add Folder>
Folder可以理解成一个项目模块
3. 添加请求-<Add Request>
具体操作步骤及截图如下:
(1).创建测试集- 点击‘New Collection’,在弹出框中输入测试集的名称和其他信息,再点击‘Create’按钮
(2).创建目录- 在测试集上点击右键选择‘Add Folder’,在弹出框中输入目录的名称和其他信息,再点击‘Create’按 钮
(3).添加请求- 在目录上点击右键选择‘Add Request’,在弹出框中输入请求的名称和其他信息,再点击保存按钮
2.Postman断言
断言, 是让程序判断预期结果与实际结果是否一致的. python中有断言的语法, postman中也可以实现断言. 先看python的实现吧!
2.1 python中断言
# 断言:
python中的断言使用assert来实现, 其语法形式为: assert 表达式, '断言信息'
如果断言通过, 则继续执行断言以下的代码. 如果断言未通过, 则程序直接抛出异常, 异常名称为: AssertionError, 异常信息为: 断言信息, 如未指定断言信息, 则不显示断言信息.
# 示例1: 断言不指定断言信息
def func(a):
assert a == 1
func(2)
# 结果为:
/Users/jeremy/.virtualenvs/h2005/bin/python /Users/jeremy/MyData/edu/code/demo2.py
Traceback (most recent call last):
File "/Users/jeremy/MyData/edu/code/demo2.py", line 104, in <module>
func(2)
File "/Users/jeremy/MyData/edu/code/demo2.py", line 97, in func
assert a == 1
AssertionError
# 示例2: 断言指定断言信息
def func(a):
assert a == 1, '断言未通过'
func(2)
# 结果为:
/Users/jeremy/.virtualenvs/h2005/bin/python /Users/jeremy/MyData/edu/code/demo2.py
Traceback (most recent call last):
File "/Users/jeremy/MyData/edu/code/demo2.py", line 104, in <module>
func(2)
File "/Users/jeremy/MyData/edu/code/demo2.py", line 97, in func
assert a == 1, '断言未通过'
AssertionError: 断言未通过
# 示例3: 断言配合异常处理使用, 尝试执行断言, 如果断言通过则执行断言以下代码, 如果断言未通过, 则直接抛出的异常会被except捕获, 执行except代码. 注意: 此过程由于异常处理的原因, 断言没有机会将异常抛给用户而被except捕捉, 所以断言信息是没有机会显示的.
def func(a):
try:
assert a == 1,
print('pass, 用例通过!')
except:
print('fail, 接口存在问题!')
func(2)
# 结果为:
'fail, 接口存在问题!'
2.2 常用postman断言特点与简单使用
# postman断言特点:
(1).Postman的断言是使用JavaScript语言编写的,写在‘Tests’标签页里
(2).Tests中的脚本在发送请求之后执行,会把断言的结果(PASS/FAIL)最终在‘Test Results’标签页中展示
简单使用:
2.3 postman常用断言
# 注意:
1.断言响应状态码是否为200(重点掌握)
2.断言响应体JSON数据校验(重点掌握)
3.断言响应体是否包含指定字符串
4.断言响应体是否等于指定字符串
5.断言响应头是否包含指定的头信息
# 断言代码片段介绍(不用背下来, 但是你需要在postman中能够找到, 你看别人的断言能看董)
1. 判断响应状态码是否等于200 (*****)
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
2. 判断响应体中是否包含指定的字符串 (****)
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search"); });
3. 判断响应体数据是否等于指定的字符串 (***)
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
4. 校验响应的JSON数据 (*****)
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.mesage).to.eql("ok");
});
5. 判断响应头中是否包含指定的头标签
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
2.4 排错技巧
当你的断言出现错误时, 需要进行排错, 可以按照以下套路进行:
# 1.检查断言代码片段是否错选了
当断言出现错误时, 我们应首先确定自己的断言代码片段是否是正确的, 比如要判断json数据某个键的值是否包含另一个值, 但却选择了等于.
# 2.检查断言代码是否设置了错误的字段
断言中对结果的判断要根据响应数据的形式进行严格的比对, 不细心很可能出现错误. 比如: json数据中的一个键名为data, 在编写断言代码的过程中却写成了date
# 3.发送请求, 基于响应数据做初步预判
断言是对接口响应数据的检验, 那断言可定是在请求发送后执行的. 所以当断言出现错误, 这是你一定已经发送了请求, 我们可以打开响应数据进行对比, 来判断断言的执行结果是否存在问题.
# 4.检查请求相关参数
在构造请求时, 可能请求出现了错误, 比如请求方式为post, 但默认为get, 却忘记修改, 当发送请求后获取到的响应数据肯定不是预期的结果, 这时断言就会出错. 应当仔细检查请求的正确性. 请求的正确性可以从以下这几个方面考虑->(请求方法, 请求地址, 请求头信息, 请求体)
# 注意:
当断言出现错误, 经过一系列的排查依然不行, 该怎么办呢? 这是我们可以保存原有断言错误的请求, 重新建立请求, 不要受前一个请求的思维影响, 一步一步的构建请求, 再次尝试.
3.postman设置环境变量
3.1 环境变量与全局变量
全局变量: 作用范围是针对postman下面所有测试集均生效
环境变量:
- 只对选择了对应环境变量的测试集生效
- 环境一般分为: 开发环境, 测试环境, 生产/线上环境(部分公司可能在测试与生产之间存在预生产环境)
- 一套环境中变量不能重复, 但是可以定义多个不重复的变量
3.2 手动设置全局变量与环境变量
(1).全局变量
(2).环境变量
3.3 代码设置全局变量与环境变量
# 在Tests中编写如下代码实现变量的设置, 需要发送请求
# (1).全局变量的设置
pm.globals.set("variable_key", "variable_value");
# (2).环境变量的设置
pm.environment.set("variable_key", "variable_value");
# 注意: 通过代码实现环境变量的添加, 需要先选中一个环境, 才能设置成功.
3.4 变量的使用
无论在URL中, 还是在请求头中, 或是在请求体中都可以使用{{variable}}的方式使用变量, 但需要注意的是请求体中传递JSON数据一般我们会给实际的值加引号, 比如一个字符串. 但在使用变量时, 不要给{{variable}}添加引号, 否则postman会将“{{variable}}”当做一个字符串.
使用代码获取:
// 获取全局变量
var value = pm.globals.get("var_name");
// 获取环境变量
var value = pm.environment.get("var_name");
4.请求前置脚本
4.1 请求前置脚本实现与场景
// 请求前置脚本
请求前置脚本就是在请求发送前执行的脚本, 请求前置脚本需要写在“Pre-request Script”标签中.
应用场景:
- 请求参数中包含一个随机数或者时间戳
- 请求之前需要对请求参数做进一步处理(如:对敏感参数进行加密)
4.2 请求前置脚本案例
//需求:
请求TPshop项目中获取图片验证码的接口,需要在URL中设置随机数
// 请求路径:
http://localhost/index.php?m=Home&c=User&a=verify&r=0.6569606479434671
// 分析:
- 在请求图片验证码前, 执行生成随机数的脚本: var r = Math.random();
- 将生成的随机数保存至环境变量中
- 请求图片验证码接口是从环境变量中取出随机数, 作为参数传递给服务器
5.接口关联
5.1 接口关联
当请求之间有依赖关系, 比如一个请求的入参是另一个请求返回的数据, 这时候需要用到关联处理.
5.2 接口关联的思路
- 要获取某个请求的响应结果, 可以通过在Tests标签页中编写JavaScript脚本来实现
// 获取json格式的响应数据
var jsonData = pm.response.json();
- 多个请求之间可以使用全局变量或环境变量来传递数据
// 把数据保存到全局变量中
pm.globals.set("token", token)
- 获取某个全局变量的值:
// 非代码形式获取:
{{variable}}
// 代码形式获取:
pm.globals.get("variablename")
5.3 接口关联案例
(1).请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html
(2).获取返回结果中的城市名称
(3).调用百度搜索接口: http://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
// 实现思路
(1).postman访问天气接口, 在Tests中编写脚本:
- 先获取接口的响应数据, 转化为json数据格式
- 从json数据中取出city的值
- 将city的值设置为全局变量
(2).访问百度查询接口, 将关键词设置为上一个请求添加的环境变量的值
// 脚本
var jsonData = pm.response.json();
var city = jsonData.weatherinfo.city;
console.log("city为: + city);
pm.globals.set("city", city);
// 百度查询URL
http://www.baidu.com/s?wd={{city}}
6.批量执行测试用例
要想批量执行测试用例,需要先把接口请求添加到测试集中,通过运行测试集的方式就可以实现批量运行测试用例。
// 实现:
(1).创建测试集
(2).在测试几种添加接口请求
(3).运行测试集(实现测试集中多接口用例批量执行)
7.读取外部文件实现参数化
7.1 参数化应用场景
// 应用场景:
针对于某个接口,如果有大量的测试数据需要批量验证,可以把测试数据保存到数据文件中,通过参数化的方式来实现。
7.2 案例实现
// 需求: 批量查询手机号归属地和所属运营商信息,并校验运营商数据是否正确
// 接口: http://cx.shouji.360.cn/phonearea.php?number=13012345678
# 实现步骤分析:
- 定义数据文件: CSV文件 or JSON文件
- 定义接口请求, 注意此时接口中的number的值不可写死, 应使用变量
- 在Tests中定义断言脚本
- 发送请求时选择数据文件
- 执行请求
8.报告生成
8.1 环境搭建
Newman是一款基于nodejs开发的可以运行Postman脚本的工具,并可以生成测试报告. 其环境搭建如下:
# 1.nodejs环境准备
(1).下载nodejs: http://nodejs.cn/download/
(2).安装nodejs, 并配置环境变量
# 2.安装Newman
(1).命令行安装newman及检验:
- 安装: npm install -g newman
- 检验: newman -v
注意: 如果报错执行: npm config set strict-ssl false
(2).命令行安装new-reporter-html: npm install -g newman-reporter-html
8.2 报告生成实现
# 生成报告实现步骤
(1).导出测试集
(2).执行测试, 打开命令行窗口:
newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export 测试报告存储路径
# 参数说明:
run xxx.json:表示要执行的postman脚本,即导出的测试集数据
-e source:用来指定环境变量文件的路径
-d source:用来指定测试数据文件的路径
-r html:用来指定生成的数据结果的类型,如json、html等
--reporter-html-export source:指定html报告生成的路径;如果不设置该参数,则会在当前目录下生成一个名字为newman的文件夹
8.3 实现案例
# 需求:
1.创建测试集h2007b
2.在测试集中创建两个请求
(1).一个请求天气接口
(2).另一个请求使用百度搜索接口搜索上一个天气查询接口的城市名称
# 实现思路
1.创建测试集:h2007b
2.创建天气查询接口
- 请求方式: GET
- 请求地址: http://www.weather.com.cn/data/sk/101010100.html
- 请求后置脚本, 从将响应数据转换为JSON数据, 再取出城市信息设置为全局变量: "city" --> city:
var jsonData = pm.response.json();
var city = jsonData.weatherinfo.city;
pm.globals.set("city", city);
3.创建百度查询接口:
- 请求方式: GET
- 请求地址: http://www.baidu.com/s?wd=城市名称, 城市名称使用全局变量的city
4.导出测试集
5.运行命令生成报告
newman run h2007b.postman_collection.json -r html --reporter-html-export reporter.html