1. 程式人生 > 其它 >@pytest.mark.parametrize 引數化總結

@pytest.mark.parametrize 引數化總結

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自動化中的開發場景,比如是一個登入框
  1. 你肯定需要測試賬號空、密碼空、賬號密碼都為空、賬號不存在、密碼錯誤、賬號密碼正確等情況
  2. 這些用例的區別就在於輸入的測試資料和對應的互動結果
  3. 所以我們可以只寫一條登入測試用例,然後把多組測試資料和期望結果引數化,節省很多程式碼量

重點

當裝飾器 @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