使用pytest.lazy_fixture列表值作为另一个夹具中的参数

问题描述 投票:2回答:1

我正在尝试使用一个灯具值列表作为另一个灯具值的参数。这是我的设置:

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

所以,我的问题是可以从列表中一张一张地获取数据,然后在测试中使用它吗?我尝试过“ unparse”列表:

@pytest.fixture(params=[i for i in i pytest.lazy_fixture('foo')])
def bar(request):
    return request.param

但是在这种情况下,我得到了TypeError: 'LazyFixture' object is not iterable

python automated-tests pytest fixtures
1个回答
0
投票

参见this answer to a very similar question:根据设计,夹具值不能用作参数测试的参数列表。实际上,参数是在pytest收集阶段解析的,而fixture则是在pytest节点执行期间解析的。]

lazy_fixturepytest_cases.fixture_ref最好的用途是使用single

灯具值作为参数。使用lazy_fixture会有局限性(如果我没记错的话,无法对夹具进行参数化),而使用pytest_cases则可以做很多事情(在参数元组中使用pytest_cases,使用多个fixture_ref分别具有不同的参数化等)。我是fixture_ref的作者;)

另请参见pytest_cases

© www.soinside.com 2019 - 2024. All rights reserved.