python - 在参数化中传递 pytest 夹具
问题描述
通过在@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)
如果我将 alist 作为夹具传递给测试,例如:
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
测试函数中参数的存在来完成的。要使参数化起作用,需要此参数(否则您会因为缺少参数而出错)。
推荐阅读
- python - 使用 MultiIndex 在 pandas DataFrame 中条件选择行
- sccm - 仅当由 SCCM 部署时,Calibre 静默安装才会失败
- sql-server - 等待快照代理状态完成的 T-SQL 脚本
- html - 为什么绝对定位元素的子元素不会在溢出-y 上扩展其父宽度?
- javascript - 使用 Javascript + jQuery 进行 API 调用的最简单方法
- sql - 根据条件重置的 7 天累积总和
- .net - 无法解析符号“ToTable”EF Core 2.2.0
- javascript - 嵌套过滤器数组方法
- postman - 纽曼:ReferenceError:未定义 pm
- ios - Apple 应用内恢复购买:在我允许“恢复购买”请求通过之前,我是否负责验证购买?