接口測試教程 PostMan(三)斷言(后置腳本)

但凡能稱得上測試工具的軟件,必然需要具備斷言的功能。

做任何測試的時候,都必須要判斷我們的測試是否有效果。

寫測試用例時,一個有效的測試用例必須包含操作過程、和預期結(jié)果。預期結(jié)果,是我們判斷程序是否存在 bug 的重要參考。

手工測試時,我們通過肉眼去確認程序的實際操作后呈現(xiàn)的結(jié)果與我們用例中的預期結(jié)構(gòu)是否匹配。比如登錄,輸入賬號密碼后,需要檢查是否真正的登錄系統(tǒng),頁面是否發(fā)生了跳轉(zhuǎn)等,這都是在檢查程序的實際運行結(jié)果與我們預期的結(jié)構(gòu)是否匹配的過程。

那在自動化中,如何去判斷功能的正確性?就需要測試工具或者框架提供相應的功能來檢查程序的實際運行結(jié)果和預期結(jié)構(gòu)是否匹配,而這個檢查過程 ,需要我們自己寫在代碼或者工具中。而這個檢查過程,就是斷言。

Postman 中提供了一系列的斷言,不過都是通過提供預設的 JavaScript 語言代碼來實現(xiàn)的。要使用 Postman 的斷言,需要稍微有那么一點 JavaScript 基礎(chǔ)。

Postman 的斷言,必須要寫在 Tests中。

我們斷言主要用 Postman 中預設的一些代碼,你可以拖動一下預設代碼部分,你空可以看到很多的斷言語句,主要分為以下幾類:
1. 狀態(tài)碼斷言:

  • Status code: Code is 200
    判斷狀態(tài)碼是否正確;默認判斷狀態(tài)是否為 200, 可修改;
  • Status code:Successful POST request
    判斷狀態(tài)碼是否為預期結(jié)果之一;比如默認斷言狀態(tài)碼是否是 201, 202 中的一個;
  • Status code:Code name has string
    判斷狀態(tài)碼描述是否包含字符串,比如是否包含 Created;

2. 響應結(jié)果斷言:

  • Response body: Contains string
    響應結(jié)果是否包含字符串;
  • Response body: JSON value check
    響應結(jié)果如果是 JSON,檢查具體的 JSON 值;
  • Response body: Is equal to a string
    響應結(jié)果與字符串是否全部匹配預期的字符串;
  • Response body: Convert XML body to a JSON Object
    將 XML 轉(zhuǎn)換成 JSON;

3. Header 斷言:

  • Response headers:Content-Type header check
    響應頭部中是否包含字段;

4. 速度斷言:

  • Response time is less than 200ms
    響應時間是否少于多少 ms。

以上的斷言方式,都可以按需選擇。

不過就個人的理解和使用而言,響應結(jié)果斷言用得最多。主要是以下三種斷言:

  • Response body: Contains string
  • Response body: JSON value check
  • Response body: Is equal to a string

接下來,我們就詳細看一下這三種斷言如何使用。
1. Response body: Contains string
用來斷言響應結(jié)果是否包含某字符串??梢哉J為是預期結(jié)果是否包含在實際結(jié)果中。比如我們的案例 showdoc 中有一個接口 /api/user/info,其返回值如下:

{
    "error_code": 0,
    "data": {
        "uid": "1",
        "username": "showdoc",
        "email": null,
        "name": "Nemo",
        "avatar": null,
        "avatar_small": null,
        "groupid": "1"
    }
}

那我們?nèi)绻@個接口沒有問題,獲取用戶資料成功,結(jié)果中就應該包含showdocNemo的字符串。那么我們就可以使用Contains string來斷言。
直接在 Postman 的 Tests 欄右側(cè)點擊Response body: Contains string會出現(xiàn)預設代碼:


我們可以看到點擊之后出現(xiàn)了一段 JavaScript 代碼段??吹酱a不要驚慌,我們不需要去動這段代碼,我們只需要修改圖中 ①②兩個部分的內(nèi)容。這兩個部分都是由引號包裹起來的字符串。

  • ① 表示斷言標題,也就是你這個斷言的目的是什么,主要是方便后續(xù)在運行時可以分辨出測試目的;
  • ② 表示你的預期結(jié)果,也就是你預期結(jié)果中出現(xiàn)什么內(nèi)容。
    這里,我們預期結(jié)果中出現(xiàn) showdocNemo,那就需要寫兩條斷言:
// 注意兩段引號中的內(nèi)容
pm.test("判斷用戶名showdoc是否包含于響應結(jié)果", function () {
    pm.expect(pm.response.text()).to.include("showdoc");
});
pm.test("判斷用戶姓名Nemo是否包含于響應結(jié)果", function () {
    pm.expect(pm.response.text()).to.include("Nemo");
});

寫好后,運行一下。



可以看到,在下方的 Test Results 中會展示斷言的結(jié)果,PASS 或者 FAIL.

這種斷言方式可以用在任何地方,任意文本格式的數(shù)據(jù)。但是要注意使用的時候,慎重選取包含的內(nèi)容,也就是預期結(jié)果。

2. Response body: JSON value check
這個方法,稍微難一點,其用途是將 JSON 格式的響應結(jié)果轉(zhuǎn)換成 JavaScript 對象 ,然后指定其中某一個字段的值進行斷言。

簡單來說,就是預期某一個具體字段的值是否符合預期,是一種更精確的斷言方式。缺點是只支持響應結(jié)果為 Json 格式的接口。

同樣,我們在右側(cè)點擊Response body: JSON value check,會出現(xiàn)如下代碼段:


這里比 contains string 斷言方式對了一個需要關(guān)注的地方。

  • ① 斷言標題
  • ② 預期結(jié)果
  • ③ 指定斷言的字段

這里比較麻煩的是第三點jsonData.value的意思。

要明白jsonData.value,我們首先要明白 jsonData 怎么來的。

我們看預設代碼中的第二句var jsonData = pm.response.json();

在 Postman 中有一個內(nèi)置的 JavaScript 庫 pm, 里面提供了請求處理過程中的很多函數(shù)。pm.response是指當前請求接收到的響應 body 內(nèi)容(不能理解的同學先看看 HTTP 內(nèi)容)。這里接口的響應 body 是一個 json 字符串,也就是我們上面展示的返回值。
json()方法是把 JSON 字符串轉(zhuǎn)換為 JavaScript 對象。

至此,var jsonData = pm.response.json(); 變量 jsonData 相當于就是一個 JavaScript 對象。我們可以打印出來看看,當然要想看到打印結(jié)果需要使用快捷鍵(Ctrl+Alt+C)打開Postman Console。


我們可以看到,打印出來的 jsonData 是一個 JavaScript 對象,其中包含了響應結(jié)果的所有內(nèi)容。

那么預設代碼的第三點,就是要通過 jsonData 里面的對象層級來提取對應字段的值去和預期結(jié)果做比較。

比如,我依然想判斷 username 字段的值預期是否為 showdoc。那就需要從 jsonData 變量中提取出來。但是我們發(fā)現(xiàn) username 字段是在 data 內(nèi)部。當然這里不是很直觀,我們可以在 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');
});

好好體會一下,是否明白?

最后,如果你是斷言數(shù)值類型的話,第三句的 eql()函數(shù)還有其他幾種用法:

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

3. Response body: Is equal to a string
最后一種常用的,是預期結(jié)果與實際結(jié)果完全匹配。注意是完全哦,符號、空格都不能有區(qū)別。


代碼如下:

pm.test("響應結(jié)果是否完全符合預期", 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),需要使用反斜杠“\”轉(zhuǎn)義。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容