本文大纲截图:
一、Postman简介和安装【看到最后有...】
简介: Postman 是一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用,开发人员也经常使用。
-
特征:
-
1)简单易用的图形用户界面
-
2)可以保存接口请求的历史记录
-
3)使用测试集 Collections 可以更有效的管理组织接口
-
4)可以在团队之间同步接口数据
-
-
安装:
-
桌面应用下载
https://www.postman.com/downloads/
(傻瓜式安装,过程略)
-
二、Postman高级用法
1、管理测试用例
-
创建 collections(用例集)
-
创建子目录
-
创建请求
-
用例集导出(Export)导入(Import)
2、全局变量和环境变量
全局变量:
-
定义:在 Postman 全部生效的变量,全局唯一。不可重复定义的变量。命名可以为:glb_名称。
-
设置:
-
代码设置格式:
pm.globals.set("全局变量名", 全局变量值)
-
示例:
pm.globals.set("glb_age, 100)
-
-
获取:
-
代码获取格式:
var 接收值的变量 = pm.globals.get("全局变量名")
-
示例:
var ret = pm.globals.get("glb_age")
,即ret的值为100 -
请求参数获取(postman界面获取):
{{全局变量名}}
-
示例:
{{glb_age}}
-
环境变量:
-
定义:在特定环境(生产环境、开发环境、测试环境)下,生效的变量,在本环境内唯一。)命名可以为:env_名称。
-
注意:
-
1)一个变量只能属于某个环境,在某一个环境中变量不可重复定义
-
2)在环境与环境之间可以重复的变量
-
3)一个环境可以包含多个环境变量
-
4)常见环境分类:开发环境、测试环境、生产环境
-
-
设置:
-
代码设置格式:
pm.environment.set("环境变量名", 环境变量值)
-
示例:
pm.environment.set("env_age", 99)
-
-
获取:
-
代码获取格式:
var 接收值的变量 = pm.environment.get("环境变量名")
-
示例:
var ret = pm.environment.get("env_age")
,即 ret的值为99 -
请求参数获取(postman界面获取):
{{环境变量名}}
-
示例:
{{env_age}}
-
3、请求前置脚本
介绍: 在send按钮点击后,请求前置脚本代码第一时间被执行。即在 postman 内部实际http请求之前。
假设场景: 调某接口时,要输入“时间戳”,如果输入的“时间戳”的绝对值,超过标准时间10分钟,则不允许调用。
时间戳: 对应绝对时间,从1970年1月1日 00:00:00 到现在 所经历的秒数。一天为86400秒,则距现在为51年6月9天,即1624665600秒。
案例: 调用百度首页接口,传时间戳给服务器
实现步骤:
-
1)在 Pre-request Script 标签页中,添加代码。拿到时间戳,写入全局变量
-
拿到时间戳:
var timestamp = new Date().getTime()
-
将时间戳设置到 全局变量:
pm.globals.set("glb_timestamp", timestamp)
-
-
2)点击 Send 按钮,发送请求,请求发送前执行上述代码,写入全局变量
-
3)查看写入的变量
-
4)在请求参数(界面)中,使用全局变量:
{{全局变量名}}
-
5)在 postman 的控制台,查看发送的 http 请求
postman 前置脚本工作原理:
-
postman 界面:
-
组织http请求:方法、url、头、体
-
在
Test
中添加断言代码 -
在
Pre-request Script
中添加请求前置脚本 -
在
Test Results
(或Tests
) 中查看断言结果 -
Send 发送给 postman 内部
-
-
postman 内部:
-
解析请求前置脚本代码
set glb_timestamp
全局变量{{glb_timestamp}}
-
分析 http请求方法、url、头、体 ......
-
执行断言代码,得到断言结果
-
-
服务器:
-
解析 http请求
-
回发http响应
-
4、关联
介绍: 应用于多个http请求之间,有数据关联、或依赖关系时。
实现步骤: A接口依赖B接口的数据
-
1)向B接口发送http请求,获取数据
-
2)将数据设置至全局变量(环境变量)中
-
3)A接口获取全局变量(环境变量)中数据值,进行使用
案例: 请求获取天气接口,提取响应结果中的城市,将城市名给百度搜索接口使用。
实现步骤:
-
1)创建用例集,分别创建查询天气请求和百度搜索的请求
-
2)在查询天气请求Tests中,编写代码获取城市名,写入全局变量
-
获取全部响应结果:
var jsonData = pm.response.json()
-
从响应结果中获取城市名:
var city = jsonData.weatherinfo.city
-
将城市名写入到全局变量:
pm.globals.set("glb_city", city)
-
-
3)点击 Send按钮,发送请求,查看设置的全局变量。
-
4)修改 百度搜索请求,使用全局变量,按城市名进行搜索:
http://www.baidu.com/s?wd={{glb_city}}
5、断言
简介: postman 断言借助 JavaScript-js
语言编写代码,写在 Tests
标签页里,自动判断预期结果与实际结果是否一致。
postman 断言工作原理:
-
postman 界面:
-
组织http请求:方法、url、头、体
-
在 Test 中添加断言代码
-
在 Test Results(或Tests) 中查看断言结果
-
Send 发送给 postman 内部
-
-
postman 内部:
-
分析 http请求方法、url、头、体 ......
-
执行断言代码,得到断言结果
-
-
服务器:
-
解析 http请求
-
回发http响应
-
postman常用断言:
-
Status code:Code is 200:断言响应状态码
-
Response body:Contains string:断言响应体是否包含某个字符串
-
Response body:Is equal to a string:断言响应体是否等于某个字符串(对象)
-
Response body:JSON value check:断言 JSON 数据
-
Response headers:Content-Type header check:断言响应头
1、断言响应状态码
名称: Status code: Code is 200
步骤:
-
1)在 Tests 标签中,选中 Status code: Code is 200,生成对应码
-
2)适当调整 test() 方法参数1,和 匿名函数中的预期结果
-
3)点击 send 按钮,发送请求,执行断言代码
-
4)查看断言结果
示例:断言响应状态码是否为200
-
代码格式一:
pm.test("Status code is 200", function () { pm.response.to.have.status(200); });
-
pm
:代表 postman 的一个实例 -
test()
:是pm实例的一个方法。有两个参数: -
参数1:在断言成功后,给出的文字提示。可以修改。如:"
Status code is 200
" -
参数2:匿名函数
function ()
。pm.response.to.have.status(200):postman
的响应结果中应该包含状态码 200。200 ——> 预期结果!
-
-
代码格式二:
tests["Status code is 200"] = responseCode.code === 200;
2、断言响应体是否包含某个字符串
名称: Response body: Contains string
示例:断言响应体包含指定字符串
-
代码格式一:
pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); });
-
pm
:postman的一个实例 -
test()
: postman实例的方法,有两个参数 -
参1:断言后显示的文字提示信息,可改。
-
参2:匿名函数:
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
// 意思:pm 期望 响应文本 中,包含 xxxx 字符串。"string_you_want_to_search"
——> 预期结果。可以修改
-
-
代码格式二:
tests["Body matches string"] = responseBody.has("string_you_want_to_search");
-
示例:
tests["断言响应体包含“操作成功”"] = responseBody.has("操作成功!");
-
3、断言响应体是否等于某个字符串(对象)
名称: Response body: Is equal to a string
示例:断言响应体等于某个字符串(对象)
-
代码格式一:
pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); });
-
pm.response.to.have.body("response_body_string");
// 意思是,pm的响应中应该有 响应体xxx;"response_body_string"
——> 预期结果。可以修改。
-
-
代码格式二:
tests["Body is correct"] = responseBody === "response_body_string";
4、断言 JSON 数据
名称: Response body:JSON value check
示例:断言json的响应结果
-
代码格式一:
-
pm.test("Your test name", function () { var jsonData = pm.response.json();
-
pm.expect(jsonData.value).to.eql(100); });
-
参数说明:
var jsonData = pm.response.json();
中var jsonData
是用js语法定义一个变量名为jsonData
的变量。pm.response.json()
代表响应的json结果。 -
示例1:
-
pm.test("断言响应结果success的值为true", function () { var jsonData = pm.response.json();
-
pm.expect(jsonData.success).to.eql(true); });
-
示例2:
-
pm.test("断言响应结果code的值为10000", function () {:var jsonData = pm.response.json();
-
pm.expect(jsonData.code).to.eql(10000); });
-
示例3:
-
pm.test("断言响应结果message的值为 操作成功!", function () { var jsonData = pm.response.json();
-
pm.expect(jsonData.message).to.eql("操作成功!"); });
-
代码格式二:
-
var jsonData = JSON.parse(responseBody);
-
tests["Your test name"] = jsonData.value === 100;
-
示例:
-
var jsonData = JSON.parse(responseBody);
-
tests["断言相应结果success的值为true"] = jsonData.value === true;
5、断言响应头
名称: Response headers: Content-Type header check
示例:断言响应头
-
代码格式一:
-
pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); });
-
pm.response.to.have.header("Content-Type");
-
// pm的响应头中包含Content-Type
-
示例:可以在header中,添加响应头中的key对应的value判定;用,隔分。
pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type", "application/json;charset=UTF-8");});
-
代码格式二:
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type");
-
示例:
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type","application/json;charset=UTF-8");
6、数据驱动
当http请求,使用的 数据有较高相似度,相同的请求时,考虑使用参数化(将数据组织到数据文件中)。
数据文件简介: CSV、JSON
CSV:
-
优点:数据组织形式简单,适用于大量数据的场合
-
缺点:
-
1)不支持bool类型数据(数据被postman读入后,自动添加“”包裹bool值)
-
2)不支持多参、少参、无参、错误参数的接口测试
-
3)不支持复杂数据类型(如:嵌套字典、列表等)
-
JSON:
-
优点:
-
1)支持bool类型
-
2)支持多参、少参、无参、错误参数
-
3)支持复杂数据类型
-
-
缺点:对于相同数据量,json数据文件大小远大于CSV文件
导入外部数据文件: CSV文件、JSON文件
CSV文件:
-
1、创建 xx.csv 文件
-
2、将数据写入到 csv 文件中
-
第一行:写入的是数据对应的“字段名”
-
从第二行向后依次是对应的数值,数据间用英文逗号隔开。
-
-
3、在 Postman 中,选中使用数据文件的用例集,导入数据文件
-
1)点击用例集名称,使用Run按钮,进入“
Runner
”页面 -
2)使用“
Select File
”按钮选择 xx.csv文件 -
3)点击预览(
Preview
)按钮,校验数据文件是否正确
-
JSON文件:
-
1、创建 xx.json 数据文件
-
2、在数据文件中,按json语法写入json数据。postman要求,json格式的数据文件,数据内容的最外层,必须是
[ ]
。内容所有的数据用{}
存储。(建议:使用json.cn在线网站编写) -
3、在 Postman 中,选中使用数据文件的用例集,导入数据文件
-
1)点击用例集名称,使用Run按钮,进入“
Runner
”页面 -
2)使用“
Select File
”按钮选择xx.json
文件 -
3)点击 预览(
Preview
)按钮,校验数据文件是否正确
-
读取数据文件数据:
根据使用数据位置不同,有两种获取数据文件中数据的方法。
第一种: 请求参数(请求行、请求头、请求体)中,使用数据文件中的数据
-
使用
{{}}
包裹csv文件 字段名或json文件中的key -
如:
{{username}}
或{{password}}
第二种: 代码(断言、请求前置脚本)中,使用数据文件中的数据
-
需要借助 postman 提供的关键字
data
点csv文件的字段名或json文件的key -
如:
data.username
或data.password
特性:
-
1)postman会循环一行一行的读取{}中的数据
-
2)postman会自动给所有非数值数据,添加
""
进行包裹。建议书写json数据时,无论是不是字符串,都可以用""
包裹value的值
案例:
-
需求:批量查询手机号归属地、所属运营商,校验运营商数据正确性
-
接口:
http://cx.shouji.360.cn/phonearea.php?number=13012345678
-
测试数据:
-
手机号:
13012345678
运营商:联通 -
手机号:
13800001111
运营商:移动 -
手机号:
18966778899
运营商:电信
-
-
步骤:
-
1)测试单个接口,工作中 参数和响应体数据对应关系。
-
2)写好数据文件,按csv或json对应语法的语法格式组织数据
-
3)替换上述用例中的两处:归属地:在代码中,用
data.字段名
替换;手机号:在查询参数中,用{{字段名}}
替换 -
4)强调:一旦替换完成,Send就不再能正常获取 相应数据。(数据必须从数据文件中读取,才能正常发送请求,Send不具备读取数据文件的功能)
-
5)选择使用数据文件的用例集,进入Runner页面,导入数据文件,运行。
-
6)如果有异常,借助postman的控制台查看。
-
-
小结:借助数据文件,实现“数据驱动”。——有多少条数据,对应就有多少个http请求。
-
生成测试报告:
-
1)批量执行测试用例(借助数据文件)
-
2)导出 测试用例集(建议与数据文件放在一起)
-
3)终端(cmd)执行测试报告命令:
newman run 用例集名称.json -e 环境文件.json -d 数据文件名.csv/.json -r html --reporter-html-export 报告名称.html
-
7、批量执行测试用例
-
1)进入 Runner 页面,选择要批量执行的用例集
-
2)自动选中所有http请求,设置迭代次数、延时、引入外部文件
-
3)点击 Run 批量执行测试用例,完成批量执行
8、测试报告
安装插件newman:
-
1)先下载安装Node.js:
https://nodejs.org/en/
-
2)打开cmd,输入
node
,如果没有报错,而是显示“>
”,说明node安装成功。 -
3)安装newman,打开cmd,输入
npm install -g newman (npm cache clean --force)
-
4)通过查看newman版本测试安装是否成功,打开cmd,输入
newman -v
,出现版本信息 -
5)newman基于postman生成html测试报告,所以还需安装html插件(必须和newman在同一路径下):
nmp install newman-reporter-html
使用newman生成测试报告:
-
1)批量执行测试用例集。(确认无误)
-
2)导出Export用例集。(得到xxx.json文件)(建议与数据文件放在一起)
-
3)在终端(cmd)中执行命令,生成测试报告
-
# 现在 终端中,测试一下。
-
newman run xxxx.json
-
# 完整的命令
-
newman run xxxx.json -e 环境变量文件 -d 外部数据文件 -r html --reporter-html-export 测试报告名.html
-
# 示例:
-
newman run 批量执行测试用例.postman_collection.json -r html --reporter-html-export 我的第一个测试报告.html
-
# 如果添加 -r html 就报错!说明: newman-reporter-html 安装失败!
三、Postman接口测试实践
以某公司的人力资源管理系统接口测试为例,来具体说明Postman在具体项目中的实践。
1、项目环境说明
-
目标:熟悉项目功能以及业务流程,了解项目架构
-
项目简介:功能模块、技术架构
-
功能模块:组织管理、组织管理、员工管理、招聘管理、劳动合同、培训管理、考勤管理、绩效管理、福利管理、工资管理
-
技术架构:前端,后端,技术架构图,业务流程图等
2、初始化项目环境
-
新建用例集 Collection:
-
1)用例集名称可以用项目名称,如:xxx项目测试用例集
-
2)用例集中,按照模块建立文件夹folder,folder名称可以就用模块名称,如:登录模块
-
3)功能模块中,按照接口建立该模块的接口请求等,也可以继续新建folder
-
-
创建环境变量:将生产环境与测试环境分开。如:线上地址和测试地址,base_url等。
3、设计编写测试用例
以登录模块和员工管理模块为例,来说明用Postman设计编写接口测试用例。
步骤:
-
首先,根据开发的接口文档整理出接口测试用例文档,并过审。
-
然后,根据过审的接口测试用例文档到Postman中编写接口测试用例。
登录模块:
-
接口共性分析:
-
1)由于是同一个接口,因此他们的请求方法、URL、请求头完全一致
-
2)请求体(请求数据),各不相同
-
3)预期结果,大致分为3类:操作成功——登录成功、多参、全部参数;用户名密码错误——其他情况;抱歉系统繁忙——无参。
-
-
实现接口用例编写:
-
登录模块:登录成功、用户名为空、用户名包含特殊字符、用户名超过11位(12位)、用户名不足11位(10位)、用户名错误、用户名未注册;密码为空、密码包含特殊字符、密码为1位、密码为100位、密码错误;必选参数(全部参数)、多参、少参(少mobile)、无参、参数错误(mobile参数名错误)等。用例编写就集中在Body和Tests中,不同的只是Body中的参数数据不一样和断言内容的不同。
-
-
以登录成功接口为例:
-
1)添加请求(Add Request): 请求方法为POST;接口地址为:
{{base_url}}/api/sys/login
;请求头(Headers
)参数:KEY为Content-Type
,VALUE为application/json
;请求体参数为:JSON格式的数据,mobile和password的值。
-
2)添加断言:在Tests界面添加响应状态码断言和JSON响应断言
-
员工管理模块:
步骤分析:
-
1)登录成功,返回的“令牌”,被 添加、查询、修改、删除 员工接口依赖。
-
2)添加员工成功,返回“员工id”,被 查询、修改、删除 员工接口依赖。
-
以上依赖关系,可借助postman关联和环境变量来实现!
-
步骤实施:
-
提取并使用令牌:
-
1)发送http登录请求,在响应体中得到data值
-
发送请求:
-
2)将data值拼接“Bearer”和“空格”,组成一个合法令牌
-
3)将拼接后的令牌设置在环境变量中(在Tests中通过代码写入)
拼接合法令牌,并设置环境变量:
代码:
-
// 拼接 data 的值,添加 Bearer 和 空格,组成合法令牌
-
// 获取响应体,保存在 jsonData变量中
-
var jsonData = pm.response.json()
-
// 提取 data 值,保存在 tmp_token中
-
var tmp_token = jsonData.data
-
// 拼接 Bearer 和 空格 到 data 值的前面,"Bearer" + " " + tmp_token
-
pm.environment.set("env_token", "Bearer" + " " + tmp_token)
-
4)在添加员工的Headers中调用令牌(Authorization)发送请求
-
添加员工:保证手机号的唯一性,如果手机号有添加过则修改新的未添加过的手机号
-
提取添加员工的id:
-
1)获取添加员工成功的data下面的id值
-
2)将员工id,设置环境变量(代码写入Tests中)
-
3)发送send之前,注意先修改手机号,保证手机号唯一!
-
4)点击“眼睛”查看,确认环境变量添加成功 提取新增员工id,并设置环境变量和添加断言:
-
代码:
-
// 获取响应体,保存到jsonData变量中
-
var jsonData = pm.response.json()
-
// 提取 data 值,保存tmp_id 变量中
-
var tmp_id = jsonData.data.id
-
// 设置 tmp_id 到环境变量中
-
pm.environment.set("env_emp_id", tmp_id)
-
pm.test("Status code is 200", function () {
-
pm.response.to.have.status(200);
-
});
-
pm.test("断言success的值为true", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.success).to.eql(true);
-
});
-
pm.test("断言code的值为10000", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.code).to.eql(10000);
-
});
-
pm.test("断言message的值为 操作成功!", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.message).to.eql("操作成功!");
-
});
-
查询员工:路径参数,url/:target
查询员工请求Params截图:
查询员工请求Headers截图:查询员工请求Tests截图:断言代码:
-
pm.test("Status code is 200", function () {
-
pm.response.to.have.status(200);
-
});
-
pm.test("断言success的值为true", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.success).to.eql(true);
-
});
-
pm.test("断言code的值为10000", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.code).to.eql(10000);
-
});
-
pm.test("断言message的值为 操作成功!", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.message).to.eql("操作成功!");
-
});
-
pm.test("断言data中id的值为 1447229608624652288", function () {
-
var jsonData = pm.response.json();
-
pm.expect(jsonData.data.id).to.eql(pm.environment.get("env_emp_id"));
-
});
4、批量运行测试用例
-
1)给 每个http请求添加 断言(成功断言)
-
2)点击用例集名称-run-进入Runner界面-点击批量执行
-
3)导出用例集(用例集-Export)
5、生成测试报告
-
1)导出环境文件(environments-环境-Export)
-
2)将环境文件 与 测试用例集文件,放置在同一个目录下
-
3)cmd终端中执行命令:
newman run 批量执行后导出的测试用例集文件.json -e 环境文件.json -d 外部数据文件 -r html --reporter-html-export 测试报告名.html
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】