一词裤、前言:
本文適合已經(jīng)掌握Postman基本用法的讀者,即對(duì)接口相關(guān)概念有一定了解鳖宾、已經(jīng)會(huì)使用Postman進(jìn)行模擬請(qǐng)求等基本操作吼砂。
工作環(huán)境與版本:
Window 7(64位)
Postman (Chrome App v5.5.3)
P.S. 不同版本頁(yè)面 UI 和部分功能位置會(huì)有點(diǎn)不同,不過(guò)影響不大鼎文。
首先我們來(lái)思考一下渔肩,如果要達(dá)到自動(dòng)化接口測(cè)試效果,在基本的模擬請(qǐng)求上還需要做哪些呢拇惋?
我粗略概括為 3 個(gè)問(wèn)題(歡迎在評(píng)論區(qū)留言更多補(bǔ)充建議):
1. 如何判斷接口是否請(qǐng)求成功周偎?
2. 如何進(jìn)行接口批量、定期測(cè)試撑帖?
3. 如何處理依賴接口問(wèn)題(比如商品下單的接口必須要求先登錄)蓉坎?
所以,接下來(lái)就主要分為 3 個(gè)部分胡嘿,介紹如何解決這 3 個(gè)問(wèn)題蛉艾。
二、接口結(jié)果判斷
首先衷敌,既然是自動(dòng)化測(cè)試勿侯,那么我們肯定需要通過(guò)工具Postman或者代碼,幫我們直接判斷結(jié)果是否符合預(yù)期缴罗。那么在接口測(cè)試上助琐,大體就兩個(gè)思路:
1.? 判斷請(qǐng)求返回的?code?是否符合預(yù)期
2.? 判斷請(qǐng)求返回的內(nèi)容中是否包含預(yù)期的內(nèi)容(關(guān)鍵字)
接下來(lái)我們看看如何利用Postman來(lái)解決上述的問(wèn)題:
1.1 功能區(qū)
在Postman中相關(guān)的功能在非常顯眼的地方,Tests功能的使用需要我們有一定的編程語(yǔ)言基礎(chǔ)面氓,目前支持的腳本語(yǔ)言即為JavaScript兵钮。但比較好的一點(diǎn)是沟堡,我們不需要再去考慮上下文問(wèn)題以及運(yùn)行環(huán)境的問(wèn)題 ,也就是說(shuō)我們只需要在這邊完成結(jié)果邏輯判斷的代碼塊即可矢空。
而Postman還為我們提供了一些常用的代碼模板,在Tests面板右邊的SNIPPETS功能區(qū)中禀横,所以對(duì)JavaScript不大了解問(wèn)題也不大屁药。代碼編寫(xiě)相關(guān)將在下文進(jìn)行具體介紹。
1.2 腳本相關(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è)試失敗评架。
所以上述代碼應(yīng)該不難理解了,而有了返回結(jié)果的數(shù)據(jù)以及表示結(jié)果成功與否的方式炕泳,那么我們“接口結(jié)果判斷”的問(wèn)題也就基本解決了纵诞。
另外還有幾個(gè)比較常用的:
responseTime?:請(qǐng)求所耗時(shí)長(zhǎng)
postman?:可以做的比較多,比如
獲取返回?cái)?shù)據(jù)的頭部信息:
`postman.getResponseHeader("")`
設(shè)置全局變量:
`postman.setGlobalVariable("variable_key", "variable_value");`
更多功能可以查看官方文檔培遵。
1.3 代碼模板
Postman在SNIPPETS功能區(qū)中為我們提供的代碼模板已經(jīng)能解決大部分情況了浙芙,以下先挑幾個(gè)跟結(jié)果判斷相關(guān)的進(jìn)行講解:
Status code : Code is 200
//根據(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?為字符串類(lèi)型节仿,支持轉(zhuǎn)為?Json?格式
varjsonData?=?JSON.parse(responseBody);
tests["Your?test?name"]?=?jsonData.value===100;
Response time is less than 200ms
//判斷請(qǐng)求時(shí)長(zhǎng)是否小于200ms?,具體時(shí)長(zhǎng)按情況自定義
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中的操作步驟:
通過(guò)以上步驟傅寡,我們得到一個(gè)待測(cè)的接口集合放妈,為了簡(jiǎn)化情況北救,我這邊每個(gè)接口成功與否的條件都是用code是否為 200 來(lái)判斷:
tests["Status?code?is?200"]?=?responseCode.code?===?200;
2.1 批量執(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ú)講)
2.2 變化的參數(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次意義也不大缓淹。
先看看我們寫(xiě)好的一個(gè)登錄功能的接口:
使用變量
現(xiàn)在登錄的賬號(hào)和密碼參數(shù)都是寫(xiě)死的哈打,也就是不過(guò)我們執(zhí)行多少次,都是拿這個(gè)賬號(hào)去測(cè)試讯壶。那么如果想要測(cè)試賬號(hào)密碼參數(shù)使用其它值有沒(méi)有異常怎么辦呢前酿?( 想要每次都手動(dòng)改的可以跳過(guò)這部分 /手動(dòng)滑稽)這里我們先簡(jiǎn)單講一下在Postman中使用如何“變量”,如下圖:
引用一個(gè)變量的語(yǔ)法:{{變量名}}鹏溯, 圖中可以看到罢维,我們將賬戶和密碼字段的參數(shù)值都設(shè)置為變量:{{username}} 、{{password}}丙挽。修改完直接點(diǎn)擊運(yùn)行(Send)當(dāng)然是不行的肺孵,因?yàn)槟壳斑@兩個(gè)變量還未被賦值,不過(guò)我們可以在Pre-request Script面板中進(jìn)行賦值操作:
Pre-request Script
Pre-request Script與Tests類(lèi)似颜阐,區(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)榘凑者@種寫(xiě)法肤舞,不論運(yùn)行多少次其實(shí)都還是用固定(寫(xiě)死)的數(shù)據(jù)進(jìn)行測(cè)試紫新。當(dāng)然既然是腳本語(yǔ)言,也會(huì)有更靈活的用法李剖,這邊先不將芒率。
測(cè)試數(shù)據(jù)集
接下來(lái)我們講講Data File, 在運(yùn)行集合前的這個(gè)選項(xiàng)就是用來(lái)上傳測(cè)試數(shù)據(jù)(文件)以賦值給相應(yīng)變量的。我們先以CSV格式的測(cè)試數(shù)據(jù)為例:
username,password
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ù)期材彪。接口Request運(yùn)行的結(jié)果為兩次成功兩次失敗铃剔,也就是每一次運(yùn)行都賦值了不同的賬號(hào)密碼的測(cè)試數(shù)據(jù) (在最新的桌面客戶端版本中可以看到每次具體的請(qǐng)求情況,這邊就不再細(xì)說(shuō)了)查刻。
如果使用Json文件的話,那么格式如下:
[
{
"username":"test1",
"password":"123456"
},
{
"username":"test2",
"password":"222222"
},
{
"username":"test3",
"password":"123456"
},
{
"username":"test4",
"password":"444444"
}
]
2.3 定期任務(wù)
Postman提供了一個(gè)Monitors(監(jiān)視器)功能凤类,支持我們提交一個(gè)測(cè)試任務(wù)穗泵,按照設(shè)置的定時(shí)器進(jìn)行運(yùn)行,如每小時(shí)測(cè)試一次谜疤,具體操作如下:
四佃延、請(qǐng)求依賴問(wèn)題
講完接口結(jié)果判斷和集合批量測(cè)試后,我們?cè)賮?lái)看看比較復(fù)雜的情況夷磕,即依賴請(qǐng)求問(wèn)題履肃,比如我們的購(gòu)物下訂單接口要求必須先登錄后才可訪問(wèn)。但大部分依賴問(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)椋?br>
保證接口調(diào)用順序
將接口A返回的數(shù)據(jù)傳遞給后續(xù)的接口B、C碾局、D
3.1 接口執(zhí)行順序
首先荆残,說(shuō)明一下,接下來(lái)說(shuō)的接口都是默認(rèn)屬于同一個(gè)集合(Collections)中的净当。
還是以我們上文中創(chuàng)建好接口集合為例内斯,如果你有注意我們執(zhí)行批量測(cè)試的結(jié)果,就會(huì)發(fā)現(xiàn)接口的執(zhí)行順序其實(shí)就是按照這邊目錄中的順序(從上到下)像啼,即:Request1 -> Request2 -> Request3俘闯。
這邊接口名字可能有點(diǎn)誤導(dǎo)性,所以再?gòu)?qiáng)調(diào)一下:按目錄中從上到下的順序執(zhí)行 (與字典排序無(wú)關(guān))
所以有了這個(gè)默認(rèn)的執(zhí)行順序后忽冻,那么我們便可以把需要優(yōu)先執(zhí)行的接口放前面即可备徐,比如把“登錄接口”放在第一個(gè)。
3.1.2 自定義執(zhí)行順序
當(dāng)然甚颂,如果只有默認(rèn)的一個(gè)執(zhí)行順序的話蜜猾,通常沒(méi)法滿足我們復(fù)雜的業(yè)務(wù)需求秀菱,所以Postman為我們提供了一個(gè)函數(shù):postman.setNextRequest("填寫(xiě)你要跳轉(zhuǎn)的接口名"),支持我們跳轉(zhuǎn)到指定接口繼續(xù)執(zhí)行蹭睡,舉個(gè)例子:
我們?cè)谶\(yùn)行完Request1接口成功后衍菱,不需要再運(yùn)行Request2而是直接跳至Request3,那么我可以在Request1接口的Tests功能區(qū)中執(zhí)行跳轉(zhuǎn)代碼肩豁,如:
這里需要注意幾點(diǎn):
1.?postman.setNextRequest()?只在運(yùn)行集合測(cè)試的時(shí)候生效脊串,也就是說(shuō)我們單獨(dú)運(yùn)行?(Send)?接口Request1時(shí),函數(shù)是不起作用的清钥。
2. 當(dāng)我們運(yùn)行集合測(cè)試成功從?
Request1 -> Request3?后琼锋,如果?Request3?后面還有接口,那么后面的接口仍然繼續(xù)按默認(rèn)順序執(zhí)行祟昭,即圖中的接口?Request4仍會(huì)被執(zhí)行缕坎。
3. 指定的跳轉(zhuǎn)接口必須屬于同一個(gè)集合中。
4.?
setNextRequest()?函數(shù)不管在?Tests?腳本中何處被調(diào)用篡悟,它都只在當(dāng)前腳本最后才被真正執(zhí)行谜叹。比如我們將圖中的第二行與第一行互調(diào)后,那么在運(yùn)行跳轉(zhuǎn)函數(shù)后第二行代碼仍會(huì)被執(zhí)行搬葬。
所以荷腊,利用setNextRequest()函數(shù),我們便可以按照條件跳過(guò)不必要的接口急凰,或者建立我們自己的一個(gè)邏輯測(cè)試女仰。
3.2 數(shù)據(jù)傳遞
在講數(shù)據(jù)傳遞前,先聊聊Postman中全局變量抡锈、環(huán)境切換的使用董栽。
3.2.1 全局變量
全局變量的概念其實(shí)我們?cè)谏衔闹兄vPre-request Script時(shí)有簡(jiǎn)單提到,也就是說(shuō)我們可以通過(guò)腳本代碼來(lái)設(shè)置全局變量企孩,我們可以看看運(yùn)行上文的腳本后的效果:
我們可以看到運(yùn)行后锭碳,username和password兩個(gè)變量已經(jīng)被成功保存下來(lái),那么我們?cè)谌我饨涌谥斜愣伎梢酝ㄟ^(guò)變量引用的語(yǔ)法如:{{username}}來(lái)使用它們勿璃。
另外擒抛,Postman不僅支持代碼設(shè)置全局變量的方式,它還支持可視化操作:
進(jìn)入對(duì)應(yīng)界面后补疑,便可直接進(jìn)行管理:
3.2.2 多環(huán)境區(qū)分與切換
通常情況下歧沪,我們的接口都會(huì)分為測(cè)試版本和線上版本(或者更多),而他們的區(qū)別可能僅是ULR不同莲组,那么全局變量便不大合適解決這個(gè)問(wè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");
使用與切換
環(huán)境“參數(shù)集” 中的參數(shù)使用方式和全局變量一致裕菠,如圖中{{host}},不同環(huán)境的切換見(jiàn)下圖:
3.3 解決依賴問(wèn)題
掌握以上的預(yù)備知識(shí)后闭专,我們開(kāi)始看看如何用Postman解決存在依賴關(guān)系的接口測(cè)試奴潘。
假設(shè)場(chǎng)景
我們的接口Request1為登錄接口,登錄成功將會(huì)返回一個(gè)access_token字段作為標(biāo)識(shí)(已實(shí)現(xiàn))影钉。那么假設(shè)接口Request3為一個(gè)下訂單的接口画髓,需要攜帶登錄返回的access_token才能正常訪問(wèn)。
思路
1. 保證?Request1?在?Request3?之前被運(yùn)行
2. 將?Request1?返回的?access_token?的值添加到環(huán)境變量"參數(shù)集"中平委。
3.?Request3?在請(qǐng)求時(shí)引用?access_token?的值
將返回值存在 “全局變量” 或者 “環(huán)境變量” 中奈虾,視具體業(yè)務(wù)情況而定,該例中access_token的值是與環(huán)境有關(guān)的肆汹,所以這里選擇使用環(huán)境變量集存儲(chǔ)。
Postman 中的操作
1. 我們目錄中已保證Request1接口優(yōu)先執(zhí)行
2.Request1中Tests的代碼情況:
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)境變量中
varjsonData?=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:
>?我這邊是將`token`放在頭部信息中,?具體使用方式時(shí)接口參數(shù)規(guī)則而定笆环。
運(yùn)行并查看結(jié)果
運(yùn)行集合測(cè)試攒至,可以看到我們結(jié)果符合我們的預(yù)期,Request1和Request3通過(guò)測(cè)試躁劣,Request2被跳過(guò)迫吐,Request4仍被執(zhí)行。
轉(zhuǎn)載原文地址:https://blog.csdn.net/cai_iac/article/details/81030619
更多技術(shù)分享和免費(fèi)視頻資料:請(qǐng)關(guān)注微信公眾號(hào)獲取--Coding測(cè)試