1. 程式人生 > 其它 >Pytest框架 之【用例執行順序】

Pytest框架 之【用例執行順序】

今天在使用pytest執行用例過程中,使用了debug除錯程式碼時,偶然發現,執行用例時不是自上而下的,pytest 中的用例執行順序與unittest 是不一樣的,pytest有預設的執行順序,還可以自定義執行順序。而在unittest框架中,預設按照ACSII碼的順序載入測試用例並執行,順序為:0~9、A~Z、a~z,測試目錄、測試模組、測試類、測試方法/測試函式都按照這個規則來載入測試用例。

pytest預設執行順序

  • 測試目錄--->測試模組,按照排序執行:

 執行順序如下:

同一測試模組下的執行順序

import pytest

class TestOrder:

    
def test_e(self): print("test_e") def test_4(self): print("test_4") def test_b(self): print("test_b") def test_a(self): print("test_a") def test_2(self): print("test_2") def test_1(self): print("test_1") if __name__ == '__main__
': pytest.main(['stu.py','-s'])

執行結果:

stu.py test_e
.test_4
.test_b
.test_a
.test_2
.test_1
.

 我們可以看出預設是自上而下依次執行的,如若遇到測試用例名稱過長,也會根據字母的排序順序執行,如下的程式碼執行時,就不會是自上而下,而是根據user_後邊的第一個字母l、r的排列順序執行的:

class Demo:
    def test_user_register(self):
        '''正向·註冊'''
    print('=======test_user_register============
') def test_user_login(self): '''登入''' print('=======test_user_login========') if __name__ == '__main__': pytest.main(['test_sky.py', '-vs'])

執行結果:

test_sky.py::SkyApiTest::test_user_login 
test_sky.py::SkyApiTest::test_user_register 

自定義執行順序

——使用pytest-ordering,pytest的一個外掛,可以控制用例的執行順序。

安裝:

pip install pytest-ordering

 原始碼:https://github.com/ftobia/pytest-ordering

需要搭配@pytest.mark.run() 使用:

class Test01():

    def test_02(self):
        print('\n---用例02---')

    @pytest.mark.run(order=2)
    def test_01(self):
        print('\n---用例01---')

    @pytest.mark.run(order=1)
    def test_03(self):
        print('\n---用例03---')

    def test_04(self):
        print('\n---用例04---')


if __name__ == '__main__':
    pytest.main(['stu.py', '-s'])

執行結果:

stu.py 
---用例03---
.
---用例01---
.
---用例02---
.
---用例04---
.

通過【執行結果】可以看出來,用例已經按照我們的要求,先執行用例3,在執行用例1,最後執行用例2的方法來的,這裡需要注意的是,如果你在那個用例上面沒有新增執行順序要求的話,他會先執行帶有標記的用例,然後根據未標記的用例順序進行執行。

雖然 pytest 可以自定義測試用例執行順序,但是實際測試用例設計的過程中,不應該讓用例的執行有先後順序,即任意單獨的測試用例都是獨立的完整的功能點的校驗,不對其他用例有依賴。