Pytest参数化依赖

时间:2018-06-13 12:40:38

标签: python pytest

我有一个功能和一个测试

def foo(a):
    return bar(a)

@pytest.mark.parametrize(
  'number',
    [1,2,3]
)
@pytest.mark.dependency
def test_foo(number):
    assert foo(number) > SOME_CONST # Simplistic example, real case is more nuanced

我正在使用pytest和pytest_dependency模块。 foo是许多其他测试中使用的函数。我有一个函数,我想依赖test_foo,下面的代码不起作用:

@pytest.mark.dependency(depends=['test_foo'])
@pytest.mark.parametrize(
    'param',
    itertools.permutations(['a','b','c','d','e'],2),
    ids=repr,
)

def test_bar(param):
    ...
    important_result = foo(param)
    ...

理论是,如果test_foo失败,则会跳过test_bar。但是,当我参数化test_bar时,无论test_bar的结果如何,都会跳过test_foo的每个实例化。

为了澄清,此代码按预期工作(不跳过test_bar):

@pytest.mark.dependency(depends=['test_foo'])
def test_bar():
    param = some_fnc(['a', 'b'])
    ...
    important_result = foo(param)
    ...

1 个答案:

答案 0 :(得分:2)

您的问题与 pytest 分配给每个测试的node_id有关(请参见pytest-dependency#names)。

根据您的问题,我了解您希望test_bar依赖于test_foo的所有参数,因此在这种情况下,您需要执行以下操作:

@pytest.mark.dependency(depends=['foo[1]', 'foo[2]', 'foo[3]'])
@pytest.mark.parametrize(
    'param',
    itertools.permutations(['a', 'b', 'c', 'd', 'e'], 2),
    ids=repr,
)
def test_bar(param):
    ...

但是由于参数化可能不只是数字复杂,因此建议采用以下方法:

@pytest.mark.parametrize(
    'number',
    [
        pytest.param(1, marks=pytest.mark.dependency(name='foo1')),
        pytest.param(2, marks=pytest.mark.dependency(name='foo2')),
        pytest.param(3, marks=pytest.mark.dependency(name='foo3'))
    ]
)
def test_foo(number):
    ...


@pytest.mark.dependency(depends=['foo1', 'foo2', 'foo3'])
@pytest.mark.parametrize(
    'param',
    itertools.permutations(['a', 'b', 'c', 'd', 'e'], 2),
    ids=repr,
)
def test_bar(param):
    ...

如果您希望每个参数化都具有依赖性,则必须将param中每个test_bar值的依赖性显式设置为其对应的foo?测试。