我试图将一个灯具值的列表用作另一个灯具的参数。这是我的设置:
import pytest
d = {
"first": [1, 2, 3],
"second": [4, 5, 6]
}
@pytest.fixture(params=['first', 'second'])
def foo(request):
return d.get(request.param)
@pytest.fixture(params=[pytest.lazy_fixture('foo')])
def bar(request):
return request.param
def test_1(bar):
pass
问题是bar()
总是得到完整列表request.param
([1,2,3]不是列表的值。如果在params
bar()
夹具中发送数据直接,例如:
@pytest.fixture(params=[1, 2, 3])
def bar(request):
return request.param
def test_1(bar):
pass
然后参数请求将正常工作(测试开始三次)。同样的情况,如果我不直接向params
传递参数,而是从没有夹具装饰器的任何方法传递参数,即:
def some():
return [1, 2, 3]
@pytest.fixture(params=some())
def more(request):
return request.param
def test_2(more):
logging.error(more)
pass
所以,我的问题是可以逐个从列表中获取数据,然后在我的测试中使用它吗?我试着'解读'列表:
@pytest.fixture(params=[i for i in i pytest.lazy_fixture('foo')])
def bar(request):
return request.param
但在这种情况下,我得到TypeError: 'LazyFixture' object is not iterable
答案 0 :(得分:0)
请参见this answer to a very similar question:根据设计,夹具值不能用作参数测试的参数列表。确实,参数是在pytest收集阶段解析的,而夹具则是在pytest节点执行期间解析的。
使用lazy_fixture
或pytest_cases.fixture_ref
最好的方法是使用单个灯具值作为参数。使用lazy_fixture
有局限性(如果我没记错的话,无法对夹具进行参数化),而使用pytest_cases
则可以做很多事情(在参数元组中使用fixture_ref
,使用多个{ {1}}个参数均不同,等等。我是fixture_ref
的作者;)
另请参阅this thread。