Postman 最被低估的功能
相關(guān)閱讀:杭州程序員從互聯(lián)網(wǎng)跳央企,曬一天工作和收入,網(wǎng)友:待一年就廢
接口結(jié)果判斷
首先,既然是自動(dòng)化測(cè)試,那么我們肯定需要工具 (Postman) 或者代碼能幫我們直接判斷結(jié)果是否符合預(yù)期。那么在接口測(cè)試上,大體就兩個(gè)思路:
接下來(lái)我們看看如何利用 Postman 來(lái)解決上述的問(wèn)題:
功能區(qū)

腳本相關(guān)
responseCode:包含請(qǐng)求的返回的狀態(tài)信息(如:code)responseBody:為接口請(qǐng)求放回的數(shù)據(jù)內(nèi)容(類型為字符串)tests:為鍵值對(duì)形式,用于表示我們的測(cè)試結(jié)果是成功與否,最終展示在 Test Results 中。key:(如:code 200)我們可以用來(lái)當(dāng)做結(jié)果的一個(gè)描述value:其值為布爾型,ture 表示測(cè)試通過(guò), false 表示測(cè)試失敗。
代碼模板
//根據(jù)返回的 Code 判斷請(qǐng)求情況
tests["Status code is 200"] = responseCode.code === 200;Response body: Contains string
//判斷返回的內(nèi)容中是否存在“關(guān)鍵字”。(tests 的 key 可修改,將不再?gòu)?qiáng)調(diào))
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
//判斷返回內(nèi)容是否跟預(yù)期完全相等。
tests["Body is correct"] = responseBody === "這里可以改為你的預(yù)期內(nèi)容";Response body: JSON value check
//上文提到,responseBody 為字符串類型,支持轉(zhuǎn)為 Json 格式
var jsonData = JSON.parse(responseBody);
tests["Your test name"] = jsonData.value === 100;Response time is less than 200ms,搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師復(fù)“2T”,送你一份驚喜禮包。
//判斷請(qǐng)求時(shí)長(zhǎng)是否小于200ms ,具體時(shí)長(zhǎng)按情況自定義
tests["Response time is less than 200ms"] = responseTime < 200;集合(批量)測(cè)試

通過(guò)以上步驟,我們得到一個(gè)待測(cè)的接口集合,為了簡(jiǎn)化情況,我這邊每個(gè)接口成功與否的條件都是用 code 是否為 200 來(lái)判斷:
tests["Status code is 200"] = responseCode.code === 200;批量執(zhí)行
以上準(zhǔn)備就緒后,我們就可以開(kāi)始批量運(yùn)行接口進(jìn)行測(cè)試了:

點(diǎn)擊Run 后,會(huì)新打開(kāi)一個(gè)頁(yè)面:

Environment:用于切換接口運(yùn)行的環(huán)境,這里先不管,后面再講Iteration:用于設(shè)置接口一共要運(yùn)行的次數(shù)。Delay: 設(shè)置每次運(yùn)行接口之間的時(shí)間間隔,單位為毫秒。Data File: 上傳測(cè)試數(shù)據(jù)文件 (下文單獨(dú)講)
變化的參數(shù)數(shù)據(jù)


{{變量名}}, 圖中可以看到,我們將賬戶和密碼字段的參數(shù)值都設(shè)置為變量:{{username}}、{{password}} 。修改完直接點(diǎn)擊運(yùn)行 (Send) 當(dāng)然是不行的,因?yàn)槟壳斑@兩個(gè)變量還未被賦值,不過(guò)我們可以在 Pre-request Script 面板中進(jìn)行賦值操作:Pre-request Script 與 Tests 類似,區(qū)別在于:Pre-request Script 中的腳本是在執(zhí)行請(qǐng)求之前運(yùn)行,而Tests 中的腳本則是在請(qǐng)求完成之后執(zhí)行。所以,我們可以在 Pre-request Script 功能區(qū)中用腳本先個(gè)上面兩個(gè)變量進(jìn)行賦值,如://設(shè)置全局變量
postman.setGlobalVariable("username", "test1");
postman.setGlobalVariable("password", "123456");但是用 Pre-request Script 進(jìn)行賦值操作仍然不能解決我們的問(wèn)題,因?yàn)榘凑者@種寫法,不論運(yùn)行多少次其實(shí)都還是用固定(寫死)的數(shù)據(jù)進(jìn)行測(cè)試。當(dāng)然既然是腳本語(yǔ)言,也會(huì)有更靈活的用法,這邊先不將。
username,password
test1,123456
test2,222222
test3,123456
test4,444444.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)求依賴問(wèn)題
保證接口調(diào)用順序 將接口A返回的數(shù)據(jù)傳遞給后續(xù)的接口B、C、D
接口執(zhí)行順序

這邊接口名字可能有點(diǎn)誤導(dǎo)性,所以再?gòu)?qiáng)調(diào)一下:按目錄中從上到下的順序執(zhí)行 (與字典排序無(wú)關(guān))
postman.setNextRequest("填寫你要跳轉(zhuǎn)的接口名") ,支持我們跳轉(zhuǎn)到指定接口繼續(xù)執(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í)行。
所以,利用 setNextRequest() 函數(shù),我們便可以按照條件跳過(guò)不必要的
數(shù)據(jù)傳遞
在講數(shù)據(jù)傳遞前,先聊聊 Postman 中全局變量、環(huán)境切換的使用。
全局變量
Pre-request Script 時(shí)有簡(jiǎn)單提到,也就是說(shuō)我們可以通過(guò)腳本代碼來(lái)設(shè)置全局變量。{{username}} 來(lái)使用它們。
進(jìn)入對(duì)應(yīng)界面后,便可直接進(jìn)行管理:

參數(shù)的創(chuàng)建
可能你已經(jīng)注意到,上圖中我已經(jīng)建有幾個(gè)不同環(huán)境的參數(shù)“集合”了,再看一下:

我在每個(gè)環(huán)境中都創(chuàng)建了一個(gè) host 參數(shù),如:

當(dāng)然,我們的環(huán)境參數(shù)也可以通過(guò)腳本的方式來(lái)進(jìn)行設(shè)置,函數(shù)為:
//注意,該參數(shù)只添加到你當(dāng)前選擇的環(huán)境的“參數(shù)集”中
postman.setEnvironmentVariable("variable_key", "variable_value");{{host}},不同環(huán)境的切換見(jiàn)下圖:
解決依賴問(wèn)題
掌握以上的預(yù)備知識(shí)后,我們開(kāi)始看看如何用 Postman 解決存在依賴關(guān)系的接口測(cè)試。
假設(shè)場(chǎng)景
access_token 字段作為標(biāo)識(shí)(已實(shí)現(xiàn))。那么假設(shè)接口 Request3 為一個(gè)下訂單的接口,需要攜帶登錄返回的 access_token 才能正常訪問(wèn)。思路
保證 Request1 在 Request3 之前被運(yùn)行 將 Request1 返回的 access_token 的值添加到環(huán)境變量"參數(shù)集"中。 Request3 在請(qǐng)求時(shí)引用 access_token 的值,搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師復(fù)“2T”,送你一份驚喜禮包。
access_token 的值是與環(huán)境有關(guān)的,所以這里選擇使用環(huán)境變量集存儲(chǔ)。if(responseCode.code === 200 && responseBody.has("access_token")){
//如果 code 為 200, 并且返回的數(shù)據(jù)中存在 access_token 關(guān)鍵字,則認(rèn)為登錄成功
tests["login"] = true;
//將返回的內(nèi)容轉(zhuǎn)為 json 格式,并且取到 access_token 內(nèi)容,添加到環(huán)境變量中
var jsonData = JSON.parse(responseBody);
//access_token的取值方式視具體的 json 數(shù)據(jù)結(jié)構(gòu)而定
postman.setEnvironmentVariable("token",jsonData.result.access_token);
//跳轉(zhuǎn)到 Request3 接口
postman.setNextRequest("Request3")
}else{
tests["login"] = false;
//登錄失敗,可以選擇跳轉(zhuǎn)到對(duì)應(yīng)失敗后的處理接口進(jìn)行測(cè)試
//postman.setNextRequest("Other Request")
}3、在接口 Request3 中使用變量 token :

運(yùn)行
2、心態(tài)崩了!稅前2萬(wàn)4,到手1萬(wàn)4,年終獎(jiǎng)扣稅方式1月1日起施行~
3、雷軍做程序員時(shí)寫的博客,很強(qiáng)大!
