Можем ли мы передать условные параметры функциям фикстуры в 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 =====