我们可以有条件地调用 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
我的用例是仅在满足特定条件时才调用 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