写在前面
postman 大家都会用,但是很多人只是把它当作一个简单的http客户端。大部分时候,这就够了,因为http调用就是它的最核心的功能。
那么,这样一个“小”工具,究竟还有什么值得再说两句呢?
开发完一个restful功能,后端应该自测完毕后等待与前端联调。这个自测包括单元测试和接口测试,只要完成其中之一,都能大大减少联调的耗时,但是往往两个都没好好完成。更可能的情况是,因为接口拷贝、设值麻烦、更习惯使用图形化界面操作等原因,最终接口测试与前端联调并行。
假如你自测做的很好,那么可以再考虑一些细节,比如
- 使用
environment
来避免测试不同的环境时反复修改host - 使用
collection runner
通过接口处理一些线上小规模数据,不用再写代码进行处理
总之,postman 提供了所见即所得、方便、快捷的一种选择,所谓技多不压身。
基本概念
UI基本结构
collections
collection
是一组请求的集合,和普通的文件夹的区别不大,完全可以一样看待。
collection` 可以定义脚本、运行 `collection runner
collection` 下可以继续递归创建子文件夹,这些子文件夹和 `collection` 一样可以定义脚本、运行 `collection runner
variables
variable
即变量,允许你通过引用在 collection、request、script 等处复用。引用的方式就是使用占位符,如 {{变量名}}
,这样只要修改 variable
的值,所有 {{变量名}}
的地方都会一起变更。
变量优先级
global、environment 变量可以直接在 postman 右上角配置。
collection 变量需要点击 collection
> Variables 进行添加
data 变量则是来源于外部文件,一般在 collection runner 时会使用到。
local 变量则是在脚本处定义,生命周期最短。
environments
可以理解为是特殊的 variable
的集合, 因为一些变量如 url 不同环境使用的是不同的值,为了避免反复修改 variable
的值,可以将 variable
定义在 environment 里,通过右上角切换。
如 {{url}}/api/resource/id=3
Scripts
我们可以在 collection
、各文件夹、request
定义脚本。
脚本分为 Pre-request 和 Post-response 两类,顾名思义,不需要多加解释。
request
会先按顺序执行自身、当前文件夹、父文件夹...collection
的 Pre-request 脚本,然后执行 request
,再按相反顺序执行 Post-response 脚本。
因此, Pre-request 脚本一般负责处理加签、数据加密、数据预处理等; Post-response 脚本处理解密、测试断言等。官网 有很多案例可以参考。
回顾下前面所说的 variable
的优先级范围,可以用脚本来测试下
// global var 'score' = 0
// collection var 'score' = 1
// environment var 'score' = 2
// first request run
console.log(pm.variables.get('score')); // outputs 2
console.log(pm.globals.get('score')); // outputs 0
console.log(pm.collectionVariables.get('score')); // outputs 1
console.log(pm.environment.get('score')); // outputs 2
// second request run
pm.variables.set('score', 3);//local var
console.log(pm.variables.get('score')); // outputs 3
// third request run
console.log(pm.variables.get('score')); // outputs 2
Collection Runner
位置:workspace 右下角、文件夹右键菜单 > Run Folder
注意事项: 免费版一个月最多只能执行 25次,还算够用。
需要特别注意的是
- 延迟无所谓,runner 实际执行为单线程
- 导入data文件后,注意使用预览功能检查下postman解析和预期是否一致
- 勾选 Persist responses,方便查看失败请求的响应
- runner 是单线程,特别大的数据不适用
Data File
支持 csv 和 json 两种格式,注意,json 格式并不是将 json 报文直接导入,举个例子,以下两种格式效果是一致的。
代码语言:javascript复制 id,name
1,alice
2,bob
[
{"id":"1","name":"alice"},
{"id":"2","name":"bob"}
]
运行效果
实践技巧
接口快速导入导出
postman左上角的 import 功能提供了多种方式导入
只是 debug 少量接口的时候,不需要使用抓包工具,可以使用浏览器自带的开发者工具来快速导入接口。
同理,也可以使用 postman 的代码功能快速生成 curl、wget 命令。
Collection Runner
如何直接导入json报文
有的时候,为了方便,我们想要一行放一个json报文,便于 request
里直接引用,csv文件内容如下
json
{"id":"1","name":"alice"}
{"id":"2","name":"bob"}
可惜,postman 会解析失败,原因是双引号和逗号在csv中都有特殊逻辑,我们可以采用如下办法解决
- 将原 data 文件的双引号先替换为单引号,同时前后添加双引号表明是一个数据
json
"{'id':'1','name':'alice'}"
"{'id':'2','name':'bob'}"
- request 中的请求报文先置为空,即 {}
- 添加 Pre-request 脚本进行处理
// 将修改的单引号恢复为双引号
let s = pm.iterationData.get("json").replaceAll("'", '"');
// 将前后多余的双引号去除,并设置为请求报文
pm.request.body.raw = s.substring(1, s.length - 1);
如何快速收集失败的case
使用 collection runner 后,有时候会遇见部分失败的情况,但是 postman 没有提供仅重试失败数据的功能,必须自己将失败的数据单独取出来重试。
而 collection runner 提供的导出功能,并不包含请求报文和响应报文,但是导出数据可以发现包含了url和测试的名字,因此可以在这里做文章,如通过下面的做法将关键数据导出,然后再通过正则取出失败数据,再重新跑 collection runner
代码语言:javascript复制 pm.test(pm.iterationData.get("billCode"), function () {
var jsonData = pm.response.json();
pm.expect(jsonData.success).to.eql(true);
});
响应报文解密如何展示
postman 的 response body
不能通过 post-response
脚本修改,直接输出到控制台总觉得不太方便。此时,我们可以使用 postman 的 visualize 功能来近似
// 使用<pre>标签可以保留文本格式,当然也可以自己实现更复杂的html功能
pm.visualizer.set('<pre>{{json}}</pre>', {
json: decryptJson
});
参考文献
Postman JavaScript Reference