Postman最被低估的功能,自動化接口測試效率簡直無敵!
閱讀本文大概需要 9?分鐘。
來自:blog.csdn.net/cai_iac/article/details/81030619
Postman自動化接口測試
Window 7 - 64 Postman 版本(免費版):Chrome App v5.5.3
如何判斷接口是否請求成功 如何進(jìn)行接口批量、定期測試 如何處理依賴接口問題(比如商品下單的接口必須要求先登錄)
接口結(jié)果判斷
判斷請求返回的 code 是否符合預(yù)期 判斷請求返回的內(nèi)容中是否包含預(yù)期的內(nèi)容(關(guān)鍵字)
功能區(qū)

腳本相關(guān)
responseCode?:包含請求的返回的狀態(tài)信息(如:code)responseBody:為接口請求放回的數(shù)據(jù)內(nèi)容(類型為字符串)tests?:為鍵值對形式,用于表示我們的測試結(jié)果是成功與否,最終展示在 Test Results 中。key?:(如:code 200)我們可以用來當(dāng)做結(jié)果的一個描述value:其值為布爾型,ture 表示測試通過, false 表示測試失敗。
responseTime :請求所耗時長 postman :可以做的比較多,比如 獲取返回數(shù)據(jù)的頭部信息: postman.getResponseHeader("")設(shè)置全局變量: postman.setGlobalVariable("variable_key", "variable_value");
代碼模板
//根據(jù)返回的?Code?判斷請求情況?
tests["Status?code?is?200"]?=?responseCode.code?===?200;
//判斷返回的內(nèi)容中是否存在“關(guān)鍵字”。(tests 的 key 可修改,將不再強調(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");
//判斷返回內(nèi)容是否跟預(yù)期完全相等。
tests["Body?is?correct"]?=?responseBody?===?"這里可以改為你的預(yù)期內(nèi)容";
//上文提到,responseBody?為字符串類型,支持轉(zhuǎn)為?Json?格式
var?jsonData?=?JSON.parse(responseBody);
tests["Your?test?name"]?=?jsonData.value?===?100;
//判斷請求時長是否小于200ms?,具體時長按情況自定義
tests["Response?time?is?less?than?200ms"]?=?responseTime?200;
集合(批量)測試

tests["Status?code?is?200"]?=?responseCode.code?===?200;
批量執(zhí)行


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


{{變量名}}, 圖中可以看到,我們將賬戶和密碼字段的參數(shù)值都設(shè)置為變量:{{username}}、{{password}}?。修改完直接點擊運行 (Send) 當(dāng)然是不行的,因為目前這兩個變量還未被賦值,不過我們可以在?Pre-request Script?面板中進(jìn)行賦值操作:Pre-request Script?與 Tests 類似,區(qū)別在于:Pre-request Script?中的腳本是在執(zhí)行請求之前運行,而Tests 中的腳本則是在請求完成之后執(zhí)行。所以,我們可以在?Pre-request Script?功能區(qū)中用腳本先個上面兩個變量進(jìn)行賦值,如://設(shè)置全局變量
postman.setGlobalVariable("username",?"test1");
postman.setGlobalVariable("password",?"123456");
Pre-request Script?進(jìn)行賦值操作仍然不能解決我們的問題,因為按照這種寫法,不論運行多少次其實都還是用固定(寫死)的數(shù)據(jù)進(jìn)行測試。當(dāng)然既然是腳本語言,也會有更靈活的用法,這邊先不將。username,password
test1,123456
test2,222222
test3,123456
test4,444444
.csv?的文件后,再次開始測試看看效果,我們選擇運行次數(shù)為 4 (對應(yīng) 4 組測試數(shù)據(jù))、選擇對應(yīng)的 CSV 文件運行后,可以看到我們的結(jié)果確實如我們的預(yù)期。[
??{
????"username":?"test1",
????"password":?"123456"
??},
??{
????"username":?"test2",
????"password":?"222222"
??},
??{
????"username":?"test3",
????"password":?"123456"
??},
??{
????"username":?"test4",
????"password":?"444444"
??}
]
定期任務(wù)

請求依賴問題
保證接口調(diào)用順序 將接口A返回的數(shù)據(jù)傳遞給后續(xù)的接口B、C、D
接口執(zhí)行順序
Request1?->?Request2?->?Request3。
這邊接口名字可能有點誤導(dǎo)性,所以再強調(diào)一下:按目錄中從上到下的順序執(zhí)行 (與字典排序無關(guān))
postman.setNextRequest("填寫你要跳轉(zhuǎn)的接口名")?,支持我們跳轉(zhuǎn)到指定接口繼續(xù)執(zhí)行,舉個例子:
postman.setNextRequest()?只在運行集合測試的時候生效,也就是說我們單獨運行 (Send) 接口Request1 時,函數(shù)是不起作用的。當(dāng)我們運行集合測試成功從? Request1?->?Request3?后,如果 Request3 后面還有接口,那么后面的接口仍然繼續(xù)按默認(rèn)順序執(zhí)行,即圖中的接口 Request4 仍會被執(zhí)行。指定的跳轉(zhuǎn)接口必須屬于同一個集合中。 setNextRequest()?函數(shù)不管在 Tests 腳本中何處被調(diào)用,它都只在當(dāng)前腳本最后才被真正執(zhí)行。比如我們將圖中的第二行與第一行互調(diào)后,那么在運行跳轉(zhuǎn)函數(shù)后第二行代碼仍會被執(zhí)行。
setNextRequest()?函數(shù),我們便可以按照條件跳過不必要的接口,或者建立我們自己的一個邏輯測試。數(shù)據(jù)傳遞
Pre-request Script?時有簡單提到,也就是說我們可以通過腳本代碼來設(shè)置全局變量。{{username}}?來使用它們。



//注意,該參數(shù)只添加到你當(dāng)前選擇的環(huán)境的“參數(shù)集”中
postman.setEnvironmentVariable("variable_key",?"variable_value");
{{host}},不同環(huán)境的切換見下圖:
解決依賴問題
access_token?字段作為標(biāo)識(已實現(xiàn))。那么假設(shè)接口 Request3 為一個下訂單的接口,需要攜帶登錄返回的?access_token才能正常訪問。保證 Request1 在 Request3 之前被運行 將 Request1 返回的 access_token 的值添加到環(huán)境變量"參數(shù)集"中。 Request3 在請求時引用 access_token 的值
access_token的值是與環(huán)境有關(guān)的,所以這里選擇使用環(huán)境變量集存儲。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)到對應(yīng)失敗后的處理接口進(jìn)行測試
????//postman.setNextRequest("Other?Request")
}

我這邊是將 token 放在頭部信息中, 具體使用方式時接口參數(shù)規(guī)則而定。
推薦閱讀:
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級......等技術(shù)棧!
?戳閱讀原文領(lǐng)??!? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?

