将参数或参数传递给fixture函数

时间:2014-05-02 23:44:49

标签: python pytest

我正在探索py.test中的灯具,我对一年多前提出的问题提出了类似的问题:Can params passed to pytest fixture be passed in as a variable? 我想知道现在是否可以在较新版本的py.test中以某种方式选择一个params的子集来要求一个夹具功能。

假设我有一个简单的功能和测试:

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

现在我想为param =(7,11)添加第二个测试:

def test_2(fix_func):
    assert fix_func > 0 

如果仍然无法选择params的子集,另一种解决此问题的方法可能是将params从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 

但这个例子也不起作用。 如果有任何其他短/&#34;优雅&#34;如何为不同的测试使用不同的灯具组(只写一个灯具功能)?

1 个答案:

答案 0 :(得分:1)

您无法在定义的参数内嵌套函数调用以获取另一个函数的签名。你需要将内部函数移动到外部函数并在那里调用它:

@pytest.mark.parametrize("arg", [(7,11), (7,0), (3,0)])
def test_1(arg):
    assert fix_func(arg) <= 500