Postman被低估的功能?—?自動(dòng)化接口測(cè)試
| 背景
該篇文章針對(duì)已經(jīng)掌握 Postman 基本用法的讀者,即對(duì)接口相關(guān)概念有一定了解、已經(jīng)會(huì)使用 Postman 進(jìn)行模擬請(qǐng)求的操作。
- Window 7 - 64
- Postman 版本(免費(fèi)版):Chrome App v5.5.3
- 如何判斷接口是否請(qǐng)求成功
- 如何進(jìn)行接口批量、定期測(cè)試
- 如何處理依賴(lài)接口問(wèn)題(比如商品下單的接口必須要求先登錄)
| 接口結(jié)果判斷
首先,既然是自動(dòng)化測(cè)試,那么我們肯定需要工具 (Postman) 或者代碼能幫我們直接判斷結(jié)果是否符合預(yù)期。那么在接口測(cè)試上,大體就兩個(gè)思路:
- 判斷請(qǐng)求返回的 code 是否符合預(yù)期
- 判斷請(qǐng)求返回的內(nèi)容中是否包含預(yù)期的內(nèi)容(關(guān)鍵字)
功能區(qū)
在 Postman 中相關(guān)的功能在非常顯眼的地方,Tests 功能的使用需要我們有一定的編程語(yǔ)言基礎(chǔ),目前支持的腳本語(yǔ)言即為 JavaScript 。但比較好的一點(diǎn)是,我們不需要再去考慮上下文問(wèn)題以及運(yùn)行環(huán)境的問(wèn)題 ,也就是說(shuō)我們只需要在這邊完成結(jié)果邏輯判斷的代碼塊即可。
腳本相關(guān)
先看上圖的代碼部分,我們可以發(fā)現(xiàn) responseCode 、 responseBody 和 tests 三個(gè)變量(可直接使用) :
- responseCode:包含請(qǐng)求的返回的狀態(tài)信息(如:code)
- responseBody:為接口請(qǐng)求放回的數(shù)據(jù)內(nèi)容(類(lèi)型為字符串)
- tests:為鍵值對(duì)形式,用于表示我們的測(cè)試結(jié)果是成功與否,最終展示在 Test Results 中。
- key:(如:code 200)我們可以用來(lái)當(dāng)做結(jié)果的一個(gè)描述
- value:其值為布爾型,ture 表示測(cè)試通過(guò), false 表示測(cè)試失敗。
- responseTime :請(qǐng)求所耗時(shí)長(zhǎng)
- postman :可以做的比較多,比如
- 獲取返回?cái)?shù)據(jù)的頭部信息:postman.getResponseHeader("")
- 設(shè)置全局變量:postman.setGlobalVariable("variable_key", "variable_value");
代碼模板
Postman 在 SNIPPETS 功能區(qū)中為我們提供的代碼模板已經(jīng)能解決大部分情況了,以下先挑幾個(gè)跟結(jié)果判斷相關(guān)的進(jìn)行講解:
tests["Status code is 200"] = responseCode.code === 200;
Response body: Contains string
tests["Body matches string"] = responseBody.has("這里可以改為你要判斷的關(guān)鍵字內(nèi)容");
//如上文提到的:
// 判斷結(jié)果中是否存在 access_token 關(guān)鍵字
tests["has access_token"] = responseBody.has("access_token");
Response body: is equal to string
tests["Body is correct"] = responseBody === "這里可以改為你的預(yù)期內(nèi)容";
Response body: JSON value check
var jsonData = JSON.parse(responseBody);
tests["Your test name"] = jsonData.value === 100;
Response time is less than 200ms
tests["Response time is less than 200ms"] = responseTime < 200;
以上介紹的這些基本已經(jīng)足夠完成對(duì)單一接口的測(cè)試了,但我們知道如果沒(méi)有批量、定時(shí)任務(wù), 那么這些都將毫無(wú)意義,繼續(xù)…
| 集合(批量)測(cè)試
想要進(jìn)行接口的批量測(cè)試、管理,那么我們需要將待測(cè)試的接口全部都保存到同一個(gè)集合(Collections)中,你可以認(rèn)為就是保存到同一個(gè)文件夾中。先看看 Postman 中的操作步驟:
批量執(zhí)行
以上準(zhǔn)備就緒后,我們就可以開(kāi)始批量運(yùn)行接口進(jìn)行測(cè)試了:
- Environment:用于切換接口運(yùn)行的環(huán)境,這里先不管,后面再講
- Iteration:用于設(shè)置接口一共要運(yùn)行的次數(shù)。
- Delay: 設(shè)置每次運(yùn)行接口之間的時(shí)間間隔,單位為毫秒。
- Data File: 上傳測(cè)試數(shù)據(jù)文件 (下文單獨(dú)講)
變化的參數(shù)數(shù)據(jù)
我們已經(jīng)了解了,如何讓多個(gè)接口循環(huán)運(yùn)行多次,但是現(xiàn)在有個(gè)問(wèn)題,按目前這個(gè)步驟,每次運(yùn)行時(shí)接口的參數(shù)都是一樣的,那么就算我們運(yùn)行個(gè)100次、1000次意義也不大。
postman.setGlobalVariable("username", "test1");
postman.setGlobalVariable("password", "123456");
但是用Pre-request Script進(jìn)行賦值操作仍然不能解決我們的問(wèn)題,因?yàn)榘凑者@種寫(xiě)法,不論運(yùn)行多少次其實(shí)都還是用固定(寫(xiě)死)的數(shù)據(jù)進(jìn)行測(cè)試。當(dāng)然既然是腳本語(yǔ)言,也會(huì)有更靈活的用法,這邊先不講。
test1,123456
test2,222222
test3,123456
test4,444444
數(shù)據(jù)格式類(lèi)似表格,第一行表示對(duì)應(yīng)的變量名,下面 4 行表示 4 組賬號(hào)密碼數(shù)據(jù)(其中兩組為正確數(shù)據(jù)) ,我們保存一份內(nèi)容為上述示例數(shù)據(jù)后綴名為.csv的文件后,再次開(kāi)始測(cè)試看看效果,我們選擇運(yùn)行次數(shù)為 4 (對(duì)應(yīng) 4 組測(cè)試數(shù)據(jù))、選擇對(duì)應(yīng)的 CSV 文件運(yùn)行后,可以看到我們的結(jié)果確實(shí)如我們的預(yù)期。
{
"username": "test1",
"password": "123456"
},
{
"username": "test2",
"password": "222222"
},
{
"username": "test3",
"password": "123456"
},
{
"username": "test4",
"password": "444444"
}
]
定期任務(wù)
Postman 提供了一個(gè) Monitors (監(jiān)視器)功能,支持我們提交一個(gè)測(cè)試任務(wù),按照設(shè)置的定時(shí)器進(jìn)行運(yùn)行,如每小時(shí)測(cè)試一次,具體操作如下:
| 請(qǐng)求依賴(lài)問(wèn)題
講完接口結(jié)果判斷和集合批量測(cè)試后,我們?cè)賮?lái)看看比較復(fù)雜的情況,即依賴(lài)請(qǐng)求問(wèn)題,比如我們的購(gòu)物下訂單接口要求必須先登錄后才可訪問(wèn)。但大部分依賴(lài)問(wèn)題其實(shí)本質(zhì)上就是一個(gè)接口間數(shù)據(jù)傳遞的問(wèn)題,比如調(diào)用登錄接口后返回一個(gè)標(biāo)識(shí),假設(shè)為 token ,那么我們請(qǐng)求下訂單接口時(shí)只要一起攜帶 token 參數(shù)進(jìn)行請(qǐng)求即可。所以,問(wèn)題變?yōu)椋?
- 保證接口調(diào)用順序
- 將接口A返回的數(shù)據(jù)傳遞給后續(xù)的接口B、C、D
接口執(zhí)行順序
首先,說(shuō)明一下,接下來(lái)說(shuō)的接口都是默認(rèn)屬于同一個(gè)集合 (Collections) 中的。
這邊接口名字可能有點(diǎn)誤導(dǎo)性,所以再?gòu)?qiáng)調(diào)一下:按目錄中從上到下的順序執(zhí)行 (與字典排序無(wú)關(guān))所以有了這個(gè)默認(rèn)的執(zhí)行順序后,那么我們便可以把需要優(yōu)先執(zhí)行的接口放前面即可,比如把“登錄接口”放在第一個(gè)。
- postman.setNextRequest()只在運(yùn)行集合測(cè)試的時(shí)候生效,也就是說(shuō)我們單獨(dú)運(yùn)行 (Send) 接口Request1 時(shí),函數(shù)是不起作用的。
- 當(dāng)我們運(yùn)行集合測(cè)試成功從Request1->Request3后,如果 Request3 后面還有接口,那么后面的接口仍然繼續(xù)按默認(rèn)順序執(zhí)行,即圖中的接口 Request4 仍會(huì)被執(zhí)行。
- 指定的跳轉(zhuǎn)接口必須屬于同一個(gè)集合中。
- setNextRequest()函數(shù)不管在 Tests 腳本中何處被調(diào)用,它都只在當(dāng)前腳本最后才被真正執(zhí)行。比如我們將圖中的第二行與第一行互調(diào)后,那么在運(yùn)行跳轉(zhuǎn)函數(shù)后第二行代碼仍會(huì)被執(zhí)行。
數(shù)據(jù)傳遞
在講數(shù)據(jù)傳遞前,先聊聊 Postman 中全局變量、環(huán)境切換的使用。
postman.setEnvironmentVariable("variable_key", "variable_value");
使用與切換環(huán)境“參數(shù)集” 中的參數(shù)使用方式和全局變量一致,如圖中{{host}},不同環(huán)境的切換見(jiàn)下圖:
| 解決依賴(lài)問(wèn)題
掌握以上的預(yù)備知識(shí)后,我們開(kāi)始看看如何用 Postman 解決存在依賴(lài)關(guān)系的接口測(cè)試。
- 保證 Request1 在 Request3 之前被運(yùn)行
- 將 Request1 返回的 access_token 的值添加到環(huán)境變量"參數(shù)集"中。
- Request3 在請(qǐng)求時(shí)引用 access_token 的值