10

我有两个简单的测试设置,我试图将它们组合在一个夹具中,并希望测试功能将“参数”传递给夹具。

这是一个人为的例子,来解释我的问题。假设我有以下 pytest 夹具:

@pytest.fixture(scope="module", params=['param1','param2'])
def myFixture(request):
    if request.param == 'param1':
        p = 5
    elif request.param == 'param2':
        p = 10
    return p

# would like to set request.param = ['param1'] for myFixture
def test_madeup(myFixture):
    assert myFixture == 5

# would like to set request.param = ['param2'] for myFixture
def test_madeup2(myFixture):
    assert myFixture == 10

我可以让上面的参数作为test_madeup函数的输入传递吗?因此,类似于以下内容:

@pytest.fixture(scope="module", params=fixtureParams)
def myFixture(request):
    if request.param == 'param1':
        return 5
    elif request.param == 'param2':
        return 10


def test_madeup(myFixture, ['param1']):
    assert myFixture == 5

当然,上述方法是行不通的。实际情况要复杂一些,但我只想知道是否可以将函数传递params=['param1','param2'] 给夹具test_madeup

4

2 回答 2

15

如果我正确理解您的问题,您基本上想通过提供一些测试信息来选择参数化夹具的一个实例来执行测试。这是不可能的,尽管我们可能会考虑一种机制。我不确定以下解决方案是否能解决您的整个问题,但这是解决上述具体案例的一种方法:

import pytest

@pytest.fixture(scope="module")
def myFixture1():
    return 5

@pytest.fixture(scope="module")
def myFixture2():
    return 2

@pytest.fixture(scope="module", params=["param1", "param2"])
def myFixture(request):
    if request.param == 'param1':
        return request.getfuncargvalue("myFixture1")
    elif request.param == 'param2':
        return request.getfuncargvalue("myFixture2")

def test_1(myFixture1):
    assert myFixture1 == 5

def test_2(myFixture2):
    assert myFixture2 == 2

def test_all(myFixture):
    assert myFixture in (2,5)

这运行了四个测试,因为test_all两个夹具都执行了两次。

如果您的灯具设置不是很重,您可能还有一个灯具可以生成一个列表和一个“迭代”参数化的灯具。然后测试可以抓取整个列表并将其索引到其中。

于 2012-12-18T14:13:53.227 回答
4

不确定这是否是您想要的,但示例案例可以像这样实现:

@pytest.mark.parametrize(('param', 'expected'), [('param1', 5), ('param2', 10)])
def test_madeup(param, expected):
    assert param == expected
于 2012-12-18T12:39:04.650 回答