默认情况下,pytest测试用例的执行是顺序是和collect的顺序一致的。而collect是按测试目录中test开头的文件名称顺序来的。
如上目录结构,不同测试文件的执行顺序是这样的。
执行顺序.png
在一个文件中,用例的执行顺序是从上到下的。这样,除了修改文件名称,想要调整不同测试文件的测试函数的执行顺序似乎无从下手。好在,pytest中有个hook函数pytest_collection_modifyitems就是派这个用处的。
不过已经有人通过插件pytest-ordering实现了这个功能,详细用法可以见链接中的文档。这个插件代码量不大,适合直接看源码或者作为自己开始实现插件的参考。
在这个基础上可以再自定义一些,比如根据不同场景更改用例执行顺序。
# conftest.py
import pytest
def pytest_collection_modifyitems(config, items):
""" 根据指定的mark参数场景,动态选择case的执行顺序"""
for item in items:
scenarios = [
marker for marker in item.own_markers
if marker.name.startswith('scenarios')
and marker.name in config.option.markexpr
]
if len(scenarios) == 1 and not item.get_closest_marker('run'):
item.add_marker(pytest.mark.run(order=scenarios[0].args[0]))
# test_foo.py
import pytest
def test_1():
print(1)
@pytest.mark.scenarios_1(1)
def test_2():
print(2)
@pytest.mark.scenarios_2(3)
def test_3():
print(3)
@pytest.mark.scenarios_1(2)
@pytest.mark.scenarios_2(1)
def test_4():
print(4)
# test_bar.py
import pytest
@pytest.mark.scenarios_2(2)
def test_a():
print('a')
@pytest.mark.scenarios_1(3)
def test_b():
print('b')
def test_c():
print('c')
下面可以尝试一下,使用不同的scenario,用例执行顺序也会改变。
>> pytest -m scenarios_1 -s
网友评论