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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM