接口测试 Postman 做接口自动化测试-1. 入门篇

keithmork · 发布于 2016年12月03日 · 最后由 tangtest4 回复于 2017年11月22日 · 最后更新自管理员 Lihuazhang · 17289 次阅读
本帖已被设为精华帖!

Postman大更新很多次了,原内容过时咯,把大部分编辑掉避免误导,只保留链接


https://www.getpostman.com

可能是目前最好用的web接口调试工具

接口自动化测试选型参考

  • 门槛低
    • 基本功能很多人会,很多前后端开发、测试习惯用它调接口
    • 脚本语言是 JavaScript ,几乎人人都会一点,只需要学它的几个API
    • 自带各种代码模板
    • 跨平台,有 Mac 、Win、Linux桌面版
  • 免费版功能够用,能满足多数互联网公司的使用场景
    • HTTP(S) 协议、发送form/JSON、接收 JSON/text/HTML、常用加密/编码
    • 有命令行版(Newman),方便放上服务器,通过Jenkins做持续集成
    • 用例、环境变量支持导入导出,可以交给Git做版本管理
    • 支持抓包、保存历史记录、多终端同步用例
    • 支持读取数据文件(JSON/CSV)
    • 支持JSON Schema校验
  • 有亮点
    • 桌面版基于Electron,底层是V8引擎,可以用 ES6 语法写JS
    • 如果项目用 Swagger 生成API文档,JSON文件可以直接导入Postman来生成用例

局限

毕竟调试小工具出身,算不上成熟的自动化测试框架,又有GUI的拖累,有些东西绕个圈能实现但很丑,如:

  • 封装公共函数
  • 引入第三方/自己写的JS库
  • 用例间跳转、重试

有些该有的功能目前还不支持,如:

  • 通过URL搜索用例
  • 通过命令行传参修改环境变量

另外Postman运行在沙盒里,Newman虽然基于Node.js,但一套脚本2边共用决定了功能不能差太远,因此无法做到:

  • 文件相关操作
  • 读写数据库
  • 使用非HTTP协议

如果要深入使用,团队里最好有人会Node.js,把Newman封装一下


安装

Mac

如果装了HomebrewCask

brew cask postman

否则:

https://www.getpostman.com/apps

推荐 macOS/Windows/Linux 桌面app

不推荐现在还用Chrome app,除了下载要翻墙,浏览器的沙盒有更多限制


基本使用

官方文档

教程

不管中文还是英文的教程都比较过时了,容易误导人,建议直接读官方文档,2个小时就能过一遍

接口测试工具 postman, 2016-09-01(基于Chrome版的Postman,和桌面版大同小异)

[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自带的Collection 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集合使用说明

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 42 条回复
10693
keithmork · #1 · 2016年12月03日 作者

最近这几个月在用postman(其实多半是命令行版的newman)做接口测试,一开始用它的真正理由就1个:老大已经钦定了

用下来感觉一般般,踩平了一堆坑,在github给作者提了5个issue,后来又用nodejs写了个wrapper简单封装了一下newman

现在准备把整套东西交给功能测试的同事,把笔记和心得整理一下发出来抛砖引玉😀

总的来说,这个优秀的调试工具用来做自动化测试给人的感受就是“渣,但不比其他任何框架更渣”

虽然还不能做到开箱即用,无奈亮点真的很亮,而且一直越变越好,潜力很大,后续还是很看好它的

这篇东西非常入门向,还停留在用UI发请求,连newman都没涉及

迟些整理下放出newman篇和自己的wrapper的一点点心得

110 Lihuazhang 将本帖设为了精华贴 12月03日 10:10
3楼 已删除
4楼 已删除
110

用的是es6?帖子写的不错,postman 用来做大规模接口测试,就像jmeter一样,感觉有点奇淫技巧

10693
keithmork · #6 · 2016年12月03日 作者

#5楼 @Lihuazhang

嗯 例子都是es6 既然底层是v8引擎 肯定选更顺手的写法 :)

11669

刚打算休息天学习下接口测试,一打开testerhome就看到这篇帖子,有缘~先收着学习了~

6678

#6楼 @keithmork 请问下 “有没有用手机测试时挂代理录请求的习惯” 这个有啥坏处?

96

新手报到

5743

好文,期待结合newman的分享。好像还可以做到 jenkins+newman+postman一套的接口自动化实现。

10693
keithmork · #11 · 2016年12月05日 作者

#8楼 @b_88 倒没啥 但现在老大希望之前工作中基本只关注界面的同事把接口这层也做了
如果自己不抓包,又不去找访问日志分析,又没人主动把要测的接口送上门,那大概是推不起来了

10693
keithmork · #12 · 2016年12月05日 作者

#10楼 @qq329999897

嗯 目前是这么用的

其实那些测试数据就这么分散在各个html报告文件里太浪费,newman有npm包和提供了一些接口,可以写代码调用的,跑完测试可以把想要的数据存进mongodb里

6510

赞、最近也开始用postman做接口测试
之前是自己写python读写excel来测接口、老大希望前端开发自己也能用来测接口数据、就开始用postman了
想实现自动化、还在研究中

9498

先马住😋

96

问个问题:已经在浏览器开启了interceptor,postman中的卫星也打开了,但是在postman的history中没有自动捕获chrome的操作记录。这是什么原因呢?已试过重装,但是没有用

96

@keithmork ,多谢你的分享。这是我看到的关于postman的最详细的介绍,给了我很多有用的信息。使用postman约10天了,基本能用上了,很是期待你的下一篇分享。

10693
keithmork · #17 · 2016年12月09日 作者

#15楼 @zxd2010112123

浏览器代理设了没?比如都是本机就填本机ip和postman里你设置的端口(默认5555)

3502

楼主这篇文章很好,我是接口新手,我在使用postman,一直没解决一个问题。

请问,如何将图一request的“phone”参数,自动填充到图二request的“phone”参数里去?
请求方式是post,请求体为json格式。
1.需要在哪里定义脚本调用吗?
2.脚本的定义格式是如何的?

这个问题让我在run collection时出现很多fail?
麻烦楼主以及懂的朋友赐教,非常感谢

图一:

图二:

10693 keithmork Postman 做接口自动化测试-2. 常用代码片段 中提及了此贴 12月09日 20:35
10693
keithmork · #20 · 2016年12月09日 作者

#18楼 @tangtest4 你这个号码既然是写死的,可以搞成环境变量吧?

3502

#20楼 @keithmork
可以把它搞成环境变量,我可以在Pre-request Script定义一个随机号码,这样它就不写死。

但问题是我不知道Test里怎么去设置request的参数为环境变量?

10693
keithmork · #22 · 2016年12月10日 作者

#21楼 @tangtest4 在pre-request里就可以设环境变量的,方法一样

比如phone是你的随机号码的变量,环境变量也起一样的名字,那就postman.setEnvironmentVariable('phone', phone);

如果一定要在test里取请求参数里填的东西,像这里传JSON字符串就用JSON.parse(request.data).phone
如果是form就用request.data.phone

谢谢你的问题,我更新一下原帖,放在提取接口返回值下面一点:)

3502

#22楼 @keithmork 非常感谢,一语中的,非常喜欢你postman这个文章,感谢感谢

96

你好,我在Tests中 postman.setEnvironmentVariable设置了一个uuid的变量,直接通过postman发送请求,就可以设置成功;
如果通过Newman运行,该变量值设置的就是undefined;所以运行一直失败,求大师指导

5435

你好,想问一下,postman可以做并发测试吗?并发量不大的,几十个吧

10693
keithmork · #27 · 2016年12月26日 作者

#25楼 @sunxia 在postman的主界面手动点发送 默认会保存环境变量

但在runner和newman都是默认不保存,你指定集合a/文件夹a运行,改了environment对象,下次指定集合b/文件夹b运行是拿不到的

像uuid这种没法写死在环境变量文件的值建议在同一个集合/文件夹里随设随用

10693
keithmork · #28 · 2016年12月26日 作者

#26楼 @hw_ 它是同步发请求的,没有并发,服务器都是串行处理

简单点可以用腾讯这网页测 http://wetest.qq.com/gaps/
复杂点可以用jmeter

4804

postman 怎么获取登录的token 传给下一个用例使用?

4804



第二个用例里面怎么用第一个的登录token

10693
keithmork · #31 · 2016年12月26日 作者

#30楼 @396266318 想从某个接口的返回数据里提取东西要在tests里写,先解析json字符串,拿到需要的属性再设为环境变量

比如

let json = JSON.parse(responseBody);
postman.setEnvironmentVariable('token', json.data);

之后就可以在下一个请求参数传{{token}}

(我这里偷懒省了try catch

token和json是随你取的变量名,data是你返回值里的字段名,responseBody(字符串)是Postman的全局变量

96

#17楼 @keithmork 是没有录入浏览器的操作。现在已经解决了。谢谢

4804

@keithmork 还是不可以哦!
可以加下你的QQ吗?我的QQ 396266318

3502

@keithmork 楼主,我有个小问题请教一下,Tests里面可以断言responseBody的参数吗?

tests[[INFO] Request params: ${JSON.stringify(request.data)}] = true; // 显示所有请求参数

那么请问怎么显示所有responseBody参数?
tests[[INFO] responseBody params: ${JSON.stringify(responseBody.data)}] = true 这个吗?

10693
keithmork · #35 · 2017年01月06日 作者

#34楼 @tangtest4 GUI下直接就看到了,想在newman的报告里看用

tests[`${responseBody}`] = true;

responseBody是个字符串

96

最近在研究postman,感觉快入门了,不过有个问题一直无法突破,特来求教:
如下图,post时需要带body,参数名为“tid”,我建了个变量“ttid”,这个tid是递增的数字,需要做的是一直测试一个tid,如果fail则一直测这个tid,如果通过则将tid+1,然后测“tid+1”这个,请问这样的问题该如何实现?谢谢!

96

你好,我想问一下,,怎么让返回的值参数化验证,比如我传1,返回是10,传2返回20,怎样在test里写验证传不同的指会返回不同对应的值呢

96

你好, 看到postman官方提供的api: postman.setNextRequest, 这个api说的是可以将文件夹串行? 我有以下场景:
6个文件夹: a,b,c,d,e,f. 每个文件夹中有4个以上的用例(增删改查等). 因为系统设计是一个树状的结构, 所以从a到f有依赖关系, 分别是父子关系, 所以我想在每一个文件夹内组织好用例的顺序(也就是实际运行顺序?), 然后在每一个文件夹的最后一个用例的Test中写上postman.setNextRequest('下一个文件夹的第一个用例的名称'); 想这样串行来自动化测试接口, 不知道行不行?

希望得到您的回复.

10693
keithmork · #39 · 2017年02月15日 作者

#38楼 @butterfly5211314 应该不行,这接口针对请求的,写死请求的名字调用

目前想不同文件夹按顺序执行似乎只能靠名字排序了,比如001_xxx, 002_xxx,但这样以后你想在中间插几个或调整顺序就要改名,挺麻烦

如果在用newman的话干脆保存成不同集合文件,在shell脚本里自己控制测试顺序

【2017-07-26更新】最新版支持文件夹排序和多级文件夹了

96

#39楼 @keithmork 你的意思是说文件夹执行顺序是按名称排序的吗?

96

#39楼 @keithmork 那这个setNextRequest的作用在哪里呢? 有点不明白了.

10693
keithmork · #42 · 2017年02月16日 作者

#41楼 @butterfly5211314 就是同一文件夹下面,用这方法可以用名字指定你想要的接口执行,比如又回到前面跑过的再跑一次……目前也就这点可怜的流程控制功能了

我的用法是在有些地方失败之后再来一次,例如随机的用户名注册,如果碰巧注册过了就重来。这种断言要稍微多处理点情况,比如几次重试用光之前不能算断言失败啊之类

43楼 已删除
44楼 已删除
3502

@keithmork responsebody返回一个list,想把list的某个元素保存到环境,以便后面的cases调用做传参数,这个一直没弄好(麻烦高告知下,像图里要把productstoreID作为环境变量)

4817
3502tangtest4 回复

先把你的response json格式化,然后通过json方式去获取你要的value就可以了,如下:

//将response格式化成json
var jsonData = JSON.parse(responseBody);
if(cart in jsonData){
    //获取返回值中productStoreId对应的value值
    var pSId = jsonData.cart.productStoreId;
    //将pSId保存到环境变量productstoreID中
    postman.setEnvironmentVariable("productstoreID", pSId);
}

以上供参考,其它的判断自己看着加吧

3502
4817xiaobeiying 回复

恩谢谢你,
我当初提出这个问题是自己没去研究
后来自己去研究了下,已经明白list和数组的参数,在postman的环境取值方式了
加油

3502
10693keithmork 回复

楼主,我是44,有个小问题需要请教您:
postman里在test模块,怎么把responsebody里某个指定参数,跟环境变量里的某个指定参数(上个请求requestbody里的某个参数设置在环境变量里)做断言??

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册