參數(shù)化,就是把測試過程中的數(shù)據(jù)提取出來,通過參數(shù)傳遞不同的數(shù)據(jù)來驅(qū)動用例運行咪啡。其實也就是數(shù)據(jù)驅(qū)動的概念。
在 Unittest 中暮屡,我們講過使用 ddt 庫配合 unittest 實現(xiàn)數(shù)據(jù)驅(qū)動撤摸。在 Pytest 中并不需要額外的庫,通過 pytest.mark.parametrize()
即可實現(xiàn)參數(shù)化。
單個參數(shù)
在使用pytest.mark.parametrize()
傳遞參數(shù)化數(shù)據(jù)時准夷,測試用例本身必須有參數(shù)钥飞。
import pytest
# 待測函數(shù)
def add(a, b):
return a + b
# 單個參數(shù)的情況
@pytest.mark.parametrize('a', (1,2,3,4,5))
def test_add(a): # => 作為用例參數(shù),接收裝飾器傳入的數(shù)據(jù)
print('\na的值:', a)
assert add(a, 1) == a+1
注意用法衫嵌,@pytest.mark.parametrize()
裝飾器接收兩個參數(shù)读宙,一個參數(shù)是以字符串的形式標(biāo)識用例函數(shù)的參數(shù),第二個參數(shù)以列表或元組的形式傳遞測試數(shù)據(jù)楔绞。
運行命令:
pytest test_params.py -v -s
運行后的效果:
多個參數(shù)
多個參數(shù)论悴,@pytest.mark.parametrize()
第一個參數(shù)依然是字符串, 對應(yīng)用例的多個參數(shù)用逗號分隔墓律。
# 多個參數(shù)的情況
@pytest.mark.parametrize('a, b, c', [(1,2,3), (4,5,9), ('1', '2', '12')])
def test_add(a, b, c):
print(f'\na,b,c的值:{a},,{c}')
assert add(a, b) == c
運行結(jié)果如下:
對測試類參數(shù)化
測試類的參數(shù)化幔亥,其實際上也是對類中的測試方法進(jìn)行參數(shù)化耻讽。類中的測試方法的參數(shù)必須與@pytest.mark.parametrize()
中的標(biāo)識的參數(shù)個數(shù)一致。
# 測試類參數(shù)化
@pytest.mark.parametrize('a, b, c', [(1,2,3), (4,5,9)])
class TestAdd():
def test_add1(self, a, b, c):
assert add(a, b) == c
def test_add2(self, a, b, c):
assert add(a, b) == c
參數(shù)化會作用于每個測試方法帕棉,比如上面兩個用例针肥,參數(shù)化了兩條數(shù)據(jù),那么就會執(zhí)行 4 次香伴。
運行結(jié)果如下:
修改結(jié)果顯示名稱
通過上面的運行結(jié)果慰枕,我們可以看到,為了區(qū)分參數(shù)化的運行結(jié)果即纲,在結(jié)果中都會顯示數(shù)據(jù)組合而成的名稱具帮。
數(shù)據(jù)短小還好說,如果數(shù)據(jù)比較長而復(fù)雜的話低斋,那么就會很難看蜂厅。
@pytest.mark.parametrize()
還提供了第三個 ids
參數(shù)來自定義顯示結(jié)果。
test_add1[4-5-9]
這是結(jié)果中顯示的名稱膊畴,ids 的修改會作用于[]
中的顯示掘猿。
我們下面的示例只是簡單的為數(shù)據(jù)編了一個號:
# ids 的作用
data = [(1,2,3), (4,5,9), ('1', '2', '12')]
ids = [f'datavbhdzdh' for d in range(len(data))] # => 生成與數(shù)據(jù)數(shù)量相同的名稱列表
@pytest.mark.parametrize('a, b, c', data, ids=ids)
def test_add(a, b, c):
print(f'\na,b,c的值:{a},,{c}')
assert add(a, b) == c
ids
必須是與數(shù)據(jù)數(shù)量相同的名稱(必須是字符串)列表唇跨。
顯示結(jié)果如下: