繁体   English   中英

如何在 pytest 中添加夹具作为 mark.parametrize 的一部分?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM