我們檢驗一個測試用例是否通過,一般會將我們心理預期的結果與實際結果進行比對,如果結果一致則證明測試通過,如果結果不一致,則證明測試不通過,這即是我們經常所說的斷言。
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指令碼,你也可以編寫迴圈、判斷、輸出到控制檯等程式碼。