パラメータ化でpytestフィクスチャを渡す
Dec 14 2020
@ pytest.mark.parametrizeのconftest.pyで定義されたフィクスチャを渡すと、次のエラーが発生します。
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)
次のようなフィクスチャとしてリストをテストに合格する場合:
def test_ra_start_time(self, alist):
for channel in alist:
print(channel)
うまく機能しますが、@ pytest.mark.parametrizeに渡すと機能しません
回答
1 MrBeanBremen Dec 15 2020 at 00:01
コメントで述べたように、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
パラメータ化は、テスト関数内のパラメータの存在に基づいて行われます。パラメータ化が機能するには、このパラメータが必要です(そうしないと、引数がないためにエラーが発生します)。