[英]How to add a fixture as part of mark.parametrize in a pytest?
我希望能够在单元测试列表中参数化一个夹具列表和列表,就像下面的示例代码一样,问题是在“pytest.mark.parametrize”注释中无法识别夹具。 我应该怎么办?
@pytest.fixture(scope="session")
def simple_list() -> list[int]:
return [1, 2, 3]
@pytest.fixture(scope="session")
def list_within_a_list() -> list[list[int]]:
return [[1, 2, 3], [3, 4, 5], [5, 6, 7]]
@pytest.mark.parametrize(
"simple_list_element, list_within_a_list_first_element, list_within_a_list_second_element, list_within_a_list_third_element",
itertools.product(
simple_list,
*list_within_a_list,
),
)
def test_check_settings(
simple_list_element,
list_within_a_list_first_element,
list_within_a_list_second_element,
list_within_a_list_third_element,
):
...
我认为这应该做你想要的:
@pytest.fixture(scope="session")
def simple_list() -> list[int]:
return [1, 2, 3]
@pytest.fixture(scope="session")
def list_within_a_list() -> list[list[int]]:
return [[1, 2, 3], [3, 4, 5], [5, 6, 7]]
@pytest.fixture(scope="session")
def list_within_a_list_first(list_within_a_list) -> list[int]:
return list_within_a_list[0]
@pytest.fixture(scope="session")
def list_within_a_list_second(list_within_a_list) -> list[int]:
return list_within_a_list[1]
@pytest.fixture(scope="session")
def list_within_a_list_third(list_within_a_list) -> list[int]:
return list_within_a_list[2]
@pytest.mark.parametrize("simple_list_fixture", ["simple_list"])
@pytest.mark.parametrize("list_within_a_list_first_fixture", ["list_within_a_list_first"])
@pytest.mark.parametrize("list_within_a_list_second_fixture", ["list_within_a_list_second"])
@pytest.mark.parametrize("list_within_a_list_third_fixture", ["list_within_a_list_third"])
def test_check_settings(
simple_list_fixture,
list_within_a_list_first_fixture,
list_within_a_list_second_fixture,
list_within_a_list_third_fixture,
):
simple_list_element = request.getfixturevalue(simple_list_fixture)
list_within_a_list_first_element = request.getfixturevalue(list_within_a_list_first_fixture)
list_within_a_list_second_element = request.getfixturevalue(list_within_a_list_second_fixture)
list_within_a_list_third_element = request.getfixturevalue(list_within_a_list_third_fixture)
...
多次应用parametrize
装饰器可以得到参数的乘积。
如果list_within_a_list
返回可变数量的元素或大量元素,并且您无法从中手动派生每个元素的固定装置,那么我认为您需要通过pytest-subtests lib 研究使用子测试。
在那种情况下,我认为你可以这样做:
@pytest.fixture(scope="session")
def simple_list() -> list[int]:
return [1, 2, 3]
@pytest.fixture(scope="session")
def list_within_a_list() -> list[list[int]]:
return [[1, 2, 3], [3, 4, 5], [5, 6, 7]]
@pytest.mark.parametrize(
"simple_list_fixture, list_within_a_list_fixture",
["simple_list", "list_within_a_list"]
)
def test_check_settings(
subtests,
simple_list_fixture,
list_within_a_list_fixture,
):
simple_list_element = request.getfixturevalue(simple_list_fixture)
list_within_a_list_elements = request.getfixturevalue(list_within_a_list_fixture)
values_gen = itertools.product(simple_list_element, *list_within_a_list_elements)
for i, values in enumerate(values_gen):
with subtests.test(msg=f"case {i}", i=i, values=values):
simple_el, *list_els = values
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.