柚子快報邀請碼778899分享:pytest常用參數(shù)化方法詳解
柚子快報邀請碼778899分享:pytest常用參數(shù)化方法詳解
????????最近在學習python的pytest自動化框架,對于pytest的參數(shù)化相關(guān)信息進行一個記錄,信息可能不全,有問題可以私信指正。
pytest運行參數(shù):
-s :?
其作?是可以讓打印的內(nèi)容輸出顯示在終端中,或者可以在終端中與?例中的輸?操作進?交互
-v:
表示詳細輸出更詳細的輸出,包括每個測試?例的詳細結(jié)果和其他相關(guān)信息,例如測試?例所在的模塊、?件路徑等。
以上兩個參數(shù)可以一起使用: -sv
-q :
簡化輸出,正與-v參數(shù)相反
--lf(last fail):
可以把上次執(zhí)行失敗的用例重新執(zhí)行,跳過上一次執(zhí)行成功的測試用例
-m 標簽名:
執(zhí)行特定的測試用例,可以使用參數(shù)-m加上標簽名
注意:使用@pytest.mark參數(shù),需要在根目錄下建立一個pytest.ini文件并且寫入markers選項,否則會產(chǎn)生war
首先,使用@pytest.mark.標簽名
在pytest.ini中添加markers,將標簽名添加
執(zhí)行時,添加 -m 標簽名
–-ff參數(shù):
把上次執(zhí)行失敗的用例執(zhí)行完后,再繼續(xù)執(zhí)行剩下成功的用例
自定義參數(shù):目前還沒有運用過,后續(xù)會更新
參數(shù)化函數(shù)
pytest.fixture:
定義:
1. 定義fixture跟定義普通函數(shù)差不多,唯一區(qū)別就是在函數(shù)上加個裝飾器@pytest.fixture(),fixture命名不要用test_開頭,跟用例區(qū)分開。用例才是test_開頭的命名; 2. fixture裝飾器里的scope有四個級別的參數(shù):function(不寫默認這個)、class、module、session; 3. fixture可以有返回值,如果沒有return,默認會是None;用例調(diào)用fixture的返回值,就是直接把4. fixture的函數(shù)名稱作為參數(shù)傳入; 5. fixture可以返回一個元組、列表或字典; 6. 測試用例可傳單個、多個fixture參數(shù); 7. fixture與fixture間可相互調(diào)用;
格式如下:
@pytest.fixture(scope="", params="", autouse=False, ids="", name="")
scope:表示被@pytest.fixture標記的方法作用域,它的值主要有4個:
????????function:默認,范funtion:作用域是方法,就是在每個測試用例執(zhí)行之前都會先去執(zhí)行前置操作,類似setup/teardown
????????class:作用域是每一個類,就是在每個類執(zhí)行之前會執(zhí)行前置操作(注意:測試類中只要有一個測試用例的參數(shù)中使用了class級別的fixture,則在整個測試類的所有測試用例都會調(diào)用fixture函數(shù))
????????module:作用域是模塊,也就是類,一個文件有多個類的時候,每次都只會執(zhí)行一次前置和后置操作
????????package/session:多個測試用例文件只執(zhí)行一次前后置操作
params:參數(shù)化(支持的格式有:list、tuple、字典)
autouse:自動使用,默認False,autouse設(shè)置為True,自動調(diào)用fixture功能。所有用例都會生效,包括類中的測試用例和類以外的測試用例
ids:當使用params參數(shù)化時,給每一個值設(shè)置一個變量,意義不大
name:給被fixture標記的方法修改別名
方法一:作為參數(shù)
fixture的名字直接作為測試用例的參數(shù),用例調(diào)用fixture的返回值,直接將fixture的函數(shù)名稱當做變量名稱;如果用例需要用到多個fixture的返回數(shù)據(jù),fixture也可以返回一個元祖,list或字典,然后從里面取出對應數(shù)據(jù),使用方式如下:
將fixture函數(shù)作為參數(shù)傳遞:
在同一個測試用例中傳入多個fixture:
方法二:conftest.py+@pytest.fixtrue實現(xiàn)全局前后置應用
在conftest.py文件中配置,實現(xiàn)在測試用例執(zhí)行前后實現(xiàn)某些特定操作,實例如下:
可實現(xiàn)在測試用例執(zhí)行前清空日志文件信息和信息打印
注意:
conftest.py文件須知: conftest.py與運行的用例要在同一個pakage下,并且有__init__.py文件; 不需要import導入conftest.py,pytest用例會自動識別該文件,放到項目的根目錄下就可以全局目錄調(diào)用了,如果放到某個package下,那就在package內(nèi)有效,可有多個conftest.py; conftest.py配置腳本名稱是固定的,不能改名稱; 所有同目錄測試文件運行前都會執(zhí)行conftest.py文件
方法三:與pytest.mark.usefixtures組合使用,實現(xiàn)fixture疊加調(diào)用
注意:直接傳入fixture不同的是,pytest.mark.usefixtures無法獲取到被fixture裝飾的函數(shù)的返回值;使用場景為測試用例需要多個fixture做前后置工作時使用
mark標記
特點:
裝飾器@pytest.mark.markname可以標記測試函數(shù),測試類。 一個mark可以標記多個測試函數(shù),一個測試函數(shù)可以使用多個mark;有多個mark標記的時候,最接近測試函數(shù)的標記將首先迭代。 運行沒有注冊的標記,會出現(xiàn)warning警告,要先注冊標記,再使用標記(方式:在pytest.ini文件注冊自定義標記)。 當使用--strict-markers命令行參數(shù)的時候,運行未在pytest.ini文件中注冊的任何標記都將引發(fā)異常。 pytest --markers 可以查看所有的mark標簽,包括內(nèi)置標記和自定義標記。
pytest.mark.parametrize
定義:實現(xiàn)測試用例參數(shù)化,類似DDT
格式:@pytest.mark.parametrize(argnames,?argvalues,?indirect=False,?ids=None,?scope=None,?*,?_param_mark=None)
argnames:參數(shù)名,以逗號分隔的字符串,表示一個或多個參數(shù)名稱。或參數(shù)字符串組成的列表/元組。 ? ? ? ? 如果是一個參數(shù),使用參數(shù)名的字符串。
? ? ? ? 如果是多個參數(shù),多個參數(shù)名之間使用逗號分隔的字符串,或者多個參數(shù)名組成的列表,或者多個參數(shù)名組成的元組。
argvalues:參數(shù)值,類型是一個可迭代對象,和參數(shù)名一一對應。 ? ? ? ? 如果argnames為一個參數(shù),則argvalues是一個值列表。
? ? ? ? 如果argnames為多個參數(shù),則argvalues必須是一個嵌套元組的列表,其中每個元組元素值與參數(shù)名一一對應。
indirect:參數(shù)名稱列表(參數(shù)名稱的子集)或布爾值。 ? ? ? ? indirect一般與Pytest的fixture,request.param組合使用
? ? ? ? 當indrect =True時,argnames參數(shù)名是fixture夾具的函數(shù)名,argvalues則是給這個夾具函數(shù)傳遞的參數(shù)。
ids:標記參數(shù)化測試用例的執(zhí)行名稱,默認自動生成,多個參數(shù)名之間用"-"連接。scope:參數(shù)范圍。 ?
實例:
傳一個參數(shù) @pytest.mark.parametrize('參數(shù)名',list) 進行參數(shù)化 傳兩個參數(shù)@pytest.mark.parametrize('參數(shù)名1,參數(shù)名2',[(參數(shù)1_data[0], 參數(shù)2_data[0]),(參數(shù)1_data[1], 參數(shù)2_data[1])]) 進行參數(shù)化
方法:
單個參數(shù):輸入值可以填寫多個,逗號區(qū)分
多個參數(shù):輸入值以列表形式賦值
參數(shù)組合使用,效果類似笛卡爾積:
參數(shù)化集合標記:
使用pytest.param進行標記:例如跳過某條測試用例的執(zhí)行:pytest.param("Alex", "123456", marks=pytest.mark.skip或者對測試用例進行標簽
調(diào)用外部函數(shù):
結(jié)合marks ,為特定參數(shù)組合添加額外的標記。
@pytest.mark.parametrize("x, y", [
(1, 2, pytest.mark.smoke),添加標記
(3, 4),
], indirect=True)
def test_marks(x, y):
assert x + y in [3, 7]
pytest.mark.skip
定義:無條件跳過測試用例
語法:pytest.mark.skip(reason=None) ;reason:str類型,默認值為None,可以添加跳過測試用例原因的描述信息
pytest.mark.skipif
定義:如果條件為真,則跳過測試用例
語法:pytest.mark.skipif(condition,?*,?reason=None);
condition,條件,可以為True,False或者條件字符串;條件為真,則標記起作用;條件為假,則標記不起作用;使用condition參數(shù)的時候,必須有參數(shù)reason,否則會報錯ERROR;
reason:str類型,默認值為None,可以添加跳過測試用例原因的描述信息。
pytest.mark.xfail
定義:將測試用例標記為預期失敗
語法:
pytest.mark.xfail(condition=None,?*,?reason=None,?raises=None,?run=True,?strict=False)
condition,條件,默認值為None,可以為True,False或者條件字符串;條件為真,則標記起作用。條件為假,則標記不起作用;使用參數(shù)condition的時候,必須有參數(shù)reason,否則會報錯ERROR。
reason,str類型,默認值為None,可以添加預期失敗原因的描述信息。 raises,異常類型,默認值為None,可以是單個異常,也可以是多個異常組成的元組;如果測試用例執(zhí)行失敗,出現(xiàn)的異常類型在raises里,則不會拋出異常,測試用例標記為XFAIL;如果測試用例執(zhí)行失敗,出現(xiàn)raises之外的異常,則測試用例標記為FAILED,并拋出異常信息。 run,布爾型,默認值為True;當run=False時候,直接將測試用例標記為XFAIL,不需要執(zhí)行測試用例。 strict,默認值為False;當strict=False時,如果用例執(zhí)行失敗,結(jié)果標記為XFAIL,表示符合預期的失敗;如果用例執(zhí)行成功,結(jié)果標記為XPASS,表示不符合預期的成功;當strict=True時,如果用例執(zhí)行成功,結(jié)果將標記為FAILED,而不再是XPASS了;可以在pytest.ini文件中配置:xfail_strict=true ?
預期:
XFAIL,預期失敗的測試用例,實際結(jié)果執(zhí)行失敗,預期結(jié)果和實際結(jié)果一致。XPASS,預期失敗的測試用例,實際結(jié)果執(zhí)行成功,預期結(jié)果和實際結(jié)果不一致。pytest.xfail 方法在用例執(zhí)行過程中直接標記用例結(jié)果為XFAIL,不會執(zhí)行后面的代碼。
pytest.mark.filterwarnings
?添加警告過濾器
語法:
pytest.mark.filterwarnings(filter)
filter,str類型,一個由Python文檔的警告過濾器部分中指定的元組內(nèi)容(action, message, category, module, lineno)組成的警告規(guī)范字符串,用“:”分隔??蛇x字段可以省略。
eg:
import warnings import pytest
def api_v1(): ? ? warnings.warn(UserWarning("api v1, should use functions from v2")) ? ? return 1
@pytest.mark.filterwarnings("ignore:api v1") def test_one(): ? ? assert api_v1() == 1
pytest.marl.tryfirst/trylast
tryfirst:
mark a hook implementation function such that the plugin machinery will try to call it first/as early as possible
標記一個hook實現(xiàn)函數(shù),以便插件機制將嘗試首先/盡早調(diào)用它
trylast:
標記一個hook實現(xiàn)函數(shù),以便插件機制將嘗試最后/盡晚調(diào)用它
柚子快報邀請碼778899分享:pytest常用參數(shù)化方法詳解
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。