本文已被51測(cè)試網(wǎng)收錄:https://mp.weixin.qq.com/s/ikex_lNScqw8yzSTG--uvw
一、 前言
本文跟大家介紹的是基于python測(cè)試框架pytest 與postman數(shù)據(jù)自動(dòng)采集的接口自動(dòng)化測(cè)試實(shí)踐方案,首先了解下為什么是基于pytest框架而不是使用unitest?網(wǎng)上的對(duì)比資料很多,概括起來(lái)就是pytest 相較于 unittest 代碼更加的簡(jiǎn)潔和靈活,最為跳躍的一點(diǎn)就是 fixture 機(jī)制,并且pytest有很多的第三方插件可以擴(kuò)展和繼承,大家可以深入去查一查。
第二個(gè)了解的是為什么要做數(shù)據(jù)自動(dòng)采集,做數(shù)據(jù)驅(qū)動(dòng)很多教程推薦的是將數(shù)據(jù)寫在excel中,然后通過(guò)程序去讀取。但我更推薦的是通過(guò)軟件自動(dòng)采集所需數(shù)據(jù),這樣可以大大節(jié)省手動(dòng)在excel錄入數(shù)據(jù)的時(shí)間。推薦使用postman采集數(shù)據(jù),它是一款做開(kāi)發(fā)人手必備的接口調(diào)試工具,幾乎能發(fā)送所有類型的HTPP請(qǐng)求,在打開(kāi)代理模式以后能夠自動(dòng)抓取pc端瀏覽器或者APP端請(qǐng)求的接口數(shù)據(jù),存儲(chǔ)并導(dǎo)出后為json格式的數(shù)據(jù)源,簡(jiǎn)單方便。
二、 自動(dòng)化框架流程
整個(gè)代碼框架除了數(shù)據(jù)來(lái)源從postman采集,其他所有封裝的公共庫(kù)以及具體的測(cè)試用例均使用代碼編輯器如pycharm編寫python代碼,其中需要用到的pytest、requests、allure等庫(kù)可以直接使用pip命令安裝。從數(shù)據(jù)采集到完成自動(dòng)化測(cè)試并輸出測(cè)試報(bào)告的流程如下圖:
1) 編寫公共庫(kù):如果某個(gè)函數(shù)需要被多次引用,那么就可以封裝成公共函數(shù),這些封裝的函數(shù)主要有:斷言、全局常量、log日志、發(fā)送請(qǐng)求、用戶session、加密等。跟業(yè)務(wù)無(wú)關(guān),可以先封裝好。
2) 編寫配置文件:配置文件內(nèi)容如環(huán)境參數(shù)、文件存儲(chǔ)路徑、版本號(hào),以及配置文件的讀寫封裝等,也是編寫測(cè)試用例之前必須封裝好的內(nèi)容。
3) 數(shù)據(jù)自動(dòng)采集:如下圖所示,打開(kāi)代理模式,設(shè)置代理端口如:5555,設(shè)置抓包的存儲(chǔ)路徑,比如一個(gè)功能流程就可以單獨(dú)存一個(gè)集合,最后設(shè)置過(guò)濾地址為本系統(tǒng),以免抓到與系統(tǒng)無(wú)關(guān)的接口 。
4) 數(shù)據(jù)導(dǎo)出json文件存儲(chǔ):選中某個(gè)集合后,右鍵選擇export導(dǎo)出,選擇第一個(gè)json數(shù)據(jù)格式。導(dǎo)出的數(shù)據(jù)源放入項(xiàng)目對(duì)應(yīng)的目錄Params->json下
5) 編寫數(shù)據(jù)讀取函數(shù):編寫jsonparam.py函數(shù),解析postman格式的json數(shù)據(jù)。因?yàn)閜ostman有些數(shù)據(jù)不是我們需要的 有些需要拼接,所以需要單獨(dú)封裝一個(gè)轉(zhuǎn)換格式的函數(shù),方便測(cè)試用例數(shù)據(jù)讀取使用。
6) 編寫測(cè)試用例:在Testcase下編寫測(cè)試用例的前置和后置參數(shù)文件conftest.py文件(此文件名為是固定的,不能寫別的)。
編寫具體的測(cè)試用例,測(cè)試用例均要使用test開(kāi)頭或結(jié)尾(否則框架無(wú)法識(shí)別)
7) 運(yùn)行測(cè)試用例:如果需要運(yùn)行Testcase下所有測(cè)試用例,可以在根目錄建run.py文件,若只需要單獨(dú)運(yùn)行某個(gè)功能的測(cè)試用例,也可以在具體的測(cè)試文件的main函數(shù)里面使用pytest.main("test_xxx.py")命令運(yùn)行。
8) 輸出日志文件:過(guò)程中使用self.log.info('請(qǐng)求參數(shù):%s' % data)打印日志信息,作為記錄和調(diào)試使用。
9) 輸出測(cè)試報(bào)告:最后可以集成allure插件,輸出更加直觀漂亮的測(cè)試報(bào)告。集成過(guò)程網(wǎng)上也有很多教程,但是坑非常多,大家需要注意以下內(nèi)容:
1.建議使用 pytest 3.8.0 版本
命令:pip install pytest
注意:勿使用pytest過(guò)高版本,且勿使用allure-pytest插件,會(huì)一直報(bào)錯(cuò)pytest找不到allure錯(cuò)誤,網(wǎng)上的辦法也解決不了,親測(cè)使用 pytest 3.8.0 搭配 pytest-allure-adaptor 1.7.10 可以解決
2.建議使用 pytest-allure-adaptor 1.7.10 版本
命令:pip install pytest-allure-adaptor
3.需要安裝jdk 1.8以上版本
4.需要安裝 allure-commandline(先安裝npm包)
命令:npm install -g allure-commandline --save-dev
接下來(lái)按照在run.py文件中寫的代碼
5.pytest命令基礎(chǔ)上加--alluredir,生成xml報(bào)告。
pytest -s -q --alluredir [xml_report_path]
6.使用 Command Tool 來(lái)生成我們需要的美觀報(bào)告。
allure generate [xml_report_path] -o [html_report_path]
7.直接用chrome瀏覽器打開(kāi)報(bào)告,報(bào)告會(huì)是空白頁(yè)面
解決辦法:在pycharm中右擊index.html選擇打開(kāi)方式Open in Browser即可
三、 代碼結(jié)構(gòu)&源碼
框架代碼分為如下幾個(gè)模塊:Common公共庫(kù)、Conf配置庫(kù)、Log封裝日志、Params數(shù)據(jù)源和讀取數(shù)據(jù)、Report測(cè)試報(bào)告、TestCase測(cè)試用例、run.py執(zhí)行文件,幾個(gè)重要的函數(shù)如下,其他代碼已經(jīng)放到開(kāi)源github上,大家自行下載。
源碼地址:https://github.com/kayie77/PyTestApiAuto
-
Common->Assert.py 封裝斷言
直接使用python的assert斷言函數(shù),用于判斷一個(gè)表達(dá)式,使用方式:
assert test.assert_code(response['code'], 200)
image.png
-
Common->Request.py 封裝請(qǐng)求
目的是封裝公共請(qǐng)求參數(shù)和封裝返回內(nèi)容
image.png
-
Conf->Config.py 讀取配置文件
在config.ini定義好文件內(nèi)容,需要再寫一個(gè)讀寫配置文件的函數(shù)
image.png
-
Params->jsonparams.py 讀取數(shù)據(jù)源
Jsonparams的作用是從Postman導(dǎo)出的json數(shù)據(jù)源中截取所需要的數(shù)據(jù),如header、url、body等參數(shù),拼接成requests請(qǐng)求需要的格式返回。
image.png
-
TestCase->test_xxx.py 測(cè)試用例
@allure.story 用于定義被測(cè)功能的用戶場(chǎng)景,即子功能點(diǎn)
@pytest.mark.parametrize傳多個(gè)參數(shù),實(shí)現(xiàn)執(zhí)行不同數(shù)據(jù)
從數(shù)據(jù)源獲取數(shù)據(jù)后發(fā)起請(qǐng)求,斷言結(jié)果,設(shè)置下一接口所需的變量參數(shù)
image.png
-
run.py 執(zhí)行文件
獲取報(bào)告輸出位置;定義好需要運(yùn)行哪些測(cè)試集,如果需要全部運(yùn)行,則不需要定義,會(huì)自動(dòng)找到Test開(kāi)頭(結(jié)尾)的包下面test開(kāi)頭(結(jié)尾)的py文件;使用pytest.main(args)執(zhí)行測(cè)試用例,定義好allure報(bào)告所需參數(shù),使用shell命令生成allure報(bào)告
image.png