我有一些引數化測驗
def test1():
#do test1
def test2():
#do test2
def test3():
#do test3
每個測驗引數化為
@pytest.mark.parametrize(x)
我想針對這些測驗運行
test_data=[1,2,3,4]
我試過使用pytest-depends
@pytest.mark.depends(on=['test1'])
@pytest.mark.parametrize(x)
但是,我知道如果任何 test_1 失敗,所有 test_2 都會被跳過。相反,我希望僅當 test_1 對特定引數化失敗時才跳過特定引數化的 test_2。
這可以在pytest中獲得嗎?
uj5u.com熱心網友回復:
如果為每個引數添加單獨的依賴項,這是可能的。在您的示例中,您可以執行以下操作:
@pytest.mark.parametrize("x", [1, 2, 3 ,4])
def test1(x):
assert x != 2
@pytest.mark.parametrize("x", [
pytest.param(1, marks=pytest.mark.depends(on='test1[1]')),
pytest.param(2, marks=pytest.mark.depends(on='test1[2]')),
pytest.param(3, marks=pytest.mark.depends(on='test1[3]')),
pytest.param(4, marks=pytest.mark.depends(on='test1[4]')),
])
def test2(x):
pass
在這種情況下,test2[2]將被跳過,因為test1[2]失敗。
如果您想從變數或函式中獲取測驗資料,或者您不希望parametrize裝飾器中出現太多混亂,您也可以以更通用的方式執行此操作:
test_data = [1, 2, 3, 4]
def data_dependent_on(name):
return [
pytest.param(d, marks=pytest.mark.depends(on=f"{name}[" f"{d}]"))
for d in test_data
]
@pytest.mark.parametrize("x", test_data)
def test1(x):
assert x != 2
@pytest.mark.parametrize("x", data_dependent_on("test2"))
def test2(x):
assert x != 3
@pytest.mark.parametrize("x", data_dependent_on("test3"))
def test3(x):
pass
在這種情況下,test2[2]將像以前一樣因為test1[2]失敗test3[2]而被跳過,因為test2[2]失敗而test3[3]被跳過,并且因為失敗而被跳過test2[3]。
這當然只適用于一個論點。如果您有多個引數,如評論中所述,您必須相應地調整代碼:
@pytest.mark.parametrize("x, y", [(1, 2), (3, 4)])
def test1(x, y):
assert x != 1
@pytest.mark.parametrize("x, y", [
pytest.param(1, 2, marks=pytest.mark.depends(on='test1[1-2]')),
pytest.param(3, 4, marks=pytest.mark.depends(on='test1[3-4]')),
])
def test2(x, y):
pass
或更通用的版本:
test_data = [(1, 2), (3, 4)]
def data_dependent_on(name):
return [
pytest.param(d1, d2, marks=pytest.mark.depends(on=f"{name}[" f"{d1}-{d2}]"))
for (d1, d2) in test_data
]
@pytest.mark.parametrize("x, y", test_data)
def test1(x, y):
assert x != 1
@pytest.mark.parametrize("x, y", data_dependent_on("test1"))
def test2(x, y):
pass
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441634.html
下一篇:在夾具中創建測驗資料
