接口测试教程 PostMan(三)断言(后置脚本)

但凡能称得上测试工具的软件,必然需要具备断言的功能。

做任何测试的时候,都必须要判断我们的测试是否有效果。

写测试用例时,一个有效的测试用例必须包含操作过程、和预期结果。预期结果,是我们判断程序是否存在 bug 的重要参考。

手工测试时,我们通过肉眼去确认程序的实际操作后呈现的结果与我们用例中的预期结构是否匹配。比如登录,输入账号密码后,需要检查是否真正的登录系统,页面是否发生了跳转等,这都是在检查程序的实际运行结果与我们预期的结构是否匹配的过程。

那在自动化中,如何去判断功能的正确性?就需要测试工具或者框架提供相应的功能来检查程序的实际运行结果和预期结构是否匹配,而这个检查过程 ,需要我们自己写在代码或者工具中。而这个检查过程,就是断言。

Postman 中提供了一系列的断言,不过都是通过提供预设的 JavaScript 语言代码来实现的。要使用 Postman 的断言,需要稍微有那么一点 JavaScript 基础。

Postman 的断言,必须要写在 Tests中。

我们断言主要用 Postman 中预设的一些代码,你可以拖动一下预设代码部分,你空可以看到很多的断言语句,主要分为以下几类:
1. 状态码断言:

  • Status code: Code is 200
    判断状态码是否正确;默认判断状态是否为 200, 可修改;
  • Status code:Successful POST request
    判断状态码是否为预期结果之一;比如默认断言状态码是否是 201, 202 中的一个;
  • Status code:Code name has string
    判断状态码描述是否包含字符串,比如是否包含 Created;

2. 响应结果断言:

  • Response body: Contains string
    响应结果是否包含字符串;
  • Response body: JSON value check
    响应结果如果是 JSON,检查具体的 JSON 值;
  • Response body: Is equal to a string
    响应结果与字符串是否全部匹配预期的字符串;
  • Response body: Convert XML body to a JSON Object
    将 XML 转换成 JSON;

3. Header 断言:

  • Response headers:Content-Type header check
    响应头部中是否包含字段;

4. 速度断言:

  • Response time is less than 200ms
    响应时间是否少于多少 ms。

以上的断言方式,都可以按需选择。

不过就个人的理解和使用而言,响应结果断言用得最多。主要是以下三种断言:

  • 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"
    }
}

那我们如果这个接口没有问题,获取用户资料成功,结果中就应该包含showdocNemo的字符串。那么我们就可以使用Contains string来断言。
直接在 Postman 的 Tests 栏右侧点击Response body: Contains string会出现预设代码:


我们可以看到点击之后出现了一段 JavaScript 代码段。看到代码不要惊慌,我们不需要去动这段代码,我们只需要修改图中 ①②两个部分的内容。这两个部分都是由引号包裹起来的字符串。

  • ① 表示断言标题,也就是你这个断言的目的是什么,主要是方便后续在运行时可以分辨出测试目的;
  • ② 表示你的预期结果,也就是你预期结果中出现什么内容。
    这里,我们预期结果中出现 showdocNemo,那就需要写两条断言:
// 注意两段引号中的内容
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()函数还有其他几种用法:

  • eql 等于
  • lt 小于
  • lte 小于等于
  • gt 大于
  • gte 大于等于

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"}}');
});

这里要注意两点:

  • 由于 JSON 格式要求必须使用双引号,因此在外面要使用单引号;
  • 如果遇到中文,会以 ASCII 字符表示(如懒猫,\u61d2\u732b),需要使用反斜杠“\”转义。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容