unittest 案例執行順序詳解
在 unittest?框架中,測試用例的執行順序有默認規則,也可通過自定義方式調整。以下是具體說明:
一、默認執行順序規則
unittest?對測試用例的執行順序遵循 “按測試方法名的 ASCII 碼排序”?原則,具體邏輯如下:
- 測試類內部:所有以 test?開頭的方法(如 test_login、test_register)會按方法名的字母 / 數字順序執行。
- 多個測試類:若一個模塊中有多個測試類(如 TestLogin、TestPay),類名會先按 ASCII 碼排序,再執行類內部的測試方法。
示例:
import unittest class TestOrder(unittest.TestCase): ????def test_3(self): ????????print("執行 test_3") ????def test_1(self): ????????print("執行 test_1") ????def test_2(self): ????????print("執行 test_2") if __name__ == "__main__": ????unittest.main() |
執行結果(按方法名排序):
執行 test_1 執行 test_2 執行 test_3 |
二、影響執行順序的因素
- 方法名命名規范:
若方法名未遵循有序命名(如 test_a、test_b?或 test_01、test_02),可能導致執行順序混亂。例如:
def test_login(self): ... ???# 可能在 test_register 之后執行(因 'l' 在 'r' 之后) def test_register(self): ... |
- 測試類加載順序:
模塊中多個測試類的執行順序由類名的 ASCII 碼決定。例如:
class TestB(unittest.TestCase): ?# 類名 'TestB' 會在 'TestA' 之后執行 ????def test_b1(self): ... class TestA(unittest.TestCase): ?# 先執行 ????def test_a1(self): ... |
- 繼承或混入類:
若測試類繼承了其他類,父類中的測試方法會優先于子類方法執行(同樣按方法名排序)。
三、自定義執行順序的方法
若需按業務邏輯指定執行順序(如先登錄后下單),可通過以下方式實現:
方法 1:按命名規則手動排序
通過命名規范控制順序,推薦用 數字前綴?明確順序:
class TestOrder(unittest.TestCase): ????def test_01_login(self): ???# 第 1 執行 ????????print("登錄") ????def test_02_add_cart(self): # 第 2 執行 ????????print("加入購物車") ????def test_03_pay(self): ?????# 第 3 執行 ????????print("支付") |
方法 2:使用 unittest.TestSuite?手動添加用例
通過 TestSuite?按指定順序逐個添加測試用例,完全掌控執行流程:
import unittest class TestShop(unittest.TestCase): ????def test_login(self): ????????print("登錄") ????def test_add_cart(self): ????????print("加入購物車") ????def test_pay(self): ????????print("支付") if __name__ == "__main__": ????# 創建測試套件 ????suite = unittest.TestSuite() ????# 按順序添加測試方法(注意:方法名需用字符串傳入) ????suite.addTest(TestShop("test_login")) ????suite.addTest(TestShop("test_add_cart")) ????suite.addTest(TestShop("test_pay")) ????# 執行套件 ????unittest.TextTestRunner().run(suite) |
執行結果(嚴格按添加順序):
登錄 加入購物車 支付 |
方法 3:使用第三方庫(如 unittest-ordering)
通過裝飾器指定順序,需先安裝庫:
pip install unittest-ordering |
使用示例:
from unittest import TestCase from unittest_ordering import ordered class TestOrder(TestCase): ????@ordered(-1) ?# 數字越小越先執行 ????def test_login(self): ????????print("登錄") ????@ordered(0) ????def test_add_cart(self): ????????print("加入購物車") ????@ordered(1) ????def test_pay(self): ????????print("支付") |
四、注意事項
- 避免依賴執行順序:
單元測試的最佳實踐是 “用例獨立無依賴”,即每個測試用例應能單獨運行,不依賴其他用例的執行結果(例如:每個用例開始前通過 setUp()?初始化環境,結束后用 tearDown()?清理)。
- setUp()?和 tearDown()?的執行時機:
- setUp():每個測試方法執行前都會調用(如每個用例前初始化瀏覽器)。
- tearDown():每個測試方法執行后都會調用(如每個用例后關閉瀏覽器)。
它們的執行順序不受測試方法順序影響,只與所屬方法綁定。
- 批量執行多個模塊:
若通過 discover?批量加載多個模塊的用例,模塊文件名將先按 ASCII 碼排序,再執行模塊內的用例。
五、總結
- 默認順序:按測試方法名 / 類名的 ASCII 碼排序。
- 自定義順序:通過命名規范、TestSuite?手動添加或第三方庫實現。
- 最佳實踐:保持用例獨立性,如需依賴順序,優先用 TestSuite?明確控制。
通過以上方式,可根據項目需求靈活控制 unittest?測試用例的執行順序。如果需要結合具體業務場景優化執行流程,可以補充細節進一步分析~