pytest.mark.parametrize 參數化
pytest允許在多個級別啟用測試參數化:
- pytest.fixture() 允許fixture有參數化功能(后面講解)
- @pytest.mark.parametrize 允許在測試函數或類中定義多組參數和fixtures
- pytest_generate_tests 允許定義自定義參數化方案或擴展(拓展)
知識儲備尚淺,目前知道的不多
參數化場景
只有測試數據和期望數據不一致,但是操作步驟是一樣的測試用例可以用參數化
上代碼實戰:
import pytest
# def test_case01():
# assert 1+1 == 2
#
# def test_case02():
# assert 2+3 == 6
#
# def test_case03():
# assert 8+7 == 20
@pytest.mark.parametrize('inbody,expdata',[('1+1',2),('2+3',6),('8+7',20)])
def test_case04(inbody,expdata):
assert eval(inbody) == expdata
可以看到注釋的代碼 寫的太冗余 雞肋 ,而參數化
(煎蛋) ,節省時間代碼
參數化的格式:
必須是系列表:
只有一個參數時: @pytest.mark.parametrize("inbody", ["xx", "xx1", "xx2"])
多個參數時:@pytest.mark.parametrize("inbody,inbody1", [("xx", "123"), ("xx1", "123"), ("xx2", "123")])
備注:雖然源碼說需要list包含tuple,但我試了下,tuple包含list,list包含list也是可以的........
https://www.cnblogs.com/blog-123/p/14590493.html 數據驅動可以這里了解
實際Web UI和 Api自動化中的開發場景,比如是一個登錄框
- 你肯定需要測試賬號空、密碼空、賬號密碼都為空、賬號不存在、密碼錯誤、賬號密碼正確等情況
- 這些用例的區別就在於輸入的測試數據和對應的交互結果
- 所以我們可以只寫一條登錄測試用例,然后把多組測試數據和期望結果參數化,節省很多代碼量
重點
當裝飾器 @pytest.mark.parametrize 裝飾測試類時,會將數據集合傳遞給類的所有測試用例方法
# 笛卡爾積,組合數據
data_1 = [1, 2, 3]
data_2 = ['a', 'b']
@pytest.mark.parametrize('a', data_1)
@pytest.mark.parametrize('b', data_2)
def test_parametrize_1(a, b):
print(f'笛卡爾積 測試數據為 : {a},{b}')
參數化,標記數據
# 標記參數化
@pytest.mark.parametrize('inbody,expdata',[('1+1',2),('3+4',8),('6+6',13),
pytest.param('4+4',9,marks=pytest.mark.xfail),
pytest.param('6*6',67,marks=pytest.mark.xfail)])
def test_mark(inbody,expdata):
assert eval(inbody) == expdata