我們檢驗一個測試用例是否通過,一般會將我們心理預期的結果與實際結果進行比對,如果結果一致則證明測試通過,如果結果不一致,則證明測試不通過,這即是我們經常所說的斷言。
1、Tests的介紹
Postman中的斷言是使用請求后腳本Tests,是對狀態碼、響應頭、響應正文等信息進行斷言操作。
在Postman中封裝了我們常見的斷言代碼片段,當然Tests除了可以作為斷言,還可以當做后置處理器。
經常應用於:
- 斷言。
- 獲取當前接口的響應數據,傳遞給下一個接口。
提示:在一個請求或者一個集合都可以定義
Tests,在集合中定義Tests,表示集合中的每一個請求響應后,都需要執行Tests中的斷言腳本。
點擊請求中的Tests標簽項,如下圖:

我們可以在上圖看到,在Tests標簽頁的右側邊欄中,Postman為我們提供了一些常用的代碼模版。
提示我們:
Test scripts are written in JavaScript, and are run after the response is received.
測試腳本用JavaScript編寫,並在收到響應后運行。
Learn more about tests scripts
點擊這里,可以學習更多關於測試腳本的資料。
學習關於
Tests的更多用法,請進入后面鏈接:https://go.pstmn.io/docs-test-scripts。
總結:
(1)Postman測試沙箱的執行順序
- 在發送Request之前,執行
Pre-request Script中的js腳本,可定制化Request(准備數據)。 - 收到Response之后,執行
Tests中的腳本,處理返回的數據(斷言或者處理數據)。
整個流大概是這樣的:

(2)Postman中Tests的作用
- 做斷言:可以斷言狀態碼或者斷言返回數據中的字段。
- 取返回值:做流程接口的時候,向下傳遞返回數據。
2、常用SNIPPETS(片段)說明
(1)常用變量相關
Get an environment variable:獲取一個環境變量。Get a gloval variable:獲取一個全局變量。Get a variable:獲取一個變量(本地)。Set an environment variable:設置一個環境變量。Set a global variable:設置一個全局變量。Clear an environment variable:清空一個環境變量。Clear a global variable:清空一個全局變量 。
使用:
- 獲取變量:如果在下一個請求中用到上一個請求的返回值,可以使用“設置一個環境變量”,將請求的返回值設置為環境變量,在下一個請求中,使用“獲取一個環境變量”取到該值。
- 清空變量:這里的清空等於刪除變量,一個參數使用完成后,需要刪除,或者清空值都可以使用該方法。
(同前一篇Pre-request Script的使用方式一樣)
(2)狀態碼相關
Status code: Code is 200:判斷狀態碼是否正確;默認判斷狀態是否為 200, 可修改。pm.test("Status code is 200", function () { pm.response.to.have.status(200); });Status code:Successful POST request:
判斷狀態碼是否為預期結果之一;比如默認斷言狀態碼是否是 201, 202 中的一個。pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201, 202]); });Status code:Code name has string
判斷狀態碼描述是否包含字符串,比如是否包含 Created。pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); });
(3)響應結果斷言:
Response body: Contains string:
響應結果是否包含字符串;
注意:這只能檢查Response body中raw格式展示的返回數據,如果raw格式展示的返回數據中,有中文數據未解碼,也只能匹配未解碼形式的內容,且匹配包含不唯一(工作中很少見,一般接口返回數據中不會設計重復字段)。pm.test("Body matches string", function () { // 比如raw中的數據,“學院”沒有進行Unicode解碼,就只能如下方式進行比對。 pm.expect(pm.response.text()).to.include("例如:\u5b66\u9662"); });Response body: JSON value check:
響應結果如果是 JSON格式的數據,檢查具體的 JSON字段的值;
實際工作中基本就用這個方式。(下面有練習好好看看)pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); });Response body: Is equal to a string:
響應結果與字符串是否全部匹配預期的字符串;
就是在把Response body的數據用raw格式展示,然后全部復制到下面位置。pm.test("Body is correct", function () { pm.response.to.have.body("raw格式展示的返回數據,全部復制到這里"); });Response body: Convert XML body to a JSON Object:
將 XML 轉換成 JSON;var jsonObject = xml2Json(responseBody);
等等還有很多,用的時候我們可以查看相關文檔。
(4)Header :
Response headers:Content-Type header check
響應頭部中是否包含字段,代碼片段如下:
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type(這里填寫請求頭屬性)");
});
(5)響應速度:
Response time is less than 200ms
響應時間是否少於多少 ms。
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
3、示例
(1)響應碼斷言
我們以“添加學院測試為例”
1)准備數據
在Pre-request Script編輯如下代碼,來准備數據
// 隨機生成一個3位數字的id
var dep_id = Math.floor(Math.random()*1000);
pm.environment.set("depid" , dep_id); //設置到環境變量中
// 隨機生成學院名稱dep_name
// 隨機生成一個10位的字符串
var data = Math.random().toString(36).slice(-10) ;
var dep_name = data+"學院";
pm.environment.set("dep_name" , dep_name);//設置到環境變量中
// 隨機生成院長的名字
var first_name = ["趙","錢","孫","李","劉"];
var last_name = ["子鼠","丑牛","寅虎","牟兔","辰龍","巳蛇"];
var master_name = first_name[Math.floor(Math.random() * (first_name.length))] +last_name[Math.floor(Math.random() * (last_name.length))];
pm.environment.set("master_name" , master_name);//設置到環境變量中
// 隨機生成口號
var slogan_str = ["吃飯","睡覺","打豆豆"];
var slogan = slogan_str[Math.floor(Math.random() * (slogan_str.length))];
pm.environment.set("slogan" , slogan);//設置到環境變量中
// 很low的代碼,只做練習
2)編輯請求所要提交的數據

3)編寫Tests中的斷言
使用Tests中的Status code: Code is 200內置代碼片段。
// 用來斷言接口請求的狀態碼,針對HTTP協議狀態碼。
// pm.test 表示Postman進行測試斷言
// "Status code is 200" 表示斷言的名稱或者說明,一般和測試用例同名
// function 表示 執行斷言的方法
pm.test("新增學院請求正常放回201", function () {
pm.response.to.have.status(201);
});
4)查看斷言結果
如下圖:

提示:
Test Results(1/1):表示一共有1個斷言,執行通過了1個斷言。
All:表示顯示所有斷言。
Passed:表示只顯示通過的斷言。
Skipped:表示只顯示跳過的斷言。
Failed:表示只顯示失敗的斷言。
當我們斷言執行失敗時,也會有詳細提示,如把上面的狀態碼改成202。

AssertionError: expected response to have status code 202 but got 201
AssertionError:預期響應的狀態碼為202,但得到201。
(2)返回值斷言(非常頻繁)
返回值斷言,就是對接口返回的數據(body主體)中的字段進行驗證。
以返回值為json格式的數據為例:
這里先標識一下,接口的實際返回結果如下:
{
"create_success": {
"count": 1,
"results": [
{
"dep_id": "637",
"dep_name": "k7iwvtgk2h學院",
"master_name": "李子鼠",
"slogan": "睡覺"
}
]
},
"already_exist": {
"count": 0,
"results": []
}
}
同上面練習,直接編寫Tests中的斷言,
使用Tests中的Response body: JSON value check內置代碼片段。
// 斷言返回值為json格式的數據
// pm.test 表示Postman進行測試斷言
// "Your test name" 表示斷言的名稱或者說明,一般和測試用例同名
// function 表示 執行斷言的方法
// jsonData 表示接口返回的所有數據
// pm.expect 表示設置斷言的預期
// jsonData.value 表示取具體的某一字段,一級一級點下去就可以(層級關系)
pm.test("斷言添加學院數量", function () {
var jsonData = pm.response.json(); // 獲取返回值所有數據
pm.expect(jsonData.create_success.count).to.eql(1); // 斷言返回值中具體字段的值
});
然后執行並查看結果:

說明:
如果結果返回的json數據中有數組,如下:我們要取slogan字段
{
"create_success": {
"count": 1,
"results": [
{
"dep_id": "637",
"dep_name": "k7iwvtgk2h學院",
"master_name": "李子鼠",
"slogan": "睡覺"
}
]
},
"already_exist": {
"count": 0,
"results": []
}
}
需要如下方式進行選取:
pm.test("斷言添加學院的口號", function () {
// 獲取返回值所有數據,賦值給jsonData
var jsonData = pm.response.json();
// 可以使用console.log在控制台輸出內容,進行調試
// console.log(jsonData.create_success.results[0].slogan)
// 斷言返回值中具體字段的值
pm.expect(jsonData.create_success.results[0].slogan).to.eql("哈哈哈"); //這里是重點
});
其他代碼片段使用方式同理,這里就不一一舉例了。其實
Tests中編寫的就是JavaScript腳本,你也可以編寫循環、判斷、輸出到控制台等代碼。
