引言
在《Python 自動化測試框架unittest與pytest的區別》這篇文章中,已經介紹了pytest的前后置,現在單獨拿出來,再來復習一次。
文中unittest是有三個處理前后置的函數:
setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule(),而pytest相對比unittest多了2個,函數級和方法級。
邏輯優先級:
- 模塊級(setup_module/teardown_module)開始於模塊始末,全局的
- 函數級(setup_function/teardown_function)只對函數用例生效(不在類中)
- 類級(setup_class/teardown_class)只在類中前后運行一次(在類中)
- 方法級(setup_method/teardown_method)開始於方法始末(在類中)
- 類里面的(setup/teardown)運行在調用方法的前后
實例
import pytest # setup_function&teardown_function 不在類中使用 def setup_function(): print("這是函數級setup>>>>>每條用例執行前執行") def teardown_function(): print("這是函數級teardown>>>>>每條用例執行后執行") # setup_module&teardown_module 全局 def setup_module(): print("這是模塊級setup>>>>>所有用例執行前執行") def teardown_module(): print("這是模塊級teardown>>>>>所有用例執行后執行") # 測試用例 def test_001(): print("用例001") def test_002(): print("用例002") # 測試類 class Test_Api: def setup(self): print("這是方法setup>>>>>每條用例執行前執行") def teardown(self): print("這是方法teardown>>>>>每條用例執行后執行") def setup_class(cls): print("這是類方法setup_class>>>>>所有用例執行前執行") def teardown_class(self): print("這是類方法teardown_class>>>>>所有用例執行后執行") def setup_method(self): print("這是setup_method方法>>>>>每個用例開始前執行") def teardown_method(self): print("這是teardown_method方法>>>>>每個用例結束后執行") def test_003(self): print("用例003") def test_004(self): print("用例004") if __name__ == '__main__': pytest.main('-s','test2.py')
運行結果:
test2.py::test_001 這是模塊級setup>>>>>所有用例執行前執行 這是函數級setup>>>>>每條用例執行前執行 PASSED [ 25%]用例001 這是函數級teardown>>>>>每條用例執行后執行 test2.py::test_002 這是函數級setup>>>>>每條用例執行前執行 PASSED [ 50%]用例002 這是函數級teardown>>>>>每條用例執行后執行 test2.py::Test_Api::test_003 test2.py::Test_Api::test_004 ============================== 4 passed in 0.05s ============================== Process finished with exit code 0 這是類方法setup_class>>>>>所有用例執行前執行 這是setup_method方法>>>>>每個用例開始前執行 這是方法setup>>>>>每條用例執行前執行 PASSED [ 75%]用例003 這是方法teardown>>>>>每條用例執行后執行 這是teardown_method方法>>>>>每個用例結束后執行 這是setup_method方法>>>>>每個用例開始前執行 這是方法setup>>>>>每條用例執行前執行 PASSED [100%]用例004 這是方法teardown>>>>>每條用例執行后執行 這是teardown_method方法>>>>>每個用例結束后執行 這是類方法teardown_class>>>>>所有用例執行后執行 這是模塊級teardown>>>>>所有用例執行后執行
從結果上看,邏輯優先級:
對於類外:模塊級是最大的,全局的,針對.py模塊的,你可以認為(setup_module/teardown_module)是global,針對整個py文件,你可以將測試數據初始化和清理數據放到這里。
對於類中:setup_class>setup_method>setup
對於整個py文件(模塊):首先setup_module/teardown_module永遠是最先執行的,然后識別函數和類的位置,按從上到下來執行,也是python程序執行規則。
可以試試,將類和外面的函數換一下位置:
執行結果:
執行順序:
總結
pytest的前后置處理函數實例已經講完,這是傳統的處理方法,如果像一些場景,比如說登錄,在測試業務接口的時候,我們有些接口是不需要登錄,但是有些是需要登錄,前置條件是登錄,如果說用這種傳統的函數處理,肯定不適應了,於是有大神開發的了一個fixtrue函數,它其實是setup/teardown的升級版,設計思想是由它而來。我會在下篇進行分享,請盡情期待。