一文搞定 Postman 接口自動化測試

0 前言

本文適合已經(jīng)掌握?Postman?基本用法的讀者唬复,即對接口相關(guān)概念有一定了解橡淑、已經(jīng)會使用?Postman?進(jìn)行模擬請求等基本操作悉尾。

工作環(huán)境與版本:

Window 7(64位)

Postman (Chrome App v5.5.3)

P.S. 不同版本頁面 UI 和部分功能位置會有點(diǎn)不同主儡,不過影響不大暑诸。

首先我們來思考一下逗威,如果要達(dá)到自動化接口測試效果峰搪,在基本的模擬請求上還需要做哪些呢?

我粗略概括為 3 個問題(?歡迎在評論區(qū)留言更多補(bǔ)充建議?):

如何判斷接口是否請求成功凯旭?

如何進(jìn)行接口批量概耻、定期測試?

如何處理依賴接口問題(比如商品下單的接口必須要求先登錄)罐呼?

所以鞠柄,接下來就主要分為 3 個部分,介紹如何解決這 3 個問題嫉柴。

1 接口結(jié)果判斷

首先厌杜,既然是自動化測試,那么我們肯定需要通過工具?Postman?或者代碼计螺,幫我們直接判斷結(jié)果是否符合預(yù)期期奔。那么在接口測試上,大體就兩個思路:

判斷請求返回的?code?是否符合預(yù)期

判斷請求返回的內(nèi)容中是否包含預(yù)期的內(nèi)容(關(guān)鍵字)

接下來我們看看如何利用?Postman?來解決上述的問題:

1.1 功能區(qū)

image1080×428 104 KB

在?Postman?中相關(guān)的功能在非常顯眼的地方危尿,?Tests?功能的使用需要我們有一定的編程語言基礎(chǔ)呐萌,目前支持的腳本語言即為?JavaScript?。但比較好的一點(diǎn)是谊娇,我們不需要再去考慮上下文問題以及運(yùn)行環(huán)境的問題 肺孤,也就是說我們只需要在這邊完成結(jié)果邏輯判斷的代碼塊即可罗晕。

而?Postman?還為我們提供了一些常用的代碼模板,在?Tests?面板右邊的?SNIPPETS?功能區(qū)中赠堵,所以對?JavaScript?不大了解問題也不大小渊。代碼編寫相關(guān)將在下文進(jìn)行具體介紹。

1.2 腳本相關(guān)

先看上圖的代碼部分茫叭,我們可以發(fā)現(xiàn)?responseCode?酬屉、?responseBody?和?tests?三個變量(可直接使用) :

responseCode?:包含請求的返回的狀態(tài)信息(如:code)。

responseBody?:為接口請求放回的數(shù)據(jù)內(nèi)容(類型為字符串)揍愁。

tests?:為鍵值對形式呐萨,用于表示我們的測試結(jié)果是成功與否,最終展示在?Test Results?中莽囤。

key :(如:code 200)我們可以用來當(dāng)做結(jié)果的一個描述谬擦。

value:其值為布爾型,?ture?表示測試通過朽缎,?false?表示測試失敗惨远。

所以上述代碼應(yīng)該不難理解了,而有了返回結(jié)果的數(shù)據(jù)以及表示結(jié)果成功與否的方式话肖,那么我們“接口結(jié)果判斷”的問題也就基本解決了北秽。

另外還有幾個比較常用的:

responseTime?:請求所耗時長

postman?:可以做的比較多,比如

獲取返回?cái)?shù)據(jù)的頭部信息:

postman.getResponseHeader("")

設(shè)置全局變量:

postman.setGlobalVariable("variable_key", "variable_value");

更多功能可以查看官方文檔最筒。

1.3 代碼模板

Postman?在?SNIPPETS?功能區(qū)中為我們提供的代碼模板已經(jīng)能解決大部分情況了羡儿,以下先挑幾個跟結(jié)果判斷相關(guān)的進(jìn)行講解:

Status code : Code is 200

//根據(jù)返回的 Code 判斷請求情況 tests["Status code is 200"] = responseCode.code ===200;

Response body: Contains string

//判斷返回的內(nèi)容中是否存在“關(guān)鍵字”。(tests 的 key 可修改是钥,將不再強(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

//判斷請求時長是否小于200ms ,具體時長按情況自定義tests["Response time is less than 200ms"] = responseTime < 200;

以上介紹的這些基本已經(jīng)足夠完成對單一接口的測試了,但我們知道如果沒有批量肤粱、定時任務(wù), 那么這些都將毫無意義弹囚,所以繼續(xù) …

2 集合(批量)測試

想要進(jìn)行接口的批量測試、管理领曼,那么我們需要將待測試的接口全部都保存到同一個集合?(Collections)?中鸥鹉,你可以認(rèn)為就是保存到同一個文件夾中。先看看?Postman?中的操作步驟:

image1080×805 90.4 KB

通過以上步驟庶骄,我們得到一個待測的接口集合毁渗,為了簡化情況,我這邊每個接口成功與否的條件都是用?code?是否為 200 來判斷:

tests[“Status code is 200”] = responseCode.code === 200;

2.1 批量執(zhí)行

以上準(zhǔn)備就緒后单刁,我們就可以開始批量運(yùn)行接口進(jìn)行測試了:

image1080×648 96.4 KB

點(diǎn)擊?Run?后灸异,會新打開一個頁面:

image1080×870 47.6 KB

Environment?:用于切換接口運(yùn)行的環(huán)境,這里先不管,后面再講

Iteration?:用于設(shè)置接口一共要運(yùn)行的次數(shù)肺樟。

Delay?: 設(shè)置每次運(yùn)行接口之間的時間間隔檐春,單位為毫秒。

Data File?: 上傳測試數(shù)據(jù)文件 (下文單獨(dú)講)

2.2 變化的參數(shù)數(shù)據(jù)

我們已經(jīng)了解了么伯,如何讓多個接口循環(huán)運(yùn)行多次疟暖,但是現(xiàn)在有個問題,按目前這個步驟田柔,每次運(yùn)行時接口的參數(shù)都是一樣的俐巴,那么就算我們運(yùn)行個100次、1000次意義也不大凯楔。

先看看我們寫好的一個登錄功能的接口:

image1080×439 85.3 KB

使用變量

現(xiàn)在登錄的賬號和密碼參數(shù)都是寫死的窜骄,也就是不過我們執(zhí)行多少次,都是拿這個賬號去測試摆屯。那么如果想要測試賬號密碼參數(shù)使用其它值有沒有異常怎么辦呢邻遏?( 想要每次都手動改的可以跳過這部分 /手動滑稽)這里我們先簡單講一下在?Postman?中使用如何“變量”,如下圖:

image1080×361 67 KB

引用一個變量的語法:{{變量名}}虐骑, 圖中可以看到准验,我們將賬戶和密碼字段的參數(shù)值都設(shè)置為變量:?{{username}} 、{{password}}?廷没。修改完直接點(diǎn)擊運(yùn)行?(Send)?當(dāng)然是不行的糊饱,因?yàn)槟壳斑@兩個變量還未被賦值,不過我們可以在?Pre-request Script?面板中進(jìn)行賦值操作:

Pre-request Script

Pre-request Script?與?Tests?類似颠黎,區(qū)別在于:?Pre-request Script?中的腳本是在執(zhí)行請求之前運(yùn)行另锋,而?Tests?中的腳本則是在請求完成之后執(zhí)行。所以,我們可以在?Pre-request Script?功能區(qū)中用腳本先個上面兩個變量進(jìn)行賦值,如:

//設(shè)置全局變量postman.setGlobalVariable("username","test1");postman.setGlobalVariable("password","123456");

但是用?Pre-request Script?進(jìn)行賦值操作仍然不能解決我們的問題拱层,因?yàn)榘凑者@種寫法蒜田,不論運(yùn)行多少次其實(shí)都還是用固定(寫死)的數(shù)據(jù)進(jìn)行測試。當(dāng)然既然是腳本語言,也會有更靈活的用法,這邊先不將。

測試數(shù)據(jù)集

接下來我們講講?Data File?, 在運(yùn)行集合前的這個選項(xiàng)就是用來上傳測試數(shù)據(jù)(文件)以賦值給相應(yīng)變量的亡鼠。我們先以?CSV?格式的測試數(shù)據(jù)為例:

username,password? ? test1,123456test2,222222test3,123456test4,444444

數(shù)據(jù)格式類似表格,第一行表示對應(yīng)的變量名敷待,下面 4 行表示 4 組賬號密碼數(shù)據(jù)(其中兩組為正確數(shù)據(jù)) 间涵,我們保存一份內(nèi)容為上述示例數(shù)據(jù)后綴名為?.csv?的文件后,再次開始測試看看效果榜揖,我們選擇運(yùn)行次數(shù)為 4 (對應(yīng) 4 組測試數(shù)據(jù))浑厚、選擇對應(yīng)的?CSV?文件運(yùn)行后股耽,可以看到我們的結(jié)果確實(shí)如我們的預(yù)期。接口?Request?運(yùn)行的結(jié)果為兩次成功兩次失敗钳幅,也就是每一次運(yùn)行都賦值了不同的賬號密碼的測試數(shù)據(jù) (在最新的桌面客戶端版本中可以看到每次具體的請求情況物蝙,這邊就不再細(xì)說了)。

如果使用?Json?文件的話敢艰,那么格式如下:

[? ? ? {"username":"test1","password":"123456"},? ? ? {"username":"test2","password":"222222"},? ? ? {"username":"test3","password":"123456"},? ? ? {"username":"test4","password":"444444"}? ? ]

2.3 定期任務(wù)

Postman?提供了一個?Monitors?(監(jiān)視器)功能诬乞,支持我們提交一個測試任務(wù),按照設(shè)置的定時器進(jìn)行運(yùn)行钠导,如每小時測試一次震嫉,具體操作如下:

image1080×799 115 KB

3 請求依賴問題

講完接口結(jié)果判斷和集合批量測試后,我們再來看看比較復(fù)雜的情況牡属,即依賴請求問題票堵,比如我們的購物下訂單接口要求必須先登錄后才可訪問。但大部分依賴問題其實(shí)本質(zhì)上就是一個接口間數(shù)據(jù)傳遞的問題逮栅,比如調(diào)用登錄接口后返回一個標(biāo)識悴势,假設(shè)為?token?,那么我們請求下訂單接口時只要一起攜帶?token?參數(shù)進(jìn)行請求即可措伐。所以特纤,問題變?yōu)椋?/p>

保證接口調(diào)用順序

將接口A返回的數(shù)據(jù)傳遞給后續(xù)的接口B、C侥加、D

3.1 接口執(zhí)行順序

首先捧存,說明一下,接下來說的接口都是默認(rèn)屬于同一個集合?(Collections)?中的担败。

還是以我們上文中創(chuàng)建好接口集合為例昔穴,如果你有注意我們執(zhí)行批量測試的結(jié)果,就會發(fā)現(xiàn)接口的執(zhí)行順序其實(shí)就是按照這邊目錄中的順序(從上到下)提前,即:?Request1 -> Request2 -> Request3?吗货。

image1080×397 78.1 KB

這邊接口名字可能有點(diǎn)誤導(dǎo)性,所以再強(qiáng)調(diào)一下:按目錄中從上到下的順序執(zhí)行 (與字典排序無關(guān))

所以有了這個默認(rèn)的執(zhí)行順序后岖研,那么我們便可以把需要優(yōu)先執(zhí)行的接口放前面即可,比如把“登錄接口”放在第一個警检。

3.1.2 自定義執(zhí)行順序

當(dāng)然孙援,如果只有默認(rèn)的一個執(zhí)行順序的話,通常沒法滿足我們復(fù)雜的業(yè)務(wù)需求扇雕,所以?Postman?為我們提供了一個函數(shù):?postman.setNextRequest("填寫你要跳轉(zhuǎn)的接口名")?拓售,支持我們跳轉(zhuǎn)到指定接口繼續(xù)執(zhí)行,舉個例子:

我們在運(yùn)行完?Request1?接口成功后镶奉,不需要再運(yùn)行?Request2?而是直接跳至?Request3?础淤,那么我可以在?Request1?接口的?Tests?功能區(qū)中執(zhí)行跳轉(zhuǎn)代碼崭放,如:

image1080×589 106 KB

這里需要注意幾點(diǎn):

postman.setNextRequest()?只在運(yùn)行集合測試的時候生效,也就是說我們單獨(dú)運(yùn)行?(Send)?接口?Request1?時鸽凶,函數(shù)是不起作用的币砂。

當(dāng)我們運(yùn)行集合測試成功從?Request1 -> Request3?后,如果?Request3?后面還有接口玻侥,那么后面的接口仍然繼續(xù)按默認(rèn)順序執(zhí)行决摧,即圖中的接口?Request4?仍會被執(zhí)行。

指定的跳轉(zhuǎn)接口必須屬于同一個集合中凑兰。

setNextRequest()?函數(shù)不管在?Tests?腳本中何處被調(diào)用掌桩,它都只在當(dāng)前腳本最后才被真正執(zhí)行。比如我們將圖中的第二行與第一行互調(diào)后姑食,那么在運(yùn)行跳轉(zhuǎn)函數(shù)后第二行代碼仍會被執(zhí)行波岛。

所以,利用?setNextRequest()?函數(shù)音半,我們便可以按照條件跳過不必要的接口则拷,或者建立我們自己的一個邏輯測試。

3.2 數(shù)據(jù)傳遞

在講數(shù)據(jù)傳遞前祟剔,先聊聊?Postman?中全局變量隔躲、環(huán)境切換的使用。

3.2.1 全局變量

全局變量的概念其實(shí)我們在上文中講?Pre-request Script?時有簡單提到物延,也就是說我們可以通過腳本代碼來設(shè)置全局變量宣旱,我們可以看看運(yùn)行上文的腳本后的效果:

我們可以看到運(yùn)行后,?username?和?password?兩個變量已經(jīng)被成功保存下來叛薯,那么我們在任意接口中便都可以通過變量引用的語法如:?{{username}}?來使用它們浑吟。

另外,?Postman?不僅支持代碼設(shè)置全局變量的方式耗溜,它還支持可視化操作:.

image1080×678 96.2 KB

進(jìn)入對應(yīng)界面后组力,便可直接進(jìn)行管理:

image1080×932 54 KB

3.2.2 多環(huán)境區(qū)分與切換

通常情況下,我們的接口都會分為測試版本和線上版本(或者更多)抖拴,而他們的區(qū)別可能僅是?ULR?不同燎字,那么全局變量便不大合適解決這個問題。

參數(shù)的創(chuàng)建

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

image1080×789 106 KB

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

image1080×990 89.3 KB

當(dāng)然洒放,我們的環(huán)境參數(shù)也可以通過腳本的方式來進(jìn)行設(shè)置蛉鹿,函數(shù)為:

//注意,該參數(shù)只添加到你當(dāng)前選擇的環(huán)境的“參數(shù)集”中postman.setEnvironmentVariable("variable_key","variable_value");

使用與切換

環(huán)境“參數(shù)集” 中的參數(shù)使用方式和全局變量一致往湿,如圖中?{{host}}?妖异,不同環(huán)境的切換見下圖:

image1080×564 90.3 KB

3.3 解決依賴問題

掌握以上的預(yù)備知識后惋戏,我們開始看看如何用?Postman?解決存在依賴關(guān)系的接口測試。

假設(shè)場景

我們的接口?Request1?為登錄接口他膳,登錄成功將會返回一個?access_token?字段作為標(biāo)識(已實(shí)現(xiàn))响逢。那么假設(shè)接口?Request3?為一個下訂單的接口,需要攜帶登錄返回的?access_token?才能正常訪問矩乐。

思路

保證?Request1?在?Request3?之前被運(yùn)行

將?Request1?返回的?access_token?的值添加到環(huán)境變量"參數(shù)集"中龄句。

Request3?在請求時引用?access_token?的值

將返回值存在 “全局變量” 或者 “環(huán)境變量” 中,視具體業(yè)務(wù)情況而定散罕,該例中?access_token?的值是與環(huán)境有關(guān)的分歇,所以這里選擇使用環(huán)境變量集存儲。

Postman 中的操作

我們目錄中已保證?Request1?接口優(yōu)先執(zhí)行

Request1?中?Tests?的代碼情況:

if(responseCode.code === 200 && responseBody.has(“access_token”)){

//如果 code 為 200欧漱, 并且返回的數(shù)據(jù)中存在 access_token 關(guān)鍵字职抡,則認(rèn)為登錄成功

tests[“l(fā)ogin”] = 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[“l(fā)ogin”] = false;

//登錄失敗缚甩,可以選擇跳轉(zhuǎn)到對應(yīng)失敗后的處理接口進(jìn)行測試

//postman.setNextRequest("Other Request")

}

3. 在接口 Request3 中使用變量 token :

image1080×292 42.7 KB

> 我這邊是將`token`放在頭部信息中, 具體使用方式時接口參數(shù)規(guī)則而定窑邦。

運(yùn)行并查看結(jié)果

運(yùn)行集合測試擅威,可以看到我們結(jié)果符合我們的預(yù)期,?Request1?和?Request3?通過測試冈钦,?Request2?被跳過郊丛,?Request4?仍被執(zhí)行。Done…

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞧筛,一起剝皮案震驚了整個濱河市厉熟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌较幌,老刑警劉巖揍瑟,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乍炉,居然都是意外死亡绢片,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門岛琼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來底循,“玉大人,你說我怎么就攤上這事衷恭〈说” “怎么了纯续?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵随珠,是天一觀的道長灭袁。 經(jīng)常有香客問我,道長窗看,這世上最難降的妖魔是什么茸歧? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮显沈,結(jié)果婚禮上软瞎,老公的妹妹穿的比我還像新娘。我一直安慰自己拉讯,他們只是感情好涤浇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魔慷,像睡著了一般只锭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上院尔,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天蜻展,我揣著相機(jī)與錄音,去河邊找鬼邀摆。 笑死纵顾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的栋盹。 我是一名探鬼主播施逾,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贞盯!你這毒婦竟也來了音念?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躏敢,失蹤者是張志新(化名)和其女友劉穎闷愤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體件余,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讥脐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啼器。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旬渠。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖端壳,靈堂內(nèi)的尸體忽然破棺而出告丢,到底是詐尸還是另有隱情,我是刑警寧澤损谦,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布岖免,位于F島的核電站岳颇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颅湘。R本人自食惡果不足惜话侧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闯参。 院中可真熱鬧瞻鹏,春花似錦、人聲如沸鹿寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚草。三九已至叭披,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玩讳,已是汗流浹背涩蜘。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熏纯,地道東北人同诫。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像樟澜,于是被迫代替她去往敵國和親误窖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容