pytest 测试参数化覆盖

Gre*_*uhn 3 python testing pytest

我目前正在参数化我使用的所有测试用例pytest_generate_tests,这很有效。

我现在想做的是为特定测试覆盖此行为。如果我尝试pytest.mark.parametrize在测试本身上使用装饰器,我会收到一个ValueError: duplicate错误,这是可以理解的,因为我现在试图在两个地方对测试进行参数化。

有没有办法可以覆盖这个测试用例的“默认”参数化?

我可以通过执行以下操作来实现这一点,但这是一种非常hacky的方法:

def pytest_generate_tests(metafunc):
    fixture_modes = ['mode1', 'mode2']
    if 'fixture' in metafunc.fixturenames:
        fixture  = metafunc.config.getoption('fixture')
        if fixture:
            fixture_modes = [fixture]
        if metafunc.function.__name__ != 'func_to_skip':
            metafunc.parametrize('fixture_mode', fixture_modes, indirect=True)
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

hoe*_*ing 5

您可以检查测试是否定义了自己的参数多态标志物fixture_mode,例如

def pytest_generate_tests(metafunc):
    fixture_modes = ['spam', 'eggs']
    mark = metafunc.definition.get_closest_marker('parametrize')
    if not mark or 'fixture_mode' not in mark.args[0]:
        metafunc.parametrize('fixture_mode', fixture_modes, indirect=True)
Run Code Online (Sandbox Code Playgroud)

现在,显式参数化将覆盖默认参数化:

def test_spam(fixture_mode):
    ...

@pytest.mark.parametrize('fixture_mode', (1, 2, 3))
def test_eggs(fixture_mode):
    ...
Run Code Online (Sandbox Code Playgroud)

test_spam将获得默认参数化,test_eggs自定义参数化:

test_mod.py::test_spam[spam]
test_mod.py::test_spam[eggs]
test_mod.py::test_eggs[1]
test_mod.py::test_eggs[2]
test_mod.py::test_eggs[3]
Run Code Online (Sandbox Code Playgroud)