Postman小工具大妙用

2024-08-10 16:38:18 浏览数 (1)

写在前面

postman 大家都会用,但是很多人只是把它当作一个简单的http客户端。大部分时候,这就够了,因为http调用就是它的最核心的功能。

那么,这样一个“小”工具,究竟还有什么值得再说两句呢?

开发完一个restful功能,后端应该自测完毕后等待与前端联调。这个自测包括单元测试和接口测试,只要完成其中之一,都能大大减少联调的耗时,但是往往两个都没好好完成。更可能的情况是,因为接口拷贝、设值麻烦、更习惯使用图形化界面操作等原因,最终接口测试与前端联调并行。

假如你自测做的很好,那么可以再考虑一些细节,比如

  1. 使用 environment 来避免测试不同的环境时反复修改host
  2. 使用 collection runner 通过接口处理一些线上小规模数据,不用再写代码进行处理

总之,postman 提供了所见即所得、方便、快捷的一种选择,所谓技多不压身。

基本概念

UI基本结构

collections

collection 是一组请求的集合,和普通的文件夹的区别不大,完全可以一样看待。

代码语言:javascript复制
 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 的优先级范围,可以用脚本来测试下

代码语言:javascript复制
 // 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次,还算够用。

需要特别注意的是

  1. 延迟无所谓,runner 实际执行为单线程
  2. 导入data文件后,注意使用预览功能检查下postman解析和预期是否一致
  3. 勾选 Persist responses,方便查看失败请求的响应
  4. 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文件内容如下

代码语言:javascript复制
 json
 {"id":"1","name":"alice"}
 {"id":"2","name":"bob"}

可惜,postman 会解析失败,原因是双引号和逗号在csv中都有特殊逻辑,我们可以采用如下办法解决

  1. 将原 data 文件的双引号先替换为单引号,同时前后添加双引号表明是一个数据
代码语言:javascript复制
 json
 "{'id':'1','name':'alice'}"
 "{'id':'2','name':'bob'}"
  1. request 中的请求报文先置为空,即 {}
  2. 添加 Pre-request 脚本进行处理
代码语言:javascript复制
 // 将修改的单引号恢复为双引号
 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 功能来近似

代码语言:javascript复制
 // 使用<pre>标签可以保留文本格式,当然也可以自己实现更复杂的html功能
 pm.visualizer.set('<pre>{{json}}</pre>', {
             json: decryptJson
         });

参考文献

Postman JavaScript Reference

0 人点赞