本文适于对于需要自己写接口,自己测试的人,如果没此需求的人,可收藏后续学习。
最近不少时间在写接口,发现之前用的多但是不深的 postman 让我惊艳,原来它不仅能做发送请求,而且包含了:
- 层级管理
- 环境管理
- 自动化测试
- 团队协作
- 其他功能
今天就从前端视角为大家一一介绍一下。
一、层级管理
postman 的层级分为四层,分别为:
- workspace
- collection
- request
- example
workspace
workspace 工作空间,你可以理解为不同的身份和组,比如你在家自己写的项目和公司的项目就不应该在一个 workspace,你在 A 组借调到 B 组,也应该创建不同的 workspace,具体操作如下:
我们点击 postman 左上角的 workspaces 即可弹出 workspaces 的列表。
我们可以点击 ··· 进行编辑操作。
至于编辑界面和新增多个 workspace 这里就不做演示了,相信大家都懂。
collection
一个 workspace 可以创建多个 collection,collection 相当于项目的含义,例如你所在项目组有小程序和后端系统,那就应该建立两个 collection。
collection 不仅可以有一个级别,而是多个级别,我推荐是根据 controller 去创建,一一对应,并且如果接口有参数,请需要为每个接口创建一个文件件,其最后的结构大概如此:
request 和 example
request 就是单个请求,至于怎么发请求,之类的,相信用过的都会,这里就不做演示了。至于 example ,只是为了展示测试用例,并不能真正执行,作为前端也用不到,这里也不做赘述。
二、环境管理
创建环境
在日常开发中,我们有本地开发环境、测试环境、预发布环境、生产环境,不同环境之间的除了请求地址和个别点不同外,其他都是相同的,以前都是 CV 大法,现在 postman 给我们提供了好用的环境管理,具体操作如下:
点击左侧的
Environments
,然后点击 +
号,就可以创建环境:
我们在每个环境中都建立
domain
字段,例如:
- 开发环境为: http://192.168.0.102:8080
- 测试环境为:test.my-blogs.com
- 正式环境为:www.my-blogs.com
环境使用
首先我们圈 1 中环境列表下拉框,选择一个环境,然后再我们要使用的地方,使用
{{变量}}
的语法即可引用到此变量,这也就是是 postman 的变量使用方式。
postman 中的变量,不仅可以出现在 URL 中,而是可以出现在任何能输出东西的地方,包括 body 参数和 params。
自动化测试
我们自己在写接口时,时长需要去比对结果是否与预期一致,而且需要确保上到测试环境和预发布后的正常,这就需要做的工作比较多了,而 postman 提供了简单易用的自动化测试方法。
console 和控制台
我们在请求中可以看到 Tests 这样的菜单,此处就是我们写测试的地方,并且在左下角还有类似 console 的控制台,方面我们做调试和输出,例如上面我们就输出了
----hello world---
。
基本使用
我们在右侧看到它有很多的代码提示片段,我们点击
Status code: Code is 200
,然后就会发现左侧内容区多出了如下内容:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
然后我们点击 Send
发送按钮后,在底部的 Test Results(1/1)
中就有结果,绿色的 PASS
说明通过了。
pm 对象和断言
上面的测试代码实际包含了两个重要内容,一个是 pm
对象及内容,另一个是断言的写法。首先说明 pm 对象就是 postman
的简写,而其断言实际用的就是 Chai 断言库。
对于 Chai 断言库,网上已经有较多的教程了,包括官网,我这里就不做赘述,接下来注重讲解一下 pm 的对象。
pm 对象主要包含了三点功能:
- 断言功能
- 获取请求和响应结果
- 获取和设置变量
断言功能
pm.test("string", fn)
一个 test 相当于一个用例pm.expect(xxx).to
是 Chai 库断言的expect
写法pm.response.to.be
对 response 进行断言
获取请求和响应结果
pm.request.
获取请求相关信息pm.response.
获取响应相关信息pm.response.json()
将响应结果的的data
转为json
格式pm.response.code
状态码
pm.cookies
获取和设置 cookiepm.cookies.get("xx")
获取一个 cookiepm.cookies.set("xx", "xxx")
设置一个 cookie
获取和设置变量
pm.environment
获取和设置环境变量pm.environment.get("xxx")
获取一个环境变量pm.environment.set("xxx", "xxx")
设置一个环境变量
pm.globals
获取和设置一个全局变量(全局变量后面会再提起)pm.globals.get("xxx")
获取一个全局变量pm.globals.set("xxx", "xxx")
设置一个全局变量
pm.collectionVariables
获取和设置一个集合例的变量(用法同上)pm.variables
获取和设置变量(以上三者设置的变量都可以获取到)
常见断言
我们以如下响应结果为例,讲解一下常见的断言:
{
"errno": 0,
"data": [
{
"k": "a",
"v": "art. 一(个); 每一(个); 任一(个)"
},
{
"k": "A",
"v": "n. 英语字母表的第一个字母; A音; 第一等; 第一个 abbr. 安培"
},
{
"k": "a.",
"v": "abbr. adjective 形容词"
}
]
}
- 状态码断言
pm.test("status code is 200", () => {
pm.expect(pm.response.code).to.eq(200)
})
- 错误码为 0
在我们工作中,很多时候并不以状态码作为判断依据,而是根据响应结果例的 errno
或者 code
作为判断依据,例如:
pm.test("errno is 0", () => {
const response = pm.response.json()
pm.expect(response.errno).to.eq(0)
})
- 判断响应结果为对象或者数组类型
因为接口返回的数据,我们并不能精确知道结果,例如我们通过把 {"name": "张三"}
作为判断依据,因为当用用户是李四的时候,测试就通不过了,所以一般仅需要判断其类型和重点之处即可:
pm.test("data is arrray", () => {
const response = pm.response.json()
pm.expect(response.data).to.be.a("array")
pm.expect(response.data.length).greaterThan(0)
})
- 判断是否存在
expect('foobar').to.include('foo');
expect([1, 2, 3]).to.include(2);
expect('foobar').to.match(/^foo/);
expect({a: 1}).to.have.property('a');
expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']);
expect({a: 1, b: 2}).to.have.any.keys('a');
批量执行
当我们选中文件夹时,看到它身上也有
Tests
,所以我们可以将共性的测试用例放到这里面,这样所有自用例都会执行,然后我们点击右上角的 Run
会弹出如下界面:
点击
Run my-blog
后,会出现如下界面:
我们看到
status code is 200
在每个接口上都执行了。
接口联动和变量
在我们日常开发中经常遇到需要先登录然后才能调用其他接口,或者创建一个文章,返回文章 id 后再将其删除,这就涉及到接口联动了。
postman 的解决思路简单,就是在不同的请求之间通过变量进行值的传递,我们以登录为例:
首先在登录接口判断登录是否成功,如果成功,则设置全局环境变量:
const response = pm.response.json()
pm.globals.set("access_token", response.access_token); // 设置环境变量
我们可以点击右上角的眼睛图案,可以看到已经设置成功了:
然后我们发起其他请求,就可以携带上 access_token 参数了:
我们看到控制台中 access_token 已经被替换成之前设置的全局变量了。这样就达到了跨接口的参数传递了。
参数签名
为了安全考虑,业务中通常会对参数做签名防止参数被篡改,那么我们在 postman 中怎么做呢?
postman 处理方式也很简单,就是在真正发起请求之前,可以执行一段脚本,这段脚本中你可以任意修改请求参数,这样就达到了对参数做签名处理的目的。
首先 postman 提供了
Pre-request Script
,其次它提供了功能做各种加密功能的 CryptoJS
,然后我们获取到 body
参数,并对其做了简单处理后增加了 sign
属性,最后在右下角控制台看到了 sign
已经被我们加到请求 body 里。
其他实用功能
导入 Chrome 请求
日常开发中在排查问题时,需要发起重复请求,所以能够将 Chrome 中的 network 请求导入到 postman 中重复发起。
第一步:打开 network,找到需要导入的请求,右键,点击 Copy
选择 Copy as cURL
。
第二步:点击 postman 的
Import
第三步:选择
Raw text
,并将复制的内容粘贴,点击 Continue
第四步:点击
Import
然后就看到可以导入成功了
生成代码
我们可以导入,也可以导出,方法如下:
点击 postman 的代码图标
选择自己想要复制的语言即可。
结束语
postman 还有团队协作、mock 数据等功能,这里我用的不多也不做过多介绍。总体来说,接口自动化测试的方式有很多,包括 postman、JMeter、Python 代码或者其他任意语言的测试框架,但是 postman 应该是最简单也是最符合前端需求的自动化接口测试框架。