Я получаю следующую ошибку, передавая мое приспособление, определенное в conftest.py, в @pytest.mark.parametrize:
pytest --alist = "0220,0221" test_1.py -v -s
NameError: name 'alist' is not defined
conftest.py:
def pytest_addoption(parser):
parser.addoption("--alist", action = "store")
@pytest.fixture
def alist(request):
return request.config.getoption("--alist").split(",")
test_1.py:
@pytest.mark.parametrize("channel", alist, scope = "class")
class TestRaIntegrationReplay:
def test_ra_start_time(self, channel):
print(channel)
Если я передаю alist в тест как приспособление, например:
def test_ra_start_time(self, alist):
for channel in alist:
print(channel)
Он работает хорошо, но не работает с переходом на @pytest.mark.parametrize
@MrBeanBremen спасибо, мне удалось применить ваше первое решение с изменением хука «pytest_generate_tests» в conftest.py, и это сработало, но теперь у меня есть другой вопрос: есть ли способ применить фикстуру alist ко всем тестам в классе, чтобы избежать прохождения « alist" приспособление к каждому тесту? Или есть способ изменить pytest_generate_tests, чтобы применить хук в случае, если к классу применяется список приспособлений?
Я не уверен, что понял: вы не хотите использовать прибор вообще, или вы просто хотите использовать его там, где это необходимо? Второй случай уже покрывается частью if "alist" in metafunc.fixturenames
.
Я добавлю это в ответ, чтобы уточнить риск создания дубликата ... Это облегчит обсуждение.
Как упоминалось в комментарии, вы не можете напрямую передать фикстуру декоратору mark.parametrize
, потому что декоратор оценивается во время загрузки.
Вместо этого вы можете выполнить параметризацию во время выполнения, реализовав pytest_generate_tests
:
import pytest
@pytest.hookimpl
def pytest_generate_tests(metafunc):
if "alist" in metafunc.fixturenames:
values = metafunc.config.option.alist
if value is not None:
metafunc.parametrize("alist", value.split(","))
def test_ra_start_time(alist):
for channel in alist:
print(channel)
def test_something_else():
# will not be parametrized
pass
Параметризация выполняется на основе наличия параметра alist
в тестовой функции. Для работы параметризации этот параметр необходим (иначе вы получите ошибку из-за отсутствия аргумента).
Некоторое время назад я ответил на аналогичный вопрос , он должен работать и в вашем случае, например. выполните параметризацию в
pytest_generate_tests
, так как вы не можете напрямую передать прибор вmark.parametrize
.