自定义pytest用例执行顺序

2019-05-10  本文已影响0人  虚白无类

默认情况下,pytest测试用例的执行是顺序是和collect的顺序一致的。而collect是按测试目录中test开头的文件名称顺序来的。

目录结构.png
如上目录结构,不同测试文件的执行顺序是这样的。
执行顺序.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

上一篇下一篇

猜你喜欢

热点阅读