2017-01-24 62 views
2

我想运行一组测试函数,每次运行使用不同的灯具。通常,堆栈溢出,文档和博客文章中提出的解决方案分为两类。其一是通过参数化夹具:由以产生多个测试呼叫metafunc.parametrizePytest:使用不同的输入数据多次运行测试

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

另一种是:

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

用这两种方法的问题是在这情况下的运行顺序。基本上它使用每个参数运行每个测试函数,而不是通过给定参数的所有测试函数,然后继续下一个参数。这是一个问题,当我的一些设备是比较昂贵的数据库调用。

为了说明这一点,假定dataframe_x是属于case_x的另一个灯具。 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倍,而不是只取一次,每个数据集。由于我只能将灯具范围定义为'会话','模块'或'功能',所以我无法弄清楚如何将我的测试分组到一起,以块为单位。

有没有一种方法来组织我的测试,以便我可以顺序运行每个数据集的所有测试函数?

+0

为什么你想让你的测试在块中执行?您的测试是否需要按顺序运行?如果是这样,我认为这并不理想,因为每个测试应该能够独立运行。 – Cedric

+0

它们是独立的,但想象每个数据帧都非常大:我想加载一个,执行所有测试,将它扔掉,加载下一个,等等。这对我来说更直观,而不是加载它几次或者在整个测试过程中将所有数据保存在内存中。 – instant

回答

1

如果您只希望加载数据帧,只要将范围参数与'module'或'session'一起使用即可。

@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 

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

相关问题