@pytest.mark.parametrize 引數化總結
阿新 • • 發佈:2021-06-18
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