Можем ли мы передать условные параметры функциям фикстуры в pytest?

Я хочу передать список в качестве параметра для прибора на основе условия if. Есть ли способ сделать это?

Например, см. Следующий код.

Чего я хочу добиться, так это того, что если я передаю нечетное значение в качестве аргумента num в аргументе командной строки в pytest, список, передаваемый в качестве параметра для прибора, должен быть нечетным числом и четным числом для четного аргумента.

PS Я использую pytest-xdist для запуска этого теста несколько раз, поэтому я использую sys.stderr для вывода на печать.

имя файла: conftest.py

def pytest_addoption(parser):
    parser.addoption('--type', action='store', help='Number of times to repeat each test')  

имя файла: test_file.py

import pytest, sys

lis = []

@pytest.fixture()
def nested_fixture(pytestconfig):
    global lis
    numtype = str(pytestconfig.getoption("type"))

    if numtype == "odd":
        lis.append(1)
        lis.append(3)

    if numtype == "even":
        lis.append(2)
        lis.append(4)

    return lis

@pytest.fixture(params = nested_fixture)
def fixture_function(request):
    return request.param


def test_function(fixture_function):
    print >> sys.stderr , fixture_function

Я выполняю это, используя следующую команду в терминале

pytest -sv -n 2 --type odd

1 ответ

Этот ответ основан на моем предыдущем ответе на вопрос Фильтрация приспособлений pytest.

Если вам требуется определенная логика, чтобы определить, какие параметры применять к каждому тесту, вы можете рассмотреть возможность использования ловушки.

Функция ловушки вызывается для каждого собранного теста. В metafuncАргумент позволяет динамически параметризовать каждый отдельный тестовый пример. Перезапись test_file.py использовать pytest_generate_tests может выглядеть так:

      import sys

def pytest_generate_tests(metafunc):
    if "fixture_function" in metafunc.fixturenames:
        parameters = []
        if metafunc.config.getoption("type") == "odd":
            parameters += [1, 3]
        elif metafunc.config.getoption("type") == "even":
            parameters += [2, 4]
        metafunc.parametrize("fixture_function", parameters)

def test_function(fixture_function):
    print(fixture_function, file=sys.stderr)

В сочетании с вашими существующими conftest.pyкода, даже добавить нечетные параметры теста можно контролировать с помощью --type параметр командной строки:

      $ pytest -v test_file.py --type odd
===== test session starts =====
…
collected 2 items                                                                                                                                                                                                                      

test_file.py::test_function[1] PASSED                                                                                                                                                                                        [ 50%]
test_file.py::test_function[3] PASSED                                                                                                                                                                                        [100%]

===== 2 passed in 0.02s =====


$ pytest -v test_file.py --type even
===== test session starts =====
…
collected 2 items                                                                                                                                                                                                                      

test_file.py::test_function[2] PASSED                                                                                                                                                                                        [ 50%]
test_file.py::test_function[4] PASSED                                                                                                                                                                                        [100%]

===== 2 passed in 0.01s =====
Другие вопросы по тегам