向fixture函数传递参数或参数
我正在研究py.test中的fixture(测试夹具),我有一个和一年前类似的问题:能否将传递给pytest fixture的参数作为变量传入?我想知道在新版本的py.test中,是否可以以某种方式选择一部分参数来请求一个fixture函数。
假设我有一个简单的函数和一个测试:
def func(a, b):
return (a - b)**3 + 10
@pytest.fixture(scope="module", params=[(7,11), (7,0), (3,0)])
def fix_func(request):
output = func(*request.param)
return output
def test_1(fix_func):
assert fix_func <= 500
现在我想为参数=(7,11)添加第二个测试:
def test_2(fix_func):
assert fix_func > 0
如果选择参数的子集仍然不可能,解决这个问题的另一种方法可能是将参数从fixture移动到测试中,像这样:
@pytest.fixture(scope="module")
def fix_func(request, param):
output = func(*param)
return output
@pytest.mark.parametrize("arg", [(7,11), (7,0), (3,0)])
def test_1(fix_func(arg)):
assert fix_func <= 500
@pytest.mark.parametrize("arg", [(7,11)])
def test_2(fix_func(arg)):
assert fix_func > 0
但这个例子也不行。如果还有其他简单或“优雅”的方法,可以为不同的测试使用不同的fixture集合(只写一个fixture函数)吗?
1 个回答
1
你不能在一个函数的参数里直接调用另一个函数。你需要把里面的那个函数放到外面的函数里,然后在外面的函数里去调用它:
@pytest.mark.parametrize("arg", [(7,11), (7,0), (3,0)])
def test_1(arg):
assert fix_func(arg) <= 500