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

Keith Mo · 2016年12月03日 · 最后由 EthanYin 回复于 2019年01月19日 · 18146 次阅读
本帖已被设为精华帖!

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 集合使用说明

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 45 条回复 时间 点赞

以上全是我编的,我实在编不下去了……😆


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

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

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

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

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

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

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

恒温 将本帖设为了精华贴 12月03日 10:10
45楼 已删除
44楼 已删除

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

#5 楼 @Lihuazhang

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

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

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

新手报到

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

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

#10 楼 @qq329999897

嗯 目前是这么用的

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

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

先马住😋

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

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

#15 楼 @zxd2010112123

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

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

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

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

图一:

图二:

Keith Mo Postman 做接口自动化测试-2. 常用代码片段 中提及了此贴 12月09日 20:35

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

比如

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

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

(我这里偷懒省了 try catch

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

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

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

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

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

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

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

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

responseBody 是个字符串

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

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

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

希望得到您的回复.

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

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

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

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

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

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

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

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

47楼 已删除
48楼 已删除

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

Test44 回复

先把你的 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);
}

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

小背影 回复

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

Keith Mo 回复

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

丹丹 回复

需要设置本机代理

新手入门,想请教一个问题,如果 想获取 body 填的所有请求参数及值,如果获取??

老哥,现在还在玩 Postman 么?

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