pytest文档34-Hooks函数改变用例执行顺序(pytest_collection_modifyitems)

Posted 上海-悠悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest文档34-Hooks函数改变用例执行顺序(pytest_collection_modifyitems)相关的知识,希望对你有一定的参考价值。

前言

有一些小伙伴一直想改变pytest用例的执行顺序,实际上我们在用例设计原则上用例就不要有依赖顺序。
pytest默认执行用例是先根据项目下的文件夹名称按ascii码去收集的,module里面的用例是从上往下执行的.
pytest_collection_modifyitems 这个钩子函数顾名思义就是改变用例的执行顺序。

pytest_collection_modifyitems

pytest_collection_modifyitems 功能是当测试用例收集完成后,可以改变测试用例集合(items)的顺序

def pytest_collection_modifyitems(session, config,items):
    '''called after collection is completed. 
    you can modify the ``items`` list
    :param _pytest.main.Session session: the pytest session object
    :param _pytest.config.Config config: pytest config object
    :param List[_pytest.nodes.Item] items: list of item objects
    '''

items是用例对象的一个列表,改变items里面用例的顺序就可以改变用例的执行顺序了。

pytest默认执行顺序

先设计一个简单的 pytest 项目,有a和b两个包,分别在 test_a.py 和 test_b.py 写测试用例

conftest.py内容

import pytest
# 上海-悠悠

def pytest_collection_modifyitems(session, items):
    print("收集到的测试用例:%s"%items)

test_a.py内容

def test_a_1():
    print("测试用例a_1")

def test_a_2():
    print("测试用例a_2")

test_b.py内容

def test_b_2():
    print("测试用例b_2")

def test_b_1():
    print("测试用例b_1")

运行完成后可以看到收集到的测试用例,会在测试用例开始执行执行

D:\\demo2>pytest
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-4.5.0, py-1.5.4, pluggy-0.13.1
rootdir: D:\\soft\\code\\pytest_jenkins_demo\\demo2
plugins: allure-pytest-2.8.6
collecting ... 收集到的测试用例:[<Function test_a_1>, <Function test_a_2>, <Function test_b_2>, <Function test_b_1>]
collected 4 items

a\\test_aaa.py ..                                                         [ 50%]
b\\test_bbb.py ..                                                         [100%]

========================== 4 passed in 0.06 seconds ===========================

从结果可以看出运行的时候先按模块名称ascii码去收集,单个py文件里面的用例按从上到下写的顺序收集。

items用例排序

如果我想改变上面的用例执行顺序,以用例名称ascii码排序。先获取到用例的名称,以用例名称排序就可以了。

# 上海-悠悠
def pytest_collection_modifyitems(session, items):
    print(type(items))
    print("收集到的测试用例:%s" % items)
    # sort排序,根据用例名称item.name 排序
    items.sort(key=lambda x: x.name)
    print("排序后的用例:%s" % items)
    for item in items:
        print("用例名:%s" % item.name)

重新执行后结果


D:\\soft\\code\\pytest_jenkins_demo\\demo2>pytest -s
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-4.5.0, py-1.5.4, pluggy-0.13.1
rootdir: D:\\soft\\code\\pytest_jenkins_demo\\demo2
plugins:
collecting ... <class 'list'>
收集到的测试用例:[<Function test_a_1>, <Function test_a_2>, <Function test_b_2>, <Function test_b_1>]
排序后的用例:[<Function test_a_1>, <Function test_a_2>, <Function test_b_1>, <Function test_b_2>]
用例名:test_a_1
用例名:test_a_2
用例名:test_b_1
用例名:test_b_2
collected 4 items

a\\test_aaa.py 测试用例a_1
.测试用例a_2
.
b\\test_bbb.py 测试用例b_1
.测试用例b_2
.

========================== 4 passed in 0.06 seconds ===========================

重新排序后就可以按用例的名称顺序执行了。

有个 pytest-ordering 插件也可以自定义用例的顺序https://github.com/ftobia/pytest-ordering

以上是关于pytest文档34-Hooks函数改变用例执行顺序(pytest_collection_modifyitems)的主要内容,如果未能解决你的问题,请参考以下文章

pytest用法---学习篇1

pytest文档54-Hooks函数terminal打印测试结果(pytest_report_teststatus)

pytest文档33-Hooks函数获取用例执行结果(pytest_runtest_makereport)

pytest文档33-Hooks函数获取用例执行结果(pytest_runtest_makereport)

pytest文档78 - 钩子函数pytest_runtest_makereport获取用例执行报错内容和print内容

pytest文档78 - 钩子函数pytest_runtest_makereport获取用例执行报错内容和print内容