Postman+Newman+Jenkins 接口自动化测试持续集成
- 引入
- Postman应用
- 变量
- 批量运行测试用例
- 断言
- 正则提取&内置动态参数
- 动态参数传递
- 持续集成
- 流程思路图
- Postman导出.json文档
- 导出测试脚本文件
- 导出环境变量脚本文件
- Newman生成测试报告
- 参数设置
- 启动测试
- 结果导出
- 编程实现
- Jenkins配置pipeline
- 新建项目
- 设置定时任务触发
- 构建环境
- 执行shell脚本
- 构建后操作
今天得知postman将彻底变成一个基于云端的工具,涉及到安全原因以后大概率不能在项目中使用了,所以今天把很久以前总结的接口自动化流程发出来。虽然postman不再使用,但持续集成自动化的基本逻辑和原理还是不变的,变得只是一个工具。
引入
- 什么是接口?
接口是软件提供给外部的一种服务,用于做数据传输。 - 接口测试的本质?
就是测试接口能否正常的交互数据、控制管理。 - 接口测试的重点
正确接受合法request入参,正确拒绝非法request入参,保证接口的正确性和健壮性。
在接下来的接口自动化中,我们使用Postman这个非常流行的工具,下面是Postman的UI操作界面:

Postman应用
变量
- 全局变量对postman所有接口都生效
- 环境变量只有设置为该环境下,才生效
- 集合变量在collection中生效
- 优先级:环境变量>集合变量>全局变量
使用pm.environment.set(“variable_key”, “variable_value”);、pm.environment.get(“variable_key”);来get/set环境变量

批量运行测试用例


断言
| assertion | code |
|---|---|
| 断言返回结果的响应码 | pm.test(“Status code is 200”,function(){pm.response.to.have.status(200); }); |
| 断言返回结果包含一个指定的字符串 | pm.test(“Body matches string”, function () {pm.expect(pm.response.text()).to.include(“tags”);}); |
| 对返回的结果作json字段检查 | pm.test(“Your test name”, function () {var jsonData = pm.response.json();pm.expect(jsonData.tags[1].id).to.eql(5298);}); |
| 断言返回的结果等于一个字符串 | pm.test(“Body is correct”, function () {pm.response.to.have.bod(“response_body_string”);}); |
| 断言响应头中包含指定的响应头 | pm.test(“Content-Type is present”, function () {pm.response.to.have.header(“Content-Type”);}); |
| 断言请求接口的时间少于200ms | pm.test(“Response time is less than 200ms”, function () {pm.expect(pm.response.responseTime).to.be.below(200);}); |
| 断言一个post请求的返回状态码是否在指定范围里面 | pm.test(“Successful POST request”, function () {pm.expect(pm.response.code).to.be.oneOf([200, 202]);}); |
| 断言返回的信息中包含指定的字符串 | pm.test(“Status code name has string”, function () {pm.response.to.have.status(“OK”);}); |
正则提取&内置动态参数
- 内置动态参数
- 时间戳:{{$timestamp}}
- 生成0-1000的随机整数:{{$randomint}}
- 生成一个GUID的字符串:{{$guid}}很长的字符串
- 正则提取
- match 匹配 new RegExp新建规则

动态参数传递
获取登陆的token,我们先设置一个变量名称但是不填入内容

然后再test中加入下面的code来set token
//提取access_token的值
var jsValue = JSON .parse(responseBody);
//把提取的值保存到全局变量
pm.globals.set("token0",jsValue.access_token);
这样点击请求,请求成功后,获取到的token会自动设置在刚刚的变量下面
并且下一个接口请求时需要这个token可以以变量的形式传入{{token}}

持续集成
流程思路图
Postman+Newman+Jenkins

Postman导出.json文档
导出测试脚本文件

导出环境变量脚本文件

Newman生成测试报告
Newman是postman的命令行收集运行程序,能够直接运行和测试Postman集合。
参数设置
使用指令newman run xxx.postman_collection.json 即可启动测试
| 参数 | 用法 |
|---|---|
| -e | – environment 后面跟环境变量文件 |
| -g | – global 后面跟全局变量文件 |
| -n | – iteration-count 后面跟迭代次数 |
| -d | – iteration-data 指定用于迭代的数据源文件 |
| -r | – reporters 后面跟数据结果 |
| html | 将结果生成为html文件,指定生成到具体目录需要配合 --reporter-html-export 文件名 使用 |
启动测试
newman run learning.postman_collection.json -e baidu.postman_environment.json

结果导出
newman run learning.postman_collection.json -e baidu.postman_environment.json -r html


编程实现
新建一个newman.js文件
- 核心方法是newman.run(options: object , callback: function) => run:EventEmitter
- options Newman运行时的设置项
- callback 为回调函数,回传error信息
- run 为函数主体,可监听事件

引入newman -> 调用newman.run传递对象并等待回掉

然后在命令行运行 node newman.js文件,执行效果和上面指令运行是一样的
Jenkins配置pipeline
Jenkins是基于java开发的一种持续集成工具,用于监控持续重复的工作,使得项目可以持续集成。
新建项目
首先新建一个自由风格的软件项目:

将代码传至github

设置定时任务触发
我们可以设定定时任务触发:
五个字段:
| 分钟 | 0-59 |
| 小时 | 0-23 |
| 日期 | 1-31 |
| 月份 | 1-12 |
| 星期 | 0-7 |
特殊符号:
| * | 匹配范围内所有值 |
| m-n | 匹配m-n的所有值 |
| m-n/x | 在m-n范围内每隔x执行一次 |
| H | 随机值 |
Example:
H/15 * * * * 每隔15分钟执行一次
H H 1-15/3 * * 每个月的1-15号,每隔3天执行一次
H H * * 1,3,5 每周1,3,5执行一次

构建环境
每次构建删除jenkins数据目录下本项目上次的构建workspace

执行shell脚本

Build完成之后,可以在status中找到report的目录


构建后操作

