Pytest之參數(shù)化

02
2020-09
今天距2021年120天
這是ITester軟件測試小棧第154次推文

點擊上方藍(lán)字“ITester軟件測試小棧“關(guān)注我,每周一、三、五早上?08:30準(zhǔn)時推送,每月不定期贈送技術(shù)書籍。
微信公眾號后臺回復(fù)“資源”、“測試工具包”領(lǐng)取測試資源,回復(fù)“微信群”一起進(jìn)群打怪。
本文3090字,閱讀約需8分鐘
Pytest使用@pytest.mark.parametrize裝飾器來實現(xiàn)數(shù)據(jù)驅(qū)動測試的,也就是常說的參數(shù)化。parametrize語法
parametrize(self,argnames,?argvalues,?indirect=False,?ids=None,?scope=None)
argnames:參數(shù)名。
argvalues:參數(shù)對應(yīng)值,類型必須為list。如果只有一個參數(shù),里面則是值的列表:
如:@pytest.mark.parametrize("username", ["yy", "yy2", "yy3"])。如果有多個參數(shù),則需要用元組來存放值,一個元組對應(yīng)一組參數(shù)的值,如:@pytest.mark.parametrize("name,pwd", [("yy1", "123"), ("yy2", "123"), ("yy3", "123")])。
indirect:如果設(shè)置成True,則把傳進(jìn)來的參數(shù)當(dāng)函數(shù)執(zhí)行,而不是一個參數(shù)。
ids:用例的ID,傳一個字符串列表,用來標(biāo)識每一個測試用例,自定義測試數(shù)據(jù)結(jié)果,增加可讀性。
參數(shù)講解
import?pytest
data?=?["小紅",?"小明"]
@pytest.mark.parametrize("name",data)
def?test_demo(name):
????print("測試數(shù)據(jù)為{}".format(name))
運行結(jié)果為:

01 列表嵌套字典
import?pytest
data_1?=?[
????{"username":?"admin1",?"password":?"123456"},
????{"username":?"admin2",?"password":?"12345678"},
]
@pytest.mark.parametrize("data",?data_1)
def?test_login(data):
????print("賬號:{},密碼:{}".format(data["username"],data["password"]))
運行結(jié)果為:

02?列表嵌套列表
import?pytest
data_1?=?[
????["admin1",?"123456"],
????["admin2",?"12345678"],
]
@pytest.mark.parametrize("username,password",?data_1)
def?test_login(username,password):
????print("賬號:{},密碼:{}".format(username,?password))
運行結(jié)果為:

03?列表嵌套元組
import?pytest
data_1?=?[
????("admin1",?"123456"),
????("admin2",?"12345678"),
]
@pytest.mark.parametrize("username,password",?data_1)
def?test_login(username,password):
????print("賬號:{},密碼:{}".format(username,?password))
運行結(jié)果為:

場景運用
import?pytest
@pytest.mark.parametrize("username,password",[("admin01","123456"),("admin02","12345678")])
def?test_demo(username,password):
????print("用戶名:{},密碼:{}".format(username,password))
運行結(jié)果為:

import?pytest
@pytest.mark.parametrize("username,password",[("admin01","123456"),("admin02","12345678")])
class?TestDemo:
????def?test_demo(self,username,password):
????????print("用戶名:{},密碼:{}".format(username,password))
運行結(jié)果為:

注意:裝飾測試類時,類內(nèi)所有的方法必須接收測試數(shù)據(jù),否則會報錯;裝飾測試函數(shù)時比較靈活,如果函數(shù)不使用數(shù)據(jù)就可以不裝飾。
使用多個參數(shù)化裝飾器,數(shù)據(jù)會進(jìn)行交叉組合的方式傳遞給測試函數(shù),進(jìn)而生成n*n個測試用例(笛卡爾積)。
test_demo.py
import?pytest
username?=?["admin1",?"admin2",?"admin3"]
password?=?["123456",?"1234567",?"12345678"]
@pytest.mark.parametrize("uname",username)
@pytest.mark.parametrize("pwd",password)
def?test_demo(uname,pwd):
????print("用戶名:{},密碼:{}".format(uname,?pwd))
運行結(jié)果如下:

parametrize參數(shù)中的ids,可以標(biāo)識每一個測試用例,自定義測試數(shù)據(jù)結(jié)果的顯示,增加可讀性。
test_demo.py
import?pytest
data_1?=?[
????(1,?2,?3),
????(4,?5,?9)
]
ids?=?["a:{}?+?b:{}?=?expect:{}".format(a,?b,?expect)?for?a,?b,?expect?in?data_1]
def?add(a,?b):
????return?a?+?b
@pytest.mark.parametrize('a,?b,?expect',?data_1,?ids=ids)
def?test_parametrize_1(a,?b,?expect):
????print('\n測試函數(shù)1測試數(shù)據(jù)為\n{}-{}'.format(a,?b))
????assert?add(a,?b)?==?expect
命令行輸入:pytest -v



測試交流Q群:727998947

