pytest fixture中传递的参数能否作为变量传递?

10

我有两个简单的测试设置,并且我正在尝试将它们分组在一个夹具中,并希望测试函数将“params”传递给夹具。

以下是一个假想的示例,用于解释我的问题。假设我有以下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

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

2个回答

15

如果我正确理解您的问题,您基本上希望通过提供一些测试信息,选择一个参数化fixture的实例来运行测试。虽然这不可能,但我们可能可以考虑一种机制。我不确定以下解决方法是否适用于您的整个问题,但这是解决上述具体情况的一种方法:

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被执行两次,每次都使用不同的装置。

如果您的装置设置不是很复杂,您也可以有一个装置生产一个列表和一个“迭代”参数化的装置。然后一个测试可以获取整个列表并对其进行索引。


4

不确定这是否符合您的要求,但示例用例可以像这样实现:

@pytest.mark.parametrize(('param', 'expected'), [('param1', 5), ('param2', 10)])
def test_madeup(param, expected):
    assert param == expected

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接