about
postman同樣支持斷言功能,對於接口的斷言,一般來判斷接口返回的結果是否符合預期。
在postman中,使用Test
腳本來對接口數據進行判斷。
由於Test
腳本會在接口響應后執行,這也意味着,如果有需要在請求結束后要執行的操作都可以在這里執行操作。
除了斷言,也可以在這里對變量進行操作。
Test
腳本基於JavaScript語言,使用postman自帶的Test
模板(可以減少編寫斷言代碼了), 可以快速的生成用例。
模板 | 描述 | 示例 |
---|---|---|
clear a global variable | 清除全局變量 | pm.globals.unset("variable_key"); |
Clear an environment variable | 清除一個環境變量 | pm.environment.unset("variable_key"); |
get a global variable | 得到一個全局變量 | pm.globals.get("variable_key"); |
get a variable | 得到一個變量 | pm.variables.get("variable_key"); |
Get an environment variable | 得到一個環境變量 | pm.environment.get("variable_key"); |
response body:contains string | 檢查response body包含字符串 | pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); |
response body:convert XML body to a JSON object | response body:將XML轉換為JSON對象 | var jsonObject = xml2Json(responseBody); |
response body:is equal to a string | 檢查響應體等於一個字符串 | pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); |
response body:JSON value check | 檢查response body中JSON某字段值 | pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); |
response headers:content-Type header check | 檢查content-Type是否包含在header返回 | pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); |
response time is than 200ms | 響應時間超過200ms | pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); |
send s request | 發送一個請求 | pm.sendRequest("https://postman-echo.com/get", function (err, response) { console.log(resp onse.json()); }); |
set a global variable | 設置一個全局變量 | pm.globals.set("variable_key", "variable_value"); |
set an environment variable | 設置一個環境變量 | pm.environment.set("variable_key", "variable_value"); |
status code:Code is 200 | 狀態碼:代碼是200 | pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); |
status code:code name has string | 狀態碼:代碼中有指定字符串 | pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); }); |
status code:successful POST request | 狀態碼:成功的post請求 | pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201,202]); }); |
use tiny validator for JSON data | 為json數據使用tiny驗證器 | var schema = { "items": { "type": "boolean" } }; var data1 = [true, false]; var data2 = [true, 123]; pm.test('Schema is valid', function() { pm.expect(tv4.validate(data1, schema)).to.be.true; pm.expect(tv4.validate(data2, schema)).to.be.true; }); |
常見模板用例:
- 狀態碼判斷
- 響應文本判斷
- json值判斷
- header判斷
- 響應時間判斷
除了斷言之外,還支持變量的操作,環境變量、全局變量的獲取和修改。
添加/獲取變量系列
獲取變量
正如上面的列表所示,在斷言中可以獲取一個變量、獲取一個全局變量等,我們來做一個獲取全局變量的示例。
如上圖。
- 第一步,選擇
Get global variable
。 - 第二步,編寫相關js代碼。
- 然后我們控制台中就可以查看到打印結果。
添加變量
那如何使用斷言將普通的變量添加到postman的系統環境中呢?這里使用Set an environment variable
模板。
其他的關於變量的操作都差不多,這里不再多說了。
一般斷言
還是上面的注冊接口,我們對請求結果,可以加各種判斷,比如根據狀態碼做斷言,判斷返回的json中的字段是否符合預期。
url是:http://www.neeo.cc:6002/pinter/com/register
如上圖,點擊右側的相關斷言模板,然后在修改相應的配置,就完成了斷言校驗,在返回的菜單欄中的Test
中,可以看到3個斷言都成功了。
// Status code: is 200
pm.test("判斷 狀態碼 是否為 200", function () {
pm.response.to.have.status(200);
});
// Response body:JSON value check
pm.test("判斷 code 字段是否為 0 ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql("0");
});
// Response body:JSON value check
pm.test("判斷 message 是否為 注冊成功", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.message).to.eql("注冊成功");
});
我們來修改一個斷言,看看報錯是怎么玩的, 比如判斷code 字段是否為1。
FAIL
為斷言失敗。
上述示例中, jsonData.message
它背后使用的是json_path
來獲取的json中的值,比如,我們要獲取一個有多層嵌套的字典,我們怎么來寫斷言呢?
如下圖, 我們判斷響應中,要判斷k3
的值是否等於c_v3
,這種嵌套的怎么寫。
url是http://www.neeo.cc:6001/post
這種嵌套的思路就是,一路點就完了。
我們再來看看其他的斷言,比如判斷接口的返回中是否包含某些字段。
我們來使用webservice的那個接口。
我們來判斷,響應結果中,是否包含別客氣
字段。用的是Response body:Contains string
模板。
集合公共斷言
對於某一類接口,他們都有一些功能的參數返回值是相同的, 那么我們對於這些公共的字段,來做一個斷言,而不用每個接口都一一做斷言。
我們點擊集合的三點,選擇Edit
,在Tests
選項,添加兩個斷言語句然后點擊Update
,那么,這兩個斷言將作用域當前集合中的每個接口。
在每個接口中,我們只需關注當前接口獨有的斷言接口,公共的斷言都在集合中。
如上圖,我們為當前注冊接口,添加一個獨有的斷言,其他兩個斷言來自於集合中的斷言。其他位於當前集合中的接口,都默認的執行公共的斷言。
歡迎斧正,that's all