Pytest:使用不同的输入数据多次运行测试

时间:2017-01-24 14:14:34

标签: python pytest

我想为每次运行运行一系列具有不同灯具的测试功能。通常,Stack Overflow,文档和博客文章中建议的解决方案分为两类。一种是通过参数化固定装置:

@pytest.fixture(params=list_of_cases)
def some_case(request):
    return request.param

另一种方法是调用metafunc.parametrize以生成多个测试:

def pytest_generate_tests(metafunc):
    metafunc.parametrize('some_case', list_of_cases)

两种方法的问题在于案例的运行顺序。基本上它使用每个参数运行每个测试函数,而不是遍历给定参数的所有测试函数,然后继续下一个参数。当我的一些灯具是比较昂贵的数据库电话时,这是一个问题。

为了说明这一点,假设dataframe_x是另一个属于case_x的fixture。 Pytest做到了这个

test_01(dataframe_1)
test_01(dataframe_2)
...
test_50(dataframe_1)
test_50(dataframe_2)

而不是

test_01(dataframe_1)
...
test_50(dataframe_1)

test_01(dataframe_2)
...
test_50(dataframe_2)

结果是我将从DB中取出每个数据集50次而不是一次。由于我只能将夹具范围定义为“会话”,“模块”或“功能”,我无法弄清楚如何将我的测试分组为它们以块的形式一起运行。

有没有办法构建我的测试,以便我可以按顺序遍历每个数据集的所有测试函数?

1 个答案:

答案 0 :(得分:2)

如果您只想在使用带有'module'或'session'的scope参数时加载数据帧。

@pytest.fixture(scope="module", params=[1, 2])
def dataframe(request):
    if request.param == 1:
        return #load datagrame_1
    if request.param == 2:
        return #load datagrame_2

测试仍将交替运行,但每个模块或会话只会加载一次数据帧。