概述
API First的时代,有的企业已经把API已经作为一个产品来发布。开发RESTFul API,我们需要调试、接口测试、集成测试等。对于调试,curl
命令是不错的选择,但并不是每个人都会用,且它只是个命令。Postman是一个比较好的用来调试和测试的工具,它的好处如下:
- UI界面,直观,开发测试都能快速上手。
- 对返回值测试,甚至通过js写复杂的验证。
- 可以设定变量,批量、流程化测试。
- 可以导出json,用命令或者Jenkins等工具执行。
- 可以生成API文档,可以Mock接口。
这样带来的好处是,开发编写测试的同时,直接能生成doc和mock。而测试人员完成接口测试后,直接可以作为集成测试脚本或者监控脚本使用。
本文不细讲如何发GET
,POST
等请求,因为特别简单,安装postman后,自然就明白。
示例
用github的api作为例子:https://api.github.com/users/ThoreauZZ
根据上图5个标注,分别解释各个部分功能:
- 环境:比如开发环境,测试环境。环境中可以设置多个key-value,也就是设置的环境变量。
- 集合:可以把一个模块或者一个功能的所有接口保存为一个集合,集合可以导出为json文件。
- 请求地址:请求**
api-host
是在环境变量中取值。所以,我们可以在不同环境中,针对api-host设置不同的值。这样随时切换环境,而不需要修改url地址。userName
** 也是一个环境变量,不过是动态添加的变量,在**pre-requst
**中设置的环境变量。 - Pre-Request script:在请求前做一些事情,比如设置环境变量,供请求的参数、header、body等。
- 返回体:示例中的json API,也是我们后面测试的重点。
测试
在示例图URL填写下方,有Pre-Request Script和Tests,分别用来在请求前后做相应处理和测试,针对示例的返回API,我们测试如下; 代码如下:
//get responseBody
var data = JSON.parse(responseBody);
// log
console.log(data)
// tests
tests["Status code is 200"] = responseCode.code === 200;
tests["test login"] = data.login === postman.getEnvironmentVariable("userName"); // user
tests["test id is number"] = !isNaN(data.id)
tests["test repo num"] = data.public_repos === 29
tests["test followers more than 2"] = data.followers > 2
tests["Content-Type"] = postman.getResponseHeader("Content-Type") == "application/json; charset=utf-8";
// set environments
postman.setEnvironmentVariable("userId", data.id);
上面的测试脚本,格式test['test description'] = value === expectValue
,从上列可以看到,可以判断状态码,返回头信息,可以编写JavaScript脚本测试返回体,可以解析json,可以设置环境变量,可以在调试时console.log打印日志等功能。
postman好用在于,除了提供内置的几个函数外,其他脚本完全通过js语法随意发挥。比如我要每次请求的orderId都不一样,可以在Pre-Request script 中这样写(当然也可以写for循环和if分支等)
postman.setEnvironmentVariable("orderId", "orderId"+ Date.parse(new Date()));
对于常用的json API测试,我们可以通过json schema
进行校验,还是以github的api为例,通过tv4.validate库进行校验。
// json schema
var schema ={
"definitions": {},
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://api.github.com/users.json",
"type": "object",
"properties": {
"login": {
"$id": "/properties/login",
"type": "string",
"title": "The Login Schema.",
"description": "userName",
"default": "",
"examples": [
"ThoreauZZ"
]
},
"id": {
"$id": "/properties/id",
"type": "integer",
"title": "The Id Schema.",
"default": 0,
"examples": [
10337273
]
},
"public_repos": {
"$id": "/properties/public_repos",
"type": "integer",
"title": "public_repos",
"default": 5,
"examples": [
8
],
"minimum": 0,
"maximum":10000
},
"site_admin": {
"$id": "/properties/site_admin",
"type": "boolean",
"title": "site_admin",
"default": false,
"examples": [
true
]
}
},
"required": [
"login","id"
]
}
// get response data
var data = JSON.parse(responseBody);
// validate
tests["Valid json"] = tv4.validate(data, schema);
还可以直接在脚本里发起ajax请求:
// Example with a full fledged SDK Request
const echoGetRequest = {
url: 'https://www.googleapis.com/customsearch/v1?key=someKey&q=lectures',
method: 'GET',
header: 'headername:value',
body: {
mode: 'raw',
raw: JSON.stringify({ key: 'this is json' })
}
};
pm.sendRequest(echoGetRequest, function (err, res) {
console.log(err ? err : res.json());
});
综上所述,可以在postman的提供的沙箱里面执行js脚本,支持的库如下:
- Lodash: JS 工具库
- cheerio: 实现jQueryAPI
- tv4 JSON schema validator: jsonSchema校验
- CryptoJS: 标准加密算法库 AES, DES, EvpKDF, HMAC-MD5, HMAC-SHA1/3/256/512, MD5, PBKDF2, Rabbit, SHA1/3/224/256/512, TripleDES
- xml2Json(xmlString): xml和json处理
运行集合
一般来说,一个请求可能需要带上登录后的token或者cookie,也可能提交的请求用到上一个请求返回的数据。我们可以把这些请求放入一个集合,通过get/set环境变量的方式把他们串联起来。 集合的所有API测试可以导出为json文件。下面详细解释:
自动化脚本
导出json文件
导出集合realTestRunner为realTestRunner.postman_collection.json
;
导出环境变量为local.postman_environment.json
;
安装newman
# 需要先安装nodejs(自带npm)
npm install -g newman
执行脚本
newman run realTestRunner.postman_collection.json -e local.postman_environment.json
测试报告如下,59个接口测试,有6个接口请求失败。
就通过newman
这个命令,集成测试时,可以把json文件放在项目的doc目录下,通过Jenkins、docker等自动拉取json文件完成自动化集成测试。
导出为其他语言
有时候需要在服务器上执行某个复杂的HTTP请求,可以先用postman编写,然后点击code
如下图:
然后选择语言或者工具:如curl、python
总结
postman是一个比较好的调试测试restful api的工具,Mock和doc功能请阅读官网。也提供了收费的团队版本。