根据特定参数的失败跳过特定的参数化 pytest
Skipping specific parametrized pytests based on failure for specific parameters
我有一些参数化测试
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中获取吗?
如果您为每个参数添加单独的依赖项,这是可能的。在您的示例中,您可以这样做:
@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
我有一些参数化测试
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中获取吗?
如果您为每个参数添加单独的依赖项,这是可能的。在您的示例中,您可以这样做:
@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