【问题标题】:Passing arguments or param to fixture function将参数或参数传递给夹具函数
【发布时间】:2014-05-02 23:44:48
【问题描述】:

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

假设我有一个简单的函数和一个测试:

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 

如果仍然无法选择参数子集,解决此问题的另一种方法可能是将参数从夹具移动到测试,类似这样:

@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 

但是这个例子也行不通。 如果有任何其他简短/“优雅”的方式来为不同的测试使用不同的夹具集(只编写一个夹具函数)?

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    您不能将函数调用嵌套在另一个函数签名的已定义参数中。您需要将内部函数移动到外部函数中并在那里调用它:

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

    【讨论】:

    • 恐怕这个版本也不适用于灯具。仅当 fix_func 是正常功能时才有效。我猜在这种情况下可能无法使用fixture函数......
    • 这个建议是正确的恕我直言,你真的应该在测试函数而不是在夹具中调用被测函数。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2013-01-27
    • 2021-04-13
    • 2019-12-19
    • 2020-12-05
    • 2021-04-18
    相关资源
    最近更新 更多