我想为每次运行运行具有不同装置的一组测试函数。通常,Stack Overflow、文档和博客文章中建议的解决方案分为两类。一种是通过参数化夹具:
@pytest.fixture(params=list_of_cases)
def some_case(request):
return request.param
Run Code Online (Sandbox Code Playgroud)
另一种是通过调用 metafunc.parametrize 来生成多个测试:
def pytest_generate_tests(metafunc):
metafunc.parametrize('some_case', list_of_cases)
Run Code Online (Sandbox Code Playgroud)
这两种方法的问题在于案例运行的顺序。基本上它使用每个参数运行每个测试函数,而不是遍历给定参数的所有测试函数,然后继续下一个参数。当我的一些装置是相对昂贵的数据库调用时,这是一个问题。
为了说明这一点,假设 dataframe_x 是另一个属于 case_x 的夹具。Pytest 这样做
test_01(dataframe_1)
test_01(dataframe_2)
...
test_50(dataframe_1)
test_50(dataframe_2)
Run Code Online (Sandbox Code Playgroud)
代替
test_01(dataframe_1)
...
test_50(dataframe_1)
test_01(dataframe_2)
...
test_50(dataframe_2)
Run Code Online (Sandbox Code Playgroud)
结果是我将从 DB 中获取每个数据集 50 次而不是一次。由于我只能将夹具范围定义为“会话”、“模块”或“函数”,因此我无法弄清楚如何将我的测试分组为它们一起运行。
有没有办法构建我的测试,以便我可以为每个数据集按顺序运行所有测试函数?
如果您只想加载数据帧,则可以将范围参数与“模块”或“会话”一起使用。
@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
Run Code Online (Sandbox Code Playgroud)
测试仍将交替运行,但数据帧只会在每个模块或会话中加载一次。
| 归档时间: |
|
| 查看次数: |
4250 次 |
| 最近记录: |