使用Python快速搭建接口自動(dòng)化測(cè)試腳本實(shí)戰(zhàn)總結(jié)
?測(cè)試需求介紹
通常,在我們的項(xiàng)目中,我們的接口測(cè)試需求一般都是構(gòu)造不同的請(qǐng)求數(shù)據(jù),然后發(fā)送請(qǐng)求到接口,拿到接口返回后,對(duì)返回的字段進(jìn)行提取和校驗(yàn),最后將結(jié)果存放在excel表格中方便查閱。接口一般是http或https請(qǐng)求,發(fā)送的結(jié)構(gòu)一般是json body或json結(jié)合一些文件附件,請(qǐng)求的返回結(jié)果都是json格式,我們的測(cè)試case可以用Excel或者數(shù)據(jù)庫(kù)保存,結(jié)果可以保存在數(shù)據(jù)庫(kù)或者直接存在Excel中,下面將具體拆解需求及逐步介紹實(shí)現(xiàn)過(guò)程。
請(qǐng)求體的定制和發(fā)送請(qǐng)求
構(gòu)造每次發(fā)送的請(qǐng)求內(nèi)容和向接口自動(dòng)發(fā)送請(qǐng)求是構(gòu)造自動(dòng)化測(cè)試腳本的核心,我們實(shí)現(xiàn)這一步驟主要是使用python 的requests庫(kù),下面詳細(xì)做一下詳細(xì)介紹。
1.發(fā)送簡(jiǎn)單的http post請(qǐng)求
發(fā)送請(qǐng)求前,我們需要明確請(qǐng)求的body,我們的body為json,具體內(nèi)容如下:
我們可以把這個(gè)作為模板保存為text.json文件作為模板,這樣可以直接讀取為后面構(gòu)造請(qǐng)求體做準(zhǔn)備。這一步我們可以這樣處理,這里借助了yaml包,可以把json轉(zhuǎn)換為字典,也可以使用python自帶的json,效果一樣。
獲取到了請(qǐng)求體模板后,我們得到了變量request_body,這是一個(gè)字典類(lèi)型的數(shù)據(jù),我們就可以對(duì)其進(jìn)行參數(shù)化,以此構(gòu)造我們需要的請(qǐng)求體了,例如我們要對(duì)每次請(qǐng)求的請(qǐng)求id、用戶(hù)名、以及text的內(nèi)容做修改,可以這樣操作,左邊是需要修改的字段,右邊是我們需要的變量。
構(gòu)造好要發(fā)送的數(shù)據(jù),就可以準(zhǔn)備發(fā)送請(qǐng)求了,在發(fā)送請(qǐng)求之前我們還有一點(diǎn)工作要做,那就是設(shè)置請(qǐng)求接口的一些參數(shù)和一些請(qǐng)求頭的定制,這里我們簡(jiǎn)單舉例如下:
我們定制了請(qǐng)求參數(shù)和請(qǐng)求頭,就可以發(fā)送類(lèi)似如下URL的請(qǐng)求:
我們?cè)侔阎皹?gòu)造好的body加上,再用requests庫(kù)的post方法發(fā)送請(qǐng)求,這里用到了方法中的data參數(shù),它接收的是一個(gè)json,因此在發(fā)送之前對(duì)之前的字典變量還需做下轉(zhuǎn)換再發(fā)送,這里用python自帶的json庫(kù),使用其中的dumps方法即可將字典轉(zhuǎn)換為json:
至此,一個(gè)基本的http post請(qǐng)求就發(fā)送完成了,注意到,我們有一個(gè)名為 r 的 Response 對(duì)象。我們可以從這個(gè)對(duì)象中獲取所有我們想要的信息。
2.更加復(fù)雜的請(qǐng)求
前面我們介紹了最簡(jiǎn)單的http post請(qǐng)求,在此基礎(chǔ)上,我們有時(shí)還需要一些更加復(fù)雜的請(qǐng)求,比如帶一個(gè)文件,https請(qǐng)求等,下面簡(jiǎn)單講解一下如何實(shí)現(xiàn):
比如我們想要發(fā)送一個(gè)帶有格式為p?cm的音頻文件到接口中,并且接口是https的。
注意到,發(fā)送https請(qǐng)求需要做ssl認(rèn)證,在方法中使用verify參數(shù),這個(gè)參數(shù)默認(rèn)值是True,一般不需要驗(yàn)證的話(huà),需要將這個(gè)置為False。還有一個(gè)需要注意的地方是,我們?cè)O(shè)置了一個(gè)timeout,防止請(qǐng)求過(guò)程超時(shí),導(dǎo)致程序無(wú)響應(yīng)。
對(duì)請(qǐng)求返回?cái)?shù)據(jù)進(jìn)行關(guān)鍵數(shù)據(jù)抓取
在發(fā)送請(qǐng)求的步驟里我們有一個(gè)名為 r 的 Response 對(duì)象。我們可以從這個(gè)對(duì)象中獲取所有我們想要的信息。
獲取內(nèi)容有如下幾種方法,我們可以根據(jù)自己的需要來(lái)使用:
得到的一般為json格式的文本:
我們可以對(duì)json進(jìn)行轉(zhuǎn)換,使用json.loads方法,將一個(gè)json對(duì)象轉(zhuǎn)換為python的字典,這樣方便獲取其中我們想要的一些字段,這一步很簡(jiǎn)單,就不做詳細(xì)介紹了。
如何執(zhí)行case和存儲(chǔ)測(cè)試結(jié)果
首先我們看一下我們的case,我們的case是使用Excel進(jìn)行編寫(xiě)的,具體如下:
1080×112 39.8 KB
如何讀取Excel,獲取其中的case呢?我們使用了python中的pandas庫(kù)。這個(gè)庫(kù)很強(qiáng)大,有很多處理數(shù)據(jù)的方法,我們?cè)谶@只使用其中讀取excel的方法,具體代碼如下:
這樣我們就將表格數(shù)據(jù)轉(zhuǎn)換了一個(gè)list,每個(gè)list中是一個(gè)字典格式,也就是我們的case,具體格式如下:
這樣做的目的是我們可以將表頭和每個(gè)case做一個(gè)映射,形成一個(gè)字典,這樣可以更加靈活操作case以及做數(shù)據(jù)對(duì)比。
有了case list,加上之前我們發(fā)送請(qǐng)求和獲取結(jié)果的步驟就可以進(jìn)行批量接口測(cè)試了,這里使用一個(gè)for循環(huán)就可以批量跑起來(lái)了:
我們將每次返回的結(jié)果,按照case的格式拼接成一個(gè)字典,就是我們的結(jié)果數(shù)據(jù),將每個(gè)結(jié)果字典再存儲(chǔ)到一個(gè)列表中,就得到了整個(gè)的結(jié)果字典列表,我們將它命名為case_result_list,這時(shí),我們?cè)俅问褂胮andas庫(kù),可以把這個(gè)列表轉(zhuǎn)換為dataframe格式:
之后我們將dataframe保存為excel文件:
至此,我們已經(jīng)完成了從獲取case到發(fā)請(qǐng)求獲取結(jié)果,保存結(jié)果的全部流程。
對(duì)結(jié)果數(shù)據(jù)進(jìn)行標(biāo)識(shí)處理
經(jīng)過(guò)以上的操作,我們已經(jīng)完成了批量發(fā)請(qǐng)求,獲取結(jié)果的過(guò)程,如果我們需要對(duì)結(jié)果單元格做一些處理,比如標(biāo)紅加粗等操作,使測(cè)試結(jié)果中的錯(cuò)誤信息更加明顯,需要怎么操作呢?這里我們使用了python中的openpyxl庫(kù)。這個(gè)庫(kù)也是可以對(duì)Excel表格進(jìn)行讀寫(xiě)操作,并且可以插入一些公式和樣式。我們?cè)谶@里使用的是樣式操作,我們根據(jù)單元格中的數(shù)據(jù)對(duì)結(jié)果進(jìn)行標(biāo)紅加粗操作:
最后得到的測(cè)試結(jié)果如下,通過(guò)使用openpyxl,我們還可以在結(jié)果中追加行,增加一些測(cè)試結(jié)果的統(tǒng)計(jì)信息,如case數(shù)、error數(shù),錯(cuò)誤率正確率等。
1080×224 61.6 KB
以上就是一次完整的接口自動(dòng)化測(cè)試腳本搭建,實(shí)現(xiàn)自動(dòng)請(qǐng)求、獲取結(jié)果、數(shù)據(jù)對(duì)比分析,導(dǎo)出結(jié)果到Excel等功能,每一個(gè)步驟都比較簡(jiǎn)單,可以快速搭建出滿(mǎn)足需求的自動(dòng)化測(cè)試腳本,方面快速驗(yàn)證服務(wù)端接口。
其中使用的requests庫(kù)、pandas庫(kù)是在python常用的庫(kù),功能很強(qiáng)大,后續(xù)大家可以參考其官方文檔進(jìn)行深入了解。