在之前的文章中主要分享了 pytest 的實(shí)用特性,接下來講 Pytest 參數(shù)化用例的構(gòu)建财异。
如果待測(cè)試的輸入與輸出是一組數(shù)據(jù),可以把測(cè)試數(shù)據(jù)組織起來用不同的測(cè)試數(shù)據(jù)調(diào)用相同的測(cè)試方法。參數(shù)化顧名思義就是把不同的參數(shù)名船,寫到一個(gè)集合里,然后程序會(huì)自動(dòng)取值運(yùn)行用例旨怠,直到集合為空便結(jié)束渠驼。pytest 中可以使用@pytest.mark.parametrize來參數(shù)化。
parametrize( ) 方法源碼:
def parametrize(self,argnames, argvalues, indirect=False, ids=None,
scope=None):
主要參數(shù)說明
argsnames :參數(shù)名鉴腻,是個(gè)字符串迷扇,如中間用逗號(hào)分隔則表示為多個(gè)參數(shù)名
argsvalues :參數(shù)值百揭,參數(shù)組成的列表,列表中有幾個(gè)元素蜓席,就會(huì)生成幾條用例
使用方法
使用 @pytest.mark.paramtrize() 裝飾測(cè)試方法
parametrize(‘data’, param) 中的 “data” 是自定義的參數(shù)名器一,param 是引入的參數(shù)列表
將自定義的參數(shù)名 data 作為參數(shù)傳給測(cè)試用例 test_func
然后就可以在測(cè)試用例內(nèi)部使用 data 的參數(shù)了
創(chuàng)建測(cè)試用例,傳入三組參數(shù)瓮床,每組兩個(gè)元素盹舞,判斷每組參數(shù)里面表達(dá)式和值是否相等,代碼如下:
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7*5",30)])
def test_eval(test_input,expected):
# eval 將字符串str當(dāng)成有效的表達(dá)式來求值隘庄,并返回結(jié)果
assert eval(test_input) == expected
運(yùn)行結(jié)果:
plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, ordering-0.6,
forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 3 items
test_mark_paramize.py::test_eval[3+5-8]
test_mark_paramize.py::test_eval[2+5-7]
test_mark_paramize.py::test_eval[7*5-35]
============================== 3 passed in 0.02s ===============================
整個(gè)執(zhí)行過程中踢步,pytest 將參數(shù)列表 [(“3+5”,8),(“2+5”,7),("75",30)] 中的三組數(shù)據(jù)取出來,每組數(shù)據(jù)生成一條測(cè)試用例丑掺,并且將每組數(shù)據(jù)中的兩個(gè)元素分別賦值到方法中获印,作為測(cè)試方法的參數(shù)由測(cè)試用例使用。
同一個(gè)測(cè)試用例還可以同時(shí)添加多個(gè) @pytest.mark.parametrize 裝飾器, 多個(gè) parametrize 的所有元素互相組合(類似笛卡兒乘積)街州,生成大量測(cè)試用例兼丰。
場(chǎng)景:比如登錄場(chǎng)景,用戶名輸入情況有 n 種唆缴,密碼的輸入情況有 m 種鳍征,希望驗(yàn)證用戶名和密碼,就會(huì)涉及到 nm 種組合的測(cè)試用例面徽,如果把這些數(shù)據(jù)一一的列出來艳丛,工作量也是非常大的。pytest 提供了一種參數(shù)化的方式趟紊,將多組測(cè)試數(shù)據(jù)自動(dòng)組合氮双,生成大量的測(cè)試用例。示例代碼如下:
@pytest.mark.parametrize("x",[1,2])
@pytest.mark.parametrize("y",[8,10,11])
def test_foo(x,y):
print(f"測(cè)試數(shù)據(jù)組合x: {x} , y:{y}")
運(yùn)行結(jié)果:
plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, ordering-0.6,
forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 6 items
test_mark_paramize.py::test_foo[8-1]
test_mark_paramize.py::test_foo[8-2]
test_mark_paramize.py::test_foo[10-1]
test_mark_paramize.py::test_foo[10-2]
test_mark_paramize.py::test_foo[11-1]
test_mark_paramize.py::test_foo[11-2]
分析如上運(yùn)行結(jié)果霎匈,測(cè)試方法 test_foo( ) 添加了兩個(gè) @pytest.mark.parametrize() 裝飾器戴差,兩個(gè)裝飾器分別提供兩個(gè)參數(shù)值的列表,2 * 3 = 6 種結(jié)合铛嘱,pytest 便會(huì)生成 6 條測(cè)試用例暖释。在測(cè)試中通常使用這種方法是所有變量、所有取值的完全組合弄痹,可以實(shí)現(xiàn)全面的測(cè)試饭入。
下面講結(jié)合 @pytest.fixture 與 @pytest.mark.parametrize 實(shí)現(xiàn)參數(shù)化。
如果測(cè)試數(shù)據(jù)需要在 fixture 方法中使用肛真,同時(shí)也需要在測(cè)試用例中使用谐丢,可以在使用 parametrize 的時(shí)候添加一個(gè)參數(shù) indirect=True,pytest 可以實(shí)現(xiàn)將參數(shù)傳入到 fixture 方法中,也可以在當(dāng)前的測(cè)試用例中使用乾忱。
parametrize 源碼:
def parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None):
indirect 參數(shù)設(shè)置為 True讥珍,pytest 會(huì)把 argnames 當(dāng)作函數(shù)去執(zhí)行,將 argvalues 作為參數(shù)傳入到 argnames 這個(gè)函數(shù)里窄瘟。創(chuàng)建“test_param.py”文件衷佃,代碼如下:
方法名作為參數(shù)
test_user_data = ['Tome', 'Jerry']
@pytest.fixture(scope="module")
def login_r(request):
# 通過request.param獲取參數(shù)
user = request.param
print(f"\n 登錄用戶:{user}")
return user
@pytest.mark.parametrize("login_r", test_user_data,indirect=True)
def test_login(login_r):
a = login_r
print(f"測(cè)試用例中l(wèi)ogin的返回值; {a}")
assert a != ""
運(yùn)行結(jié)果:
plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, ordering-0.6,
forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 2 items
test_mark_paramize.py::test_login[Tome]
test_mark_paramize.py::test_login[Jerry]
============================== 2 passed in 0.02s ===============================
Process finished with exit code 0
登錄用戶:Tome PASSED [ 50%]測(cè)試用例中l(wèi)ogin的返回值; Tome
登錄用戶:Jerry PASSED [100%]測(cè)試用例中l(wèi)ogin的返回值; Jerry
上面的結(jié)果可以看出,當(dāng) indirect=True 時(shí)蹄葱,會(huì)將 login_r 作為參數(shù)氏义,test_user_data 被當(dāng)作參數(shù)傳入到 login_r 方法中,生成多條測(cè)試用例图云。通過 return 將結(jié)果返回惯悠,當(dāng)調(diào)用 login_r 可以獲取到 login_r 這個(gè)方法的返回?cái)?shù)據(jù)。
【相關(guān)閱讀】
Python 測(cè)試開發(fā)實(shí)戰(zhàn)進(jìn)階竣况,挑戰(zhàn)阿里P6+克婶,年薪50W+!
干貨 | 一文搞定 pytest 自動(dòng)化測(cè)試框架(一)
干貨 | 一文搞定 pytest 自動(dòng)化測(cè)試框架(二)
干貨 | 一文搞定 Linux 常用高頻命令
獲取更多相關(guān)資料:請(qǐng)?zhí)砑觱x,ceshiren001
https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=jianshu×tamp=1652686087&author=MM