前言
當(dāng)前項(xiàng)目所使用的接口自動化,用的是之前寫的unittest+ddt的哩俭。偶爾上BOSS看了一些招聘消息蒸殿,就花了點(diǎn)時間學(xué)習(xí)pytest宾毒,然后寫了這個接口自動化:pytest+allure。
思路
1盆犁、主體思路
- 采用數(shù)據(jù)驅(qū)動:yaml文件管理測試用例命咐,一個yaml文件最好對標(biāo)一個接口,然后有不同情況的請求/判斷數(shù)據(jù)
- 請求需要處理數(shù)據(jù)依賴的情況蚣抗,因?yàn)橛昧藃equests.session()進(jìn)行會話保持侈百,所以排除cookies的依賴。需要處理的是其它參數(shù)的依賴翰铡,比如:支付請求的參數(shù)訂單號的值钝域,來自于確認(rèn)訂單的響應(yīng)參數(shù)訂單號的值。
- 解決方案:
1.依賴數(shù)據(jù)變量開頭用$
標(biāo)記锭魔,比如$orderid
(一個請求中例证,不能出現(xiàn)多個同名依賴數(shù)據(jù)變量)
2.需要指定提取該變量的測試用例
3.需要指定需要提取的變量名,比如:
- 解決方案:
variables: # 需要獲取的變量值(本用例需要)
- login: # 提取變量的測試用例
- code_value
- data_value # 變量名
4.對應(yīng)的測試用例迷捧,需要指定要提取的變量织咧,以及值在response的位置,比如:
relevance: # 提取出去的變量(提供其它用例)
code_value: content.data.code # 變量名: 變量位置
data_value: content.data
ps.variables指定的變量名需要和relevance中指定的變量一致漠秋,就比如上面笙蒙,從login提取code_value和data_value,那么login.yaml提供該數(shù)據(jù)的請求中庆锦,relevance也需要指定code_value和data_value(暫時沒處理如果有多個相同的情況捅位,默認(rèn)取一個)
- 測試用例的數(shù)據(jù),通過
@pytest.mark.parametrize("param, title", test_params)
傳遞
param
:每次請求的內(nèi)容
title
:該請求的標(biāo)題
2搂抒、難點(diǎn):
難點(diǎn)1:處理依賴數(shù)據(jù)艇搀;還是用上面的例子:支付請求的參數(shù)訂單號的值,來自于確認(rèn)訂單的響應(yīng)參數(shù)訂單號的值求晶。
1.在“支付請求”測試用例pay.yaml
中焰雕,比如url上需要帶上orderid
,寫成:http://www.xxx.com?orderid=$orderid
2.然后說明該參數(shù)值需要去“確認(rèn)訂單”測試用例order.yaml
中去獲取芳杏,所以用例pay.yaml
中寫上:
variables:
- order:
- orderid
3.比如orderid需要取自一個正確下單的請求用例矩屁,那么就在“確認(rèn)訂單”測試用例order.yaml
該請求用例中辟宗,寫上:
relevance: # 提取出去的變量(提供其它用例)
orderid: content.data.orderid # 變量名: 變量位置
邏輯解釋:
1:處理yaml數(shù)據(jù)時,發(fā)現(xiàn)一個接口請求數(shù)據(jù)中有$
開頭的數(shù)據(jù)档插,則添加到一個list中慢蜓,然后該list值會以dict{variables_data:[orderid]}
的形式,組裝在這個接口請求數(shù)據(jù)中(非全局)
2:同時郭膛,如果發(fā)現(xiàn)一個接口請求有步驟2的結(jié)構(gòu)晨抡,則會處理成這樣:variables: [{'login': ['orderid']}, {'xxx': ['xxx','xxx']}]
當(dāng)發(fā)現(xiàn)一個接口請求數(shù)據(jù),同時有variables_data
和variables
這兩個值则剃,那說明這個接口需要其它用例提供依賴數(shù)據(jù)值
3:根據(jù)variables: [{'login': ['orderid']}, {'xxx': ['xxx','xxx']}]
耘柱,找到login.yaml
這個測試用例文件,然后讀取該文件內(nèi)容和進(jìn)行判斷棍现,看哪個用例中存在relevance: {'orderid': 'content.data.orderid'}
调煎,說明所想要獲取的orderid的值,取自于這個用例請求response的content.data.orderid
己肮。那么就會發(fā)送這個請求士袄,在響應(yīng)中取值response.content.data.orderid
。比如說如果orderid=10
4:接著把這個值谎僻,替換到http://www.xxx.com?orderid=$orderid
中娄柳,也就是http://www.xxx.com?orderid=10
。然后發(fā)送該請求
難點(diǎn)2:把yaml用例數(shù)據(jù)艘绍,解析成適用@pytest.mark.parametrize()的數(shù)據(jù)格式
@pytest.mark.parametrize("param1, param2", params)
赤拒,其中的params
所需的數(shù)據(jù)結(jié)構(gòu)需可迭代,比如[ [param1_1, param2_1], [param1_2, param2_2]... ]
诱鞠。那么每次獲取傳遞來的就是里面的[param1_x, param2_x]
yaml讀取的結(jié)構(gòu)挎挖,自行百度;然后詳細(xì)代碼邏輯就不說明了航夺。