框架的設(shè)計(jì)思路
首先要明確進(jìn)行接口自動化需要的步驟,如下圖所示:
然后逐步拆解需要完成的工作:
1)了解分析需求:了解接口要實(shí)現(xiàn)的功能
2)數(shù)據(jù)準(zhǔn)備:根據(jù)開發(fā)文檔確定接口的基本情況,知曉接口的url、請求方式、入?yún)⒌刃畔?,然后根?jù)業(yè)務(wù)邏輯以及入?yún)眍A(yù)期接口的輸出
- 需要有一個(gè)配置文件來存儲接口的一些基本信息;
- 需要有一個(gè)方法能讀取配置文件;
- 需要有一個(gè)excel或者yaml格式文件來存儲測試數(shù)據(jù);
- 需要有一個(gè)方法能讀取測試數(shù)據(jù);
- 需要有一個(gè)方法來把讀取到的配置文件和測試數(shù)據(jù)組裝成測試執(zhí)行時(shí)需要的參數(shù)化數(shù)據(jù);
如果預(yù)期結(jié)果是需要根據(jù)入?yún)⒉閿?shù)據(jù)庫來得到的時(shí)候還需要一個(gè)能執(zhí)行sql的方法
3)設(shè)計(jì)&執(zhí)行測試:生成一個(gè)測試文件,可以來根據(jù)入?yún)⒄{(diào)用接口獲得接口輸出然后驗(yàn)證
- 根據(jù)pytest的特性可以把準(zhǔn)備參數(shù)化的數(shù)據(jù)的工作放到conftest.py下;
- 需要有一個(gè)調(diào)用接口以及斷言驗(yàn)證的測試文件,命名規(guī)則為xxx_test.py或者test_xxx.py;
- 為了更好的對輸出和預(yù)期輸出做驗(yàn)證準(zhǔn)備封裝一下系統(tǒng)自帶的斷言;
- 為了能更好執(zhí)行測試封裝一下requests模塊,制定統(tǒng)一的輸入輸出標(biāo)準(zhǔn);
- 記錄執(zhí)行錯(cuò)誤信息引入日志記錄模塊;
4)查看結(jié)果:根據(jù)斷言結(jié)果來判定接口是否滿足需求框架最終的執(zhí)行順序如下圖所示
框架的基本結(jié)構(gòu)
然后介紹一個(gè)每個(gè)目錄下都有什么,分別完成什么工作
1、這里每一個(gè)文件對應(yīng)一個(gè)接口所需要的測試數(shù)據(jù),命名規(guī)則為nameA.xlsx或者nameA.yaml(nameA泛指待測接口名稱),文件里面可以存放調(diào)用接口所需的參數(shù)name、參數(shù)value、所需cookie、預(yù)期輸出結(jié)果
2、assertion.py
--封裝的斷言方法,用于驗(yàn)證接口返回值和預(yù)期結(jié)果是否一致
config.py
--封裝讀取配置文件的方法
get_caseparams.py
--把測試數(shù)據(jù)加工成接口所需要的格式
log.py
--封裝的記錄日志的方法
request.py
--封裝的https請求方法,主要是post和get
selectDB.py
--查詢sql并把結(jié)果加工成[dic1,dic2,dic3....]這種格式,每個(gè)dic是一條數(shù)據(jù)
testcasetemplate.py
--這個(gè)是根據(jù)caseparams文件夾下的測試數(shù)據(jù)自動在testcase文件夾下生成測試文件的腳本
3、里面存放兩個(gè)配置文件,base.ini存放數(shù)據(jù)庫連接的配置interface.ini是所有測試接口需要的配置。
4、記錄測試的日志文件,沒啥可說的,log.log是當(dāng)天文件,其他的是對應(yīng)日期下的歷史日志。
5、conftest.py固定名稱的一個(gè)文件,放在被測接口腳本同一個(gè)文件夾下,此處的作用是為每個(gè)被測腳本提供參數(shù)化支持 test_XXX.py這種文件是接口的測試文件,XXX為被測接口的名稱。
6、run.py ---測試執(zhí)行的主入口,如果把該接口自動化測試框架放到j(luò)enkins上做持續(xù)集成的時(shí)候,可以通過配置jenkins來代替這個(gè)入口。
使用說明
當(dāng)我們需要有一個(gè)接口(假定名稱為abc)需要用本框架進(jìn)行自動化測試的時(shí)候,操作步驟如下:
1、interface.ini文件下添加名稱為abc的節(jié)點(diǎn),然后在該節(jié)點(diǎn)下配置好接口的參數(shù)文件格式、http請求方式、接口url、接口wiki。
2、casefparams文件夾下創(chuàng)建名稱為abc.xlsx的用例數(shù)據(jù)文件。
3、執(zhí)行common文件夾下的testcasetemplate.py,執(zhí)行的結(jié)果是會自動根據(jù)前兩步配置的內(nèi)容在casefile文件夾下生成test_abc.py的腳本文件。
4、編輯test_abc.py添加所需要的斷言,來驗(yàn)證接口的準(zhǔn)確性。
5、執(zhí)行run.py完成測試。
測試執(zhí)行詳情為run.py指定要執(zhí)行測試的測試文件的路徑testcase目錄,根據(jù)pytest的運(yùn)行機(jī)制這之前會先調(diào)用testcase目錄下的conftest.py,這個(gè)文件在此處的作用就是通過遍歷testcase目錄下以test_為開頭的測試文件,然后調(diào)用讀取配置文件config.py、讀取并組裝參數(shù)的get_caseparams.py將測試用例數(shù)據(jù)參數(shù)化傳遞給test_開頭的測試文件,test_開頭的測試文件執(zhí)行的時(shí)候會把之前步驟傳遞過來的參數(shù)拆分,然后調(diào)用request.py發(fā)送http請求,獲得接口的json格式的返回結(jié)果,然后通過以下方式對接口返回結(jié)果做驗(yàn)證。
1)根據(jù)產(chǎn)品業(yè)務(wù)邏輯知道入?yún)⒌那闆r下很簡單就能得出預(yù)期結(jié)果的時(shí)候,可以直接把預(yù)期結(jié)果放到和入?yún)⒁黄鸬膃xcel或者yaml測試數(shù)據(jù)文件中,在執(zhí)行測試的時(shí)候這些參數(shù)也會一并傳遞給測試文件,直接取出來和接口輸出做驗(yàn)證即可。
2)需要查庫驗(yàn)證的情況需要把需要把接口的入?yún)⒆鳛閟ql的條件寫好sql后調(diào)用selectDB.py得到查詢結(jié)果再拿sql返回的結(jié)果和接口輸出做驗(yàn)證3)還有一些復(fù)雜的場景可能會根據(jù)接口入?yún)?,根?jù)業(yè)務(wù)邏輯自己寫腳本去獲得預(yù)期結(jié)果,然后和接口輸出做驗(yàn)證。