【发布时间】:2018-05-08 10:39:50
【问题描述】:
我有一个在测试期间创建项目列表的夹具。我想要另一个用第一个生成的值参数化的夹具。
示例代码
import random
import pytest
@pytest.fixture
def values():
return [random.randint(0, 100) for _ in range(10)]
@pytest.fixture
def value(request):
return request.param
@pytest.mark.parametrize("value", params=values):
def test_function(value):
assert value > 0
上面代码的问题是values 是一个函数而不是一个列表。我做了很多挖掘工作,但没有找到任何方法来解压夹具以使用它来参数化另一个夹具。
我知道我可以通过 values 夹具并在测试中对其进行迭代,但这不是一个好的解决方案,因为我想查看哪些值导致测试失败。
我也对替代解决方案持开放态度,例如是否可以从已启动的测试中运行子测试。
【问题讨论】:
-
不幸的是,不能使用夹具作为参数化源,请参阅this issue。有一个实现此功能的插件:
pytest-lazy-fixture,如果您愿意,可以尝试一下。但是,在您的特定示例中,values夹具没有参数,可以轻松用作普通函数,因此您只需使用@pytest.mark.parametrize('value', values())标记测试。 -
您能将
values定义为模块级变量吗?它真的需要固定吗? -
感谢您的建议。不幸的是,我把例子过于简单化了。在我的情况下,
values夹具使用了上面定义的一些其他夹具。为了使其成为模块级变量,我必须将它所依赖的所有固定装置也制作成变量。至于pytest-lazy-fixture,它允许使用固定装置作为参数,但不能作为参数的来源——你不能这样做parametrize("x", params=lazy_fixture(values))