我们可以有条件地调用 pytest fixture 吗?

Can we call a pytest fixture conditionally?

我的用例是仅在满足特定条件时才调用 fixture。但是由于我们需要调用 pytest fixture 作为测试函数的参数,所以每次我 运行 测试时都会调用它。

我想做这样的事情:

@pytest.parameterize("a", [1, 2, 3])
def test_method(a):
    if a == 2:
       method_fixture

是的,您可以使用 indirect=True 参数来使参数引用灯具。

import pytest


@pytest.fixture
def thing(request):
    if request.param == 2:
        return func()
    return None


@pytest.mark.parametrize("thing", [1, 2, 3], indirect=True)
def test_indirect(thing):
    pass  # thing will either be the retval of `func()` or NOne

有相关的“夹具”

如编辑中所问,如果您的固定装置相互依赖,您可能需要改用 pytest_generate_tests 挂钩。

例如这将使用不相等的值对测试进行参数化。

import itertools


def pytest_generate_tests(metafunc):
    if metafunc.function.__name__ == "test_combo":
        a_values = [1, 2, 3, 4]
        b_values = [2, 3, 4, 5]
        all_combos = itertools.product(a_values, b_values)
        combos = [
            pair
            for pair in all_combos
            if pair[0] != pair[1]
        ]
        metafunc.parametrize(["a", "b"], combos)


def test_combo(a, b):
    assert a != b