Postman 入门

  • 官网: https://www.getpostman.com
  • 可能是目前最好用的web接口调试工具
  • 无需注册(注册后可多终端同步用例)
  • 免费(每年付费$60可用云服务,30天免费试用)
  • 保存历史记录
  • 支持录制请求
  • 基于Chrome的V8引擎,支持JS脚本(基本支持ES6,浏览器相关对象和API和require() import等除外)
  • 同样的代码和用例可用于自动化接口测试,见它的命令行版本Newman介绍
  • 能生成各种语言的HTTP请求代码模板
  • 能生成比较好看的在线API文档
  • 官网提供简易版持续集成环境(只支持公网IP的请求)

限制:

  • JS代码在沙盒里运行,需要读写文件和数据库的场景请用JMeter
  • 非HTTP协议、需要引入第三方库、需要重用大量代码、需要……凡是稍微复杂点的请用JMeter

安装

https://www.getpostman.com/apps

建议选择Mac/Windows app,比起Chrome app,下载不需要翻墙,功能更强大


基本使用

官方文档

教程

[API 测试]postman, 2016-02-29
API自动化测试利器——Postman, 2015-09-26(教程里的版本比较旧了,但还是讲得不错)
How to write powerful automated API tests with Postman, Newman and Jenkins, 2015-09-03
How to write automated tests for APIs using Postman – Part 1, 2014-03-07
How to write automated tests for APIs with Postman – Part 2, 2014-04-17
Writing automated tests with Postman – Part 3, 2014-05-09

  • 有些早期文章会提到Jetpack,曾经收10美元,现在是Postman左上角的Runner,可以批量执行用例

示例

Postman Echo

Making the perfect HTTP request using Postman Echo, 2015-11-13

Cooper’s Meal Plan

Conditional Workflows in Postman, 2016-03-23

Spotify Playlist Generator

Generate Spotify Playlists using a Postman Collection, 2016-11-09

CurencyCloud的Postman集合使用说明


录制接口

Capturing requests (native app)
Using Postman Proxy to Capture and Inspect API Calls from iOS or Android Devices,2016-06-26

接口调用方希望测试业务逻辑时,用不着Fiddler/Charles抓包再往里面一个个填这么麻烦
开启Postman的代理(默认5555端口),浏览器/手机设好对应的IP和端口就行,比JMeter的自带的代理方便 : )

支持正则表达式过滤URL

可以设置保存的集合,建议保存到历史记录,因为会录到不想要的东西,只有历史记录有一键清空


环境变量

Setting up an environment with variables

分为 environment 和 global 2种

2种环境变量分别存到内建的environmentglobals对象(字典)
变量名作为key,变量的值作为value(一律存储为字符串)

通过菜单设置,或在用例里通过代码设置且经Postman运行过的环境变量默认存到IndexedDB,设了就一直在,除非你把它删了
(这话很拗口,看到下文数据文件的部分就知道了)

environment

满足99%的需要,平时只用它就够了

  • 作用域为整个集合
  • 能创建多个environment文件,方便切换不同测试环境

在地址栏、header、请求参数、外部数据文件里,用 {{变量名}} 获取环境变量的值
如:{{URL}}/register

还有以下内建变量,适合一次性使用:

1
2
3
{{$guid}}  生成GUID
{{$timestamp}} 当前时间戳
{{$randomInt}} 0-1000的随机整数

global

跟environment几乎完全一样,也是{{}}调用,除了:

  • 只有1个global文件
  • 菜单藏得较深,在生成的API文档里也不解析,决定了它不适合做参数化
  • environment和global同名时,优先用environment

global只建议用在1种场景:定义公共函数

1
2
3
4
5
6
7
8
9
10
11
12
// 先正常地写好函数,再缩成一行,可以考虑用在线压缩工具
// 在菜单里选 Bulk Edit,以每行一对 key:value 的形式编辑,变量名做key,函数做value
assertType:var assertType = (name, value, type) => {if (type === 'array') {tests[`Expect ${name} to be ${type}: ${value}`] = Array.isArray(value);} else {tests[`Expect ${name} to be ${type}: ${value}`] = typeof value === type;}};
// 注意在这里定义变量只有 var 的作用域够大,用 let 或 const 的话eval后就销毁了

// 在代码里用eval拿到
eval(globals.assertType);

let name = '张三';
let type = 1;
assertType('user name', name, 'string') // 输出: Expect user name to be string, actual: 张三
assertType('user type', type, 'number') // 输出: Expect user type to be number, actual: 1

Writing a behaviour driven API testing environment within Postman

在官方给出更方便的重用代码的方法前,这是除了复制粘贴外唯一的重用方法
如果不做自动化测试,且断言写得很简单,不建议这么搞

如果不幸跳了自动化的坑,通常一个项目会有100~200个接口要做自动化测试,要仔细比较哪种方法成本更高
定义函数前要仔细考虑好,万一中途要改参数和返回值,已经写好的n份也得改……

建议定义的公共函数不超过个位数,并保留好没压缩的版本,不然别人没法接手


脚本

Testing Sandbox 内建对象、方法、变量和可用的第三方库介绍
Testing examples
Extracting data from responses and chaining requests, 2014-10-27

JavaScript的语法不再赘述,上例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 下面出现的environment、postman、tests、responseCode、request、responseTime、responseBody均为Postman内建
// 具体见上面链接里的文档

/* 获取环境变量 */
let foo = environment.yourVariableName; // 或 environment['yourVariableName']

// 多个可以用ES6的object destructuring语法:
let {foo, bar, foobar} = environment;

// 注意值都是字符串,想要其他类型要转换:
let num = Number(environment.yourVariableName);
let bool = Boolean(environment.yourVariableName); // 或 !!environment.yourVariableName


/* 设置环境变量 */
postman.setEnvironmentVariable('yourVariableName', 'value'); // 值是字符串或能转成字符串的类型

/* 更新环境变量 */
// 就是再调一次上面的方法,赋不同的值

/* 清除环境变量 */
postman.clearEnvironmentVariable('yourVariableName');
1
2
3
4
5
6
7
/* 断言 */
// tests的key会显示在界面上,value是可以解析为boolean的表达式,true显示为成功,false失败
tests['Status code is 200'] = responseCode.code === 200; // 推荐用全等 ===,确保类型和值都一致
tests['Response time is less than 400ms'] = responseTime < 400;

// 变通:用总是为真的断言来显示信息
tests[`[INFO] Request params: ${JSON.stringify(request.data)}`] = true; // 显示所有请求参数(在自动化测试里很有用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* 提取接口返回值 */
// 返回JSON:
let json = JSON.parse(responseBody); // responseBody是包含整个返回内容的字符串
// 提取某字段的值:
let foobar = json.foo.bar[0].foobar; // 假设结构为 {"foo": {"bar": [{"foobar": 1}, {"baz": 2}]}}

// 想用在自动化测试可以多写点:
let json;
try {
json = JSON.parse(responseBody);
} catch (err) {
tests['Expect response body to be valid JSON'] = false;
tests[`Response body: ${responseBody}`] = true;
console.error(err);
}

// 返回HTML等:
// A. 用正则匹配
let foo = responseBody.match(/foo/g); // g 全局 i 不分大小写 m 多行
tests['blahblahblah'] = foo[0] === 'bar';
// 正则表达式包含变量时:
let foo = 'xxx';
let bar = responseBody.match(new RegExp(`^${foo}.*$`, 'g');

// B. 用CheerioJS库
let html = cheerio(responseBody);
let titleText = html.find('title').text(); // 取 <title>标签里的文字

// C. 只要有文字就行,不管在哪、有几个
let foo = responseBody.has('xxx');

jQuery replaced by CheerioJS in Postman Sandbox, 2016-08-30

其他请参考文档和界面右边的代码模板

PS:
Postman毕竟不是IDE,只有部分语法高亮和提示,没方法和参数的提示,全靠笔记和查文档


数据文件

Using data variables to run a collection multiple times
Using CSV and JSON data files in the Postman Collection Runner, 2014-10-28
Using variables inside Postman and Collection Runner, 2014-02-20

在Collection Runner或命令行的Newman里可以加载数据文件,适合做数据驱动测试(例如同一接口不同的参数组合)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// JSON格式:
// 每条用例1个对象,变量名和值为键值对,整个文件为1个数组
// 文件里依然可以用 {{}} 拿到环境变量
// 例:
[
{"mobile": "17000000001", "pwd": "123456"},
{"mobile": "17000000002", "pwd": "654321"},
{"mobile": "17000000003", "pwd": ""},
{"mobile": "{{ADMIN_MOBILE}}", "pwd": "{{ADMIN_PWD}}"}
]

// CSV格式:
// 第1行变量名,下面是值,每行1条用例,没有空格
mobile,pwd
17000000001,123456
17000000002,654321
17000000003,


// 用例的请求参数里照旧用 {{}} 拿到数据文件里定义的变量
// 如x-www-form-urlencoded的请求参数:
telephone {{mobile}}
password {{pwd}}

// 如果文件里定义的变量跟environment/global重名,优先用文件里的

// 代码里想得到当前循环次数,用 iteration(从0开始)
// 想得到数据文件里的变量值,用 data.yourVariableName (data对象包含数据文件里第n条用例的所有变量)

PS:
在用例里通过代码设置的环境变量,如果在Runner或Newman里运行,默认不保存,跑完用例就消失


调试

cmd + alt + c(windows ctrl + alt + c)打开Postman控制台,可以看请求和响应内容

console.log()打印


mock

Using a mocking service to create Postman Collections,2016-01-26


收费功能

目前管理员不能解散自己创建的团队,不能删别人创建的环境变量模板,几乎残废

团队协作

New, More Useful Activity Feed in Postman Collections, 2016-10-27
Announcing: Environment Sharing!, 2016-03-10

发布

Call for Partners: The Run in Postman Button for API documentation


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!