用Postman测试API

概述

API First的时代,有的企业已经把API已经作为一个产品来发布。开发RESTFul API,我们需要调试、接口测试、集成测试等。对于调试,curl命令是不错的选择,但并不是每个人都会用,且它只是个命令。Postman是一个比较好的用来调试和测试的工具,它的好处如下:
1. UI界面,直观,开发测试都能快速上手。
2. 对返回值测试,甚至通过js写复杂的验证。
3. 可以设定变量,批量、流程化测试。
4. 可以导出json,用命令或者Jenkins等工具执行。
5. 可以生成API文档,可以Mock接口。

这样带来的好处是,开发编写测试的同时,直接能生成doc和mock。而测试人员完成接口测试后,直接可以作为集成测试脚本或者监控脚本使用。

本文不细讲如何发GET,POST等请求,因为特别简单,安装postman后,自然就明白。

示例

用github的api作为例子:https://api.github.com/users/ThoreauZZ

根据上图5个标注,分别解释各个部分功能:
1. 环境:比如开发环境,测试环境。环境中可以设置多个key-value,也就是设置的环境变量。
2. 集合:可以把一个模块或者一个功能的所有接口保存为一个集合,集合可以导出为json文件。
3. 请求地址:请求api-host是在环境变量中取值。所以,我们可以在不同环境中,针对api-host设置不同的值。这样随时切换环境,而不需要修改url地址。userName 也是一个环境变量,不过是动态添加的变量,在pre-requst中设置的环境变量。
4. Pre-Request script:在请求前做一些事情,比如设置环境变量,供请求的参数、header、body等。
5. 返回体:示例中的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功能请阅读官网。也提供了收费的团队版本。

CONTENTS