Переопределение параметров теста Pytest - PullRequest
1 голос
/ 30 апреля 2019

В настоящее время я параметризирую все свои тестовые случаи, используя pytest_generate_tests, и это работает хорошо.

То, что я хотел бы сделать сейчас, это переопределить это поведение для конкретного теста.Если я попытаюсь использовать декоратор pytest.mark.parametrize в самом тесте, я получу ошибку ValueError: duplicate, которая понятна, поскольку я сейчас пытаюсь параметризовать тест в двух местах.

Есть ли способ переопределить параметризацию "по умолчанию" для этого одного теста?

Я могу добиться этого, выполнив что-то подобное ниже, но это очень хакерский способ сделать это:

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)

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 30 апреля 2019

Вы можете проверить, определяет ли тест собственный маркер параметризации для 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)

Теперь явная параметризация переопределит стандартную:

def test_spam(fixture_mode):
    ...

@pytest.mark.parametrize('fixture_mode', (1, 2, 3))
def test_eggs(fixture_mode):
    ...

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...