赞
踩
但凡能称得上测试工具的软件,必然需要具备断言的功能。
做任何测试的时候,都必须要判断我们的测试是否有效果。
写测试用例时,一个有效的测试用例必须包含操作过程、和预期结果。预期结果,是我们判断程序是否存在 bug 的重要参考。
手工测试时,我们通过肉眼去确认程序的实际操作后呈现的结果与我们用例中的预期结构是否匹配。比如登录,输入账号密码后,需要检查是否真正的登录系统,页面是否发生了跳转等,这都是在检查程序的实际运行结果与我们预期的结构是否匹配的过程。
那在自动化中,如何去判断功能的正确性?就需要测试工具或者框架提供相应的功能来检查程序的实际运行结果和预期结构是否匹配,而这个检查过程 ,需要我们自己写在代码或者工具中。而这个检查过程,就是断言。
Postman 中提供了一系列的断言,不过都是通过提供预设的 JavaScript 语言代码来实现的。要使用 Postman 的断言,需要稍微有那么一点 JavaScript 基础。
Postman 的断言,必须要写在 Tests
中。
我们断言主要用 Postman 中预设的一些代码,你可以拖动一下预设代码部分,你空可以看到很多的断言语句,主要分为以下几类:
1. 状态码断言:
Status code: Code is 200
Status code:Successful POST request
Status code:Code name has string
2. 响应结果断言:
Response body: Contains string
Response body: JSON value check
Response body: Is equal to a string
Response body: Convert XML body to a JSON Object
3. Header 断言:
Response headers:Content-Type header check
4. 速度断言:
Response time is less than 200ms
以上的断言方式,都可以按需选择。
不过就个人的理解和使用而言,响应结果断言用得最多。主要是以下三种断言:
Response body: Contains string
Response body: JSON value check
Response body: Is equal to a string
接下来,我们就详细看一下这三种断言如何使用。
1. Response body: Contains string
用来断言响应结果是否包含某字符串。可以认为是预期结果是否包含在实际结果中。比如我们的案例 showdoc 中有一个接口 /api/user/info
,其返回值如下:
{
"error_code": 0,
"data": {
"uid": "1",
"username": "showdoc",
"email": null,
"name": "Nemo",
"avatar": null,
"avatar_small": null,
"groupid": "1"
}
}
那我们如果这个接口没有问题,获取用户资料成功,结果中就应该包含showdoc
和Nemo
的字符串。那么我们就可以使用Contains string
来断言。
直接在 Postman 的 Tests 栏右侧点击Response body: Contains string
会出现预设代码:
我们可以看到点击之后出现了一段 JavaScript 代码段。看到代码不要惊慌,我们不需要去动这段代码,我们只需要修改图中 ①②两个部分的内容。这两个部分都是由引号包裹起来的字符串。
showdoc
和Nemo
,那就需要写两条断言:// 注意两段引号中的内容
pm.test("判断用户名showdoc是否包含于响应结果", function () {
pm.expect(pm.response.text()).to.include("showdoc");
});
pm.test("判断用户姓名Nemo是否包含于响应结果", function () {
pm.expect(pm.response.text()).to.include("Nemo");
});
写好后,运行一下。
可以看到,在下方的 Test Results 中会展示断言的结果,PASS 或者 FAIL.
这种断言方式可以用在任何地方,任意文本格式的数据。但是要注意使用的时候,慎重选取包含的内容,也就是预期结果。
2. Response body: JSON value check
这个方法,稍微难一点,其用途是将 JSON 格式的响应结果转换成 JavaScript 对象 ,然后指定其中某一个字段的值进行断言。
简单来说,就是预期某一个具体字段的值是否符合预期,是一种更精确的断言方式。缺点是只支持响应结果为 Json 格式的接口。
同样,我们在右侧点击Response body: JSON value check
,会出现如下代码段:
这里比 contains string 断言方式对了一个需要关注的地方。
这里比较麻烦的是第三点jsonData.value
的意思。
要明白jsonData.value
,我们首先要明白 jsonData 怎么来的。
我们看预设代码中的第二句var jsonData = pm.response.json();
在 Postman 中有一个内置的 JavaScript 库
pm
, 里面提供了请求处理过程中的很多函数。pm.response
是指当前请求接收到的响应body
内容(不能理解的同学先看看 HTTP 内容)。这里接口的响应 body 是一个 json 字符串,也就是我们上面展示的返回值。
json()
方法是把 JSON 字符串转换为 JavaScript 对象。
至此,var jsonData = pm.response.json();
变量 jsonData
相当于就是一个 JavaScript 对象。我们可以打印出来看看,当然要想看到打印结果需要使用快捷键(Ctrl+Alt+C
)打开Postman Console
。
我们可以看到,打印出来的 jsonData 是一个 JavaScript 对象,其中包含了响应结果的所有内容。
那么预设代码的第三点,就是要通过 jsonData 里面的对象层级来提取对应字段的值去和预期结果做比较。
比如,我依然想判断 username 字段的值预期是否为 showdoc。那就需要从 jsonData 变量中提取出来。但是我们发现 username 字段是在 data 内部。当然这里不是很直观,我们可以在 Postman 上看。
我们提取时,需要用jsonData.data.username
来提取 username 的值,也就是说需要按层级来。
如果想取 error_code 的话,直接写为jsonData.error_code
即可。
我们的断言代码就可以写为:
// 注意观察我们标注出的三个部分代码的变化
pm.test("判断username字段的值是否为showdoc", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.data.username).to.eql('showdoc');
});
好好体会一下,是否明白?
最后,如果你是断言数值类型的话,第三句的 eql()
函数还有其他几种用法:
3. Response body: Is equal to a string
最后一种常用的,是预期结果与实际结果完全匹配。注意是完全哦,符号、空格都不能有区别。
代码如下:
pm.test("响应结果是否完全符合预期", function () {
pm.response.to.have.body('{"error_code":0,"data":{"uid":"1","username":"showdoc",\
"email":null, "name":"\\u61d2\\u732bNemo","avatar":null,"avatar_small":null,"groupid":"1"}}');
});
这里要注意两点:
\u61d2\u732b
),需要使用反斜杠“\”转义。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。