全局夹具,从当前模块注入值

时间:2014-09-12 19:32:04

标签: pytest

我有这种风格的测试模块:

#test_mammals.py:

PETS = ['cats', 'dogs']

def test_mammals_1(pet):
    assert 0, pet

def test_mammals_2(pet):
    assert 0, pet

还有一个:

#test_birds.py:

PETS = ['budgie', 'parrot']

def test_birds_1(pet):
    assert 0, pet

def test_birds_2(pet):
    assert 0, pet

我想只定义夹具“宠物”一次:

#conftest.py:

import pytest

@pytest.fixture(scope='module', autouse=True)
def getpets(request):
    return getattr(request.module, 'PETS', [])

@pytest.fixture(scope='module', params=getpets, autouse=True)
def pet(request):
    return request.param

不幸的是,这不起作用,因为“宠物”需要一个“params”列表。但是,如果我将“getpets”放入列表中,则ficture将返回指向“getpets”的指针,但不返回来自相应模块的“PETS”的值。

1 个答案:

答案 0 :(得分:0)

这有点难以回答,因为您的代码并不是很有意义 - 如果您的“PETS'实际上只是一个字符串列表,你应该只使用pytest.mark.parametrize,而你实际上并不需要任何特殊的测试或任何装置。

然而,如果你有更复杂的事情发生,最简单的事情可能是在conftest中有一个通用的夹具,并且在每个测试模块中,定义一个轻量级的夹具,它具有你的模块的特定数据,利用你的通用pet夹具以任何方式需要。