向fixture函数传递参数或参数

1 投票
1 回答
1345 浏览
提问于 2025-04-18 05:11

我正在研究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

撰写回答