在参数化中传递 pytest fixture
Passing pytest fixture in parametrize
我在@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
如评论中所述,您不能直接将固定装置传递给 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.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
如评论中所述,您不能直接将固定装置传递给 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
参数的存在完成的。为了参数化工作,需要这个参数(否则你会因为缺少参数而出错)。