API自动化测试利器——Postman

自从开始做API开发之后,我就在寻找合适的API测试工具。一开始不是很想用Chrome扩展,用的WizTools的工具,后来试过一次Postman之后就停不下来了,还买了付费的Jetpacks。推出Team Sync Beta之后我又把这个工具推广给团队,作为API文档使用。看到中文网络上关于这个工具的文章并不多,于是决定写一篇小文介绍一下。

一、基本功能

Postman的功能在文档中有介绍。不过文档略啰嗦,这里简单介绍一下主界面,入门功能就都提到了。

  1. Collections:在Postman中,Collection类似文件夹,可以把同一个项目的请求放在一个Collection里方便管理和分享,Collection里面也可以再建文件夹。如果做API文档的话,可以每个API对应一条请求,如果要把各种输入都测到的话,就需要每条测试一条请求了。这里我新建了一个example用于介绍整个流程,五个API对应五条请求。这个Collection可以通过https://www.getpostman.com/collections/c8f98a1120357e0d4a5a导入你自己的Postman中。
  2. 上面的黑字注册是请求的名字,如果有Request description的话会显示在这下面。下面的蓝字是保存起来的请求结果,点击可以载入某次请求的参数和返回值。我会用这个功能给做客户端的同事展示不同情况下的各种返回值。保存请求的按钮在15.
  3. 选择HTTP Method的地方,各种常见的不常见的非常全。
  4. 请求URL,两层大括号表示这是一个环境变量,可以在16的位置选择当前的environment,环境变量就会被替换成该environment里variable的值。
  5. 点击可以设置URL参数的key和value
  6. 点击发送请求
  7. 点击保存请求到Collection,如果要另存为的话,可以点击右边的下箭头
  8. 设置鉴权参数,可以用OAuth之类的
  9. 自定义HTTP Header,有些因为Chrome愿意不能自定义的需要另外装一个插件Interceptor,在16上面一行的卫星那里
  10. 设置Request body,13那里显示的就是body的内容
  11. 在发起请求之前执行的脚本,例如request body里的那两个random变量,就是每次请求之前临时生成的。
  12. 在收到response之后执行的测试,测试的结果会显示在17的位置
  13. 有四种形式可以选择,form-data主要用于上传文件。x-www-form-urlencoded是表单常用的格式。raw可以用来上传JSON数据
  14. 返回数据的格式,Pretty可以看到格式化后的JSON,Raw就是未经处理的数据,Preview可以预览HTML页面
  15. 点击这里把请求保存到2的位置
  16. 设置environment variables和global variables,点击右边的x可以快速查看当前的变量。
  17. 测试执行的结果,一共几个测试,通过几个。

这个界面就是免费版的主要内容,和其他API测试工具相比,已经足够好用。如果要使用自动化测试,需要购买9.99美金的Jetpacks,暂时不想购买的话可以试一下Team版Postman。现在是可以免费试用的,不但拥有Jetpacks的功能,还能与其他账户同步Collection。

二、测试工具

测试工具主要包括三部分,在发起请求之前运行的Pre-request,在收到应答之后运行的Test,和一次运行所有请求的Collection Runner

1. Pre-request

Pre-request的编写界面如下:

Pre-request和Test用的语言都是JavaScript,Postman在一个沙盒里执行代码,提供给用户的库和函数可以在这里查看。而常用的功能都可以通过右边的Code Snippets实现,点击就可以插入到代码区域

可以看到Pre-request里常用的功能就两种,设置环境变量和设置全局变量。这条请求的pre-request就是在注册之前生成一个字符串作为随机用户名。

postman.setEnvironmentVariable("random_username", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

其他用法还包括在发起请求之前获取当前的时间戳放在参数里:

postman.setEnvironmentVariable("unixtime_now", Math.round(new Date().getTime()/1000));

当然也可以用来生成校验串。总之,在发请求之前需要手动修改的东西,都可以考虑用脚本自动实现。

2. Test

Test的编写界面如下:

和Pre-request相比,Test的Snippets就丰富多了,例如检查状态码、检查响应串、验证JSON、检查header、限制应答时间。

如果需要将服务器响应的数据保存下来,用在后面的请求里,也需要在这一步做。

在图中的Test里,我首先检查了状态码为200,然后解析返回的JSON,把环境变量里的token设为JSON里的token。

3. Collection Runner

当编写了很多测试之后,就可以使用Collection Runner来自动运行整个Collection了,入口就在主界面最上面一行的Runner。选好Collection、Environment,如果有需要还可以载入JSON和CSV作为数据源。点击Start Test Run,就可以看到结果了。

这里可以看到一共发起了5次请求,每个请求各有一个Test,全部Pass。(虽然最后一个请求的返回是403,但是这个请求的期望返回值就是403,所以也是Pass的)

三、示例

最后完整的看一下我用的例程。这个例子是一个非常简单的小系统,用户可以注册并登录,然后在系统里新建充值卡,并给这张卡充值。整个流程如下:

1. 注册

生成一个随机字符串作为用户名和昵称

postman.setEnvironmentVariable("random_username", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

发起请求

POST /index.php/users HTTP/1.1
Host: postmanexample.bayes.cafe
Cache-Control: no-cache
Postman-Token: 76791813-aac2-71fb-cad4-3e737f37c4d0
Content-Type: application/x-www-form-urlencoded

username=2mjk&password=123456&nickname=2mjk

运行测试、检查结果

tests["Status code is 201"] = responseCode.code === 201;

2. 登录

直接用刚才生成的环境变量发起请求

POST /index.php/authentication HTTP/1.1
Host: postmanexample.bayes.cafe
Cache-Control: no-cache
Postman-Token: aac7d0ac-e0e3-ecf2-39da-b8dca672e3d7
Content-Type: application/x-www-form-urlencoded

username=2mjk&password=123456

运行测试、检查结果,并将返回的token记录下来

tests["Status code is 200"] = responseCode.code === 200;

var data = JSON.parse(responseBody);
postman.setEnvironmentVariable("token", data.token);

3. 添加一张卡

先生成一个卡号和卡名

postman.setEnvironmentVariable("random_cardno", Math.round(Math.random()*9999999));

postman.setEnvironmentVariable("random_cardname", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

然后发起请求,这里调用了刚才获取到的Token,放在header的自定义字段里作为鉴权(SAE不能用Authorization这个字段,不清楚原因)

POST /index.php/cards HTTP/1.1
Host: postmanexample.bayes.cafe
X-Authorization: d4c4a0b7b36c73e7a13b7e24a596093b
Cache-Control: no-cache
Postman-Token: d44d573f-f17a-366c-2cd7-1d5b8b709233
Content-Type: application/x-www-form-urlencoded

cardno=1385526&desc=2mo8

运行测试

tests["Status code is 200"] = responseCode.code === 200;

4. 查询刚才生成的卡

发起请求,调用了刚才生成的卡号

GET /index.php/cards/1385526 HTTP/1.1
Host: postmanexample.bayes.cafe
Cache-Control: no-cache
Postman-Token: 1e5aca57-c3bb-7404-2791-c639cd60b5c8

运行验证,和刚才生成的卡名对比,并记录新卡的ID

var data = JSON.parse(responseBody);
tests["check cardname"] = data.desc === environment.random_cardname;

postman.setEnvironmentVariable("new_card_id", data.id);

5. 充值

发起请求,使用了刚才获得的新卡ID

POST /index.php/deposit HTTP/1.1
Host: postmanexample.bayes.cafe
X-Authorization: d4c4a0b7b36c73e7a13b7e24a596093b
Cache-Control: no-cache
Postman-Token: 388c95e0-b5ce-9bbf-5816-084db7523384
Content-Type: application/x-www-form-urlencoded

cardid=1&amount=10

运行验证(由于是新建的用户,没有余额,无法给卡片充值,故返回403 Forbidden)

tests["Status code is 403"] = responseCode.code === 403;

P.S.postmanexample.bayes.cafe这个网站是真实存在的,可以Import我上传的Collection(https://www.getpostman.com/collections/96b64a7c604072e1e4ee)到你自己的Postman中,并设置环境变量urlhttp://postmanexample.bayes.cafe,就能运行这个Collection看效果了。

Update: 距本文写作已过 8 年,由于服务器迁移,我决定不再维护这个测试 API,如果你仍然需要,服务器端的代码可以在 GitHub 获得。

API自动化测试利器——Postman》有72个想法

    1. fengchang 文章作者

      如果单纯想做自动化测试的话还是用代码测试更好一点。Postman缺点很多,但首先是作为一个调试工具,开发的时候会一直用它来查看结果,也会用它来给同事展示API。做完这些会积累一批测试用例,顺便就可以拿来做测试。

      回复
  1. Pingback引用通告: API自动化测试利器——Postman-IT大道

    1. xunmeng608

      你们这个http://postmanexample.sinaapp.com/index.php网址都能打开吗

      回复
  2. andy

    1、请问下我怎样能用postman工具将所有测试用例能串联起来?最后必要改变我的用例的位置,因为我的测试用例,可能之前就分类好了。
    2、postman工具怎样传递csrf参数,因为好多接口都要传递这个参数,关键是取出来后,怎么传递进去,经常遇到“CSRF验证失败. 相应中断”问题,请帮忙解决,谢谢!

    回复
    1. fengchang 文章作者

      1. 测试用例只有在一个 Collections 里或者 一个文件夹里才能在一个 runner 里运行,没有发现一次运行多个 Collections 的办法。但是我发现 Postman 提供了 commandline 工具 (https://www.npmjs.com/package/newman) 你可以试一下。

      2. csrf 参数是在 header 里吗?Postman 由于是 Chrome 扩展的缘故能支持的 header 不多,需要安装 Interceptor 才能自定义 header 字段。右上角那个卫星图标就是 Interceptor。

      回复
  3. 陈慧江

    楼主你好,我import你上传的Collection后,中文都是乱码显示的,有解决的方法吗?

    回复
    1. fengchang 文章作者

      我试着 import 了一下,也是乱码了,应该是 Postman 做了什么改动。我又重新传了一个,你试试 `https://www.getpostman.com/collections/c8f98a1120357e0d4a5a`

      另外现在 Postman 安装之后会带一个叫 Postman Echo 的 Collection,里面的例子也是有测试代码的,你可以照着那个试试。

      回复
    1. fengchang 文章作者

      完全 copy Postman 啊,但是文档这块还是不错的,Postman 不能生成文档,只能让人自己看参数

      回复
  4. xunmeng608

    这个http://postmanexample.sinaapp.com/index.php网址怎么打不开

    回复
        1. fengchang 文章作者

          可以,你算出 token 之后设到环境变量里,然后 body 里用变量就可以了。例如

          postman.setEnvironmentVariable(“token”, “abc”);

          body 里设 token 的值是 {{token}}

          回复
          1. 方师傅的说法

            如果不是form方式,是raw方式,字段还能从一个请求的应答中存为环境变量,另一个请求使用这个变量吗?

  5. postman新人

    请问,我看示例里面怎么没有用到参数啊?比如3,添加一张卡,设置了random_cardno和random_cardname两个变量,下面的请求没看到用到啊,怎么就成功了呢?
    3. 添加一张卡

    先生成一个卡号和卡名

    postman.setEnvironmentVariable(“random_cardno”, Math.round(Math.random()*9999999));

    postman.setEnvironmentVariable(“random_cardname”, (“0000” + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));
    然后发起请求,这里调用了刚才获取到的Token,放在header的自定义字段里作为鉴权(SAE不能用Authorization这个字段,不清楚原因)

    POST /index.php/cards HTTP/1.1
    Host: postmanexample.sinaapp.com
    X-Authorization: d4c4a0b7b36c73e7a13b7e24a596093b
    Cache-Control: no-cache
    Postman-Token: d44d573f-f17a-366c-2cd7-1d5b8b709233
    Content-Type: application/x-www-form-urlencoded

    cardno=1385526&desc=2mo8

    回复
    1. fengchang 文章作者

      random_cardno 和 random_cardname 两个变量名是设置在请求的 body 里的。用两个大括号套住的就是变量。

      回复
  6. Pingback引用通告: Postman 做接口自动化测试:入门篇 - 莹莹之色

  7. Pingback引用通告: 运用Postman玩转接口测试 R11; CodingBlog

  8. yuanpaopao

    适合入门,加上关于newman就更好了,希望楼主持续更新。

    回复
  9. zhao

    请教博主如何获取cookies中的内容?官方给的示例是假的,获取的是body中返回的cookie,我想要要的是真正的cookie,但是test中貌似没有document这个对象。

    回复
    1. fengchang 文章作者

      cookie 在 HTTP Header 里,发给服务器的 cookie 是 Request Header 里的 Cookie 字段,服务器设置 cookie 是 Response Header 里的 Set-Cookie 字段。在 Chrome 的开发者工具里看看请求详情就明白了。

      回复
      1. zhao

        非常感谢您的回答。我在postman的文档中找到了如何获取cookie值。
        postman.getResponseCookie(cookieName);

        不过看官方文档对于我这种英文菜鸟来说太痛苦了。

        再请教一个问题,博主。

        我能在测试脚本中重复调用自己吗?

        自己是指的当前url,再次继续发送请求,继续测试。

        因为这个url需要设置不同的参数来进行测试。我想在第一次结束后。在test script脚本文件中对于url设置好下一次的测试参数后,让这个url再次继续执行。直到所有的参数全部执行完毕。

        回复
        1. fengchang 文章作者

          这个我不太了解,不过你可以考虑使用 Postman 的 Collection Runner 功能,从文件里导入参数,如果重复调用的次数比较多,还是很方便的。

          回复
      2. zhao

        对了,还有个问题。我怎么看见console打印的内容?找了好久没找到。

        回复
        1. fengchang 文章作者

          没用过 console,但是我在 so 上学了个歪招,把变量值打到 test 的名称里就能看到了。
          例如在 tests 里写一条 tests[“title = ” + jsonData.title] = true;
          测试结果里就有一个 title = xxx

          回复
  10. chenyy

    这里我新建了一个example用于介绍整个流程,五个API对应五条请求。这个Collection可以通过https://www.getpostman.com/collections/96b64a7c604072e1e4ee导入你自己的Postman中。

    导入后为什么是显示乱码

    回复
  11. chrome插件

    如果不能访问谷歌应用商店,可以到这个网址上http://chromecj.com/web-development/2014-09/60.html下载。我试过了,没有广告和修改。

    回复
  12. Danny

    您好~ 想請問一下,導入你所提供的example後,但URL的部分需要填入哪個網址呢?

    目前試了這個網址postmanexample.sinaapp.com好像已經連不上了…

    回复
  13. Danny

    哈囉!您好~ 因為最近有網站對接api的測試需求,但有些關於使用postman的問題想請教您一下,不曉得是否能提供您的聯繫方式,感謝您~~

    回复
  14. 初学者

    对请求数据有加密处理的网站,postman发请求的时候怎么去解决啊!不知道说清楚没有求解

    回复
  15. 嘻嘻~

    你好,我想请教下,
    1.对于文中【调用了刚才获取到的Token,放在header的自定义字段里作为鉴权】这点,我看demo是在headers里使用了X-Authorization={{token}}这样的方法。我疑惑的是,X-Authorization不是headers里面系统自带的key,为什么可以直接生效(即设置X-Authrorization={{token}}后服务器端就会认为用户已登录)呢?
    2.对于一个网页,它是通过cookie来控制某个接口A的访问权限。
    我的想法是:
    1)先在登录请求设置tests,将获取的cookie设置为环境变量;
    2)然后在请求接口A时,在headers里使用cookie环境变量
    但我在使用方法postman.getResponseCookie(cookieName)时报错【ReferenceError cookieName is not defined】。所以应该怎么获取cookie的值呢?

    回复
    1. fengchang 文章作者

      第一个问题,X-Authorization 是在后端代码里做了判断的,你可以在文末的 Github 里找到代码。之所以用 X- 开头的 header 是因为之前用的新浪云会占用 Authorization 字段。

      第二个问题,Postman 应该会自动处理 Cookie 的,我做了一个实验,新建两个文件:

      1. set_cookie.php
      <?php
      setcookie("TestCookie","cookie value", time()+3600);

      2. show_cookie.php
      <?php
      print_r($_COOKIE);

      用 Postman 分别请求两个 URL,在请求第二个的时候可以看到之前设置的 cookie 被显示出来了。因此 Postman 是会像浏览器一样处理 cookie 的,不需要你再进行处理。

      回复
      1. fengchang 文章作者

        我晕,被过滤了。我就不打 php 标签了

        1. set_cookie.php
        setcookie(“TestCookie”, “cookie value”, time()+3600);

        2. show_cookie.php
        print_r($_COOKIE);

        分别请求两个 URL,在请求第二个时可以看到第一个文件设置的 cookie 已经被显示出来了,因此 Postman 是会像浏览器一样处理 cookie 的,不需要你再用代码设置。

        回复
  16. Pingback引用通告: 使用postman对restful API接口进行自动化测试 - 极客技术-极客技术

  17. 上传文件

    上传文件时每次都需要手动选择图片上传。请问有没有什么好的方式解决?

    回复
    1. fengchang 文章作者

      如果你 URL 里用了环境变量,可能是变量没有设置正确。你可以点击 Save 下面的 Code,然后左上角选择 cURL,看看第二行的 URL 是否正确(如果里面是 %7B%7B…%7D%7D 说明变量没设上)

      回复
  18. 雷雷

    可以录制个视频,举一些案例,实际操作更好。看了一些视频,还是不懂,自己太菜了。

    回复
  19. 果冻想

    我这里总结了非常详细的postman使用教程,和大家一起分享:https://www.jellythink.com/archives/category/tool-tutorials/postman
    希望对大家有帮助。

    回复
  20. Pingback引用通告: API自動化測試利器——Postman - 程序員的後花園

  21. Pingback引用通告: essayforme

  22. Pingback引用通告: API自動化測試利器——Postman | 程式前沿

  23. lmxdawn

    怎么给请求结果加上注释呢,不然API文档只有个返回结果没有说明

    回复
  24. zhangxiansheng

    您好,老师,我通过postman的monitor的时候,为什么我的响应时间都是0,接口不通过,而且提示connect ETIMEDOUT,

    回复
  25. Liam

    现在大多数人都在使用Apifox啦, Apifox = Postman + Swagger + Mock + JMeter👈。API 文档、API 调试、API Mock、API 自动化测试,一个工具全搞定!

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注