本文章將介紹接口自動(dòng)化所覆蓋的接口測(cè)試場(chǎng)景和接口測(cè)試斷言的深度
場(chǎng)景:
1.單接口各類接口異常傳參組合
2.多接口集成執(zhí)行,模擬業(yè)務(wù)場(chǎng)景
斷言深度:
1.HTTP狀態(tài)碼校驗(yàn)
2.接口返回值校驗(yàn)
3.接口返回值內(nèi)包含json校驗(yàn)
4.數(shù)據(jù)庫(kù)結(jié)果校驗(yàn)
一,用到的第三方庫(kù)一覽:
parameterized==0.6.1? ?
mysqlclient==1.3.13
requests==2.18.4
rsa==4.0
wheel==0.32.2
configparser==3.5.0
sshtunnel==0.1.4
文檔目錄結(jié)構(gòu):

文檔目錄介紹:
1.mysql_dml該目錄存放sql執(zhí)行方法,在后續(xù)需要執(zhí)行sql語(yǔ)句時(shí),調(diào)用該文件下的類即可
2.public_api 目錄為所有接口請(qǐng)求類,每個(gè)接口為類中的一個(gè)方法
3.service_logic 所有接口的共用邏輯,在此文件夾內(nèi)實(shí)現(xiàn)(如2個(gè)或者3個(gè)接口以上,在進(jìn)行集成接口調(diào)用時(shí)經(jīng)常被使用到的,可以拆出來(lái)放在這個(gè)文件夾)
4.test_case 測(cè)試方法的main函數(shù),所有測(cè)試方法主入口在這里執(zhí)行
5.test_data 測(cè)試數(shù)據(jù),csv文件管理的測(cè)試數(shù)據(jù)在該文件中存放
6.test_report測(cè)試報(bào)告,存放HTML測(cè)試報(bào)告文件
7.utils 該文件存放接口測(cè)試時(shí)需要用到的工具,比如公私鑰加密的方法,日志類,HTML測(cè)試報(bào)告類,數(shù)據(jù)庫(kù)連接器等
執(zhí)行過(guò)程如下:
首先test_case測(cè)試方法主入口,都加入了一個(gè)裝飾器:

getJsonData接收一個(gè)參數(shù):測(cè)試用例文件的url
將文件路徑傳入至該函數(shù)中時(shí),該方法會(huì)將csv中得到的數(shù)據(jù),序列化為dict數(shù)據(jù),例如csv中數(shù)據(jù)如下:
case_name? api_url? type? header .......
登錄? ? ? ? ? ? ? /login? ? post? {"content-type":""}........
第二行
轉(zhuǎn)為:[{"case_name":"登錄","api_url":"/login","type":"post"...},{第二行}]
轉(zhuǎn)為列表包字典的數(shù)據(jù)格式后,傳入paranmeterized.expand()方法
該方法的作用是會(huì)根據(jù)列表的長(zhǎng)度生成以下標(biāo)從0開始的方法個(gè)數(shù),比如:
我在test_login(self,data):方法上加入該裝飾器,csv文件中有2行數(shù)據(jù),那么運(yùn)行時(shí)會(huì)生成test_login0(self,data),test_login1(self,data)的方法個(gè)數(shù)
然后調(diào)用unittest.main調(diào)用所有以test_開頭的的方法,即可達(dá)到循環(huán)傳參的方式了。
csv中字段詳解:
caseName,:測(cè)試用例名稱
apiUrl, 測(cè)試用例url(注意不包含域名,域名卸載config.ini配置文件中)
type,(接口類型,post,get或其他的,需要其他的可自行擴(kuò)展)
header,(默認(rèn)的請(qǐng)求頭,{"content-type":"application/json"})
precondition_type,(前置條件類型,目前三種:為空,script,sql)
precondition,(前置條件具體數(shù)據(jù))
on-off,(單接口執(zhí)行的開關(guān))
jsonData,(json數(shù)據(jù))
assertWay,(斷言方式,return_result,sql)
assertField, (斷言的字段)
assertValue(斷言的值)
這里著重講解precondition_type,precondition,jsonData的關(guān)系:
如果前置條件選擇為空的話,precondition則也為空
如果precondition前置條件選擇為script的話,precondition的值為{"$需要替換的字段":"需要替換的取值方式"},假如json數(shù)據(jù)為{"a":{"b":"$c"}}
上個(gè)接口返回的數(shù)據(jù)為{"d":{"c":"e"}},其中C這個(gè)值需要從這個(gè)返回結(jié)果中取出,precondition則要設(shè)置為{"$c":"d|c"},這樣json數(shù)據(jù)就能成功被替換,多個(gè)的話也是支持的
如果precondition前置條件選擇為sql的話,precondition的值為{"$需要替換的字段":"需要替換的sql語(yǔ)句"},在測(cè)試過(guò)程中,有些接口需要從數(shù)據(jù)庫(kù)中得到一些數(shù)據(jù)才能測(cè)試,這樣的情況下,可以使用sql的方式去對(duì)json數(shù)據(jù)做替換,寫法為
{"$c":"select id from user where name='張三'"} 這樣我們就能將查詢出的結(jié)果替換給json了
另外:assertWay,assertField,assertValue也很重要
其中assertWay如果選擇為sql的話,
斷言的值為取json的數(shù)據(jù),例如json_result 為 {"a":{"b":"c"}},取b的值為a|b
assertValue 直接填寫sql語(yǔ)句例如,select.........
如果assertWay為return_result的話,就顧名思義了,直接查詢返回結(jié)果對(duì)不對(duì),取值方式和上面一樣也是a|b|c之類的
多接口集成測(cè)試差點(diǎn)忘記講了:
由于上面部分全部講的是單接口運(yùn)行,所以在串聯(lián)的時(shí)候,當(dāng)然不需要paranmeterized.expand()該裝飾方法了,所以調(diào)用public_api文件中的接口時(shí),調(diào)用方式需要改變?yōu)椋?/p>
接口方法(csv中第幾行)例如:login_api(1) 這個(gè)1為csv中第一行的數(shù)據(jù),于是就是用csv中第一行的數(shù)據(jù)執(zhí)行該接口,
如果集成多接口的場(chǎng)景為登錄,新增某條數(shù)據(jù),注銷則為:
login_result = login_api(1)
login_required = login_result.json()['Authorization']
insert_data_api(1,header=login_required)
logout_api(1,header=login_required)
另外還記得之前csv字段提到的on-off字段嗎,那個(gè)字段是為了表示有些數(shù)據(jù)只能在集成的時(shí)候用到,所以將字段改為OFF的情況下,代碼在單接口執(zhí)行的情況下將不會(huì)執(zhí)行這行數(shù)據(jù)
另外附上源碼,如果有優(yōu)化意見有待改進(jìn)的地方,歡迎指出
https://github.com/ZhangWei55kai/api_testV3.0