簡單了解原生測試框架Unittest前置后置的邏輯
一、測試框架執行順序解析
1.1 基礎執行流程
import unittestclass A(unittest.TestCase):@classmethoddef setUpClass(cls):print(f"【CLASS START】{cls.__name__}")def setUp(self):print(f"【TEST START】{self._testMethodName}")def test_a(self):print("? 執行測試邏輯A")def test_b(self):print("? 執行測試邏輯B")def tearDown(self):print(f"【TEST END】{self._testMethodName}")@classmethoddef tearDownClass(cls):print(f"【CLASS END】{cls.__name__}")
1.2 執行順序可視化
二、核心方法功能解析
2.1 類級別方法
方法 | 觸發時機 | 執行次數 | 典型應用場景 |
---|---|---|---|
setUpClass() | 測試類初始化時 | 1次 | 數據庫連接建立 |
tearDownClass() | 測試類所有方法執行完成后 | 1次 | 資源釋放/日志歸檔 |
代碼實現特征:
@classmethod
def setUpClass(cls):# 必須使用classmethod裝飾器# 通過cls參數訪問類屬性# 不能直接調用實例方法
2.2 實例級別方法
方法 | 觸發時機 | 執行次數 | 典型應用場景 |
---|---|---|---|
setUp() | 每個測試方法執行前 | N次(N=測試方法數) | 測試數據初始化 |
tearDown() | 每個測試方法執行后 | N次 | 環境清理/結果驗證 |
方法調用關系:
測試啟動
├── setUpClass()
│ ├── setUp() -> test_a() -> tearDown()
│ └── setUp() -> test_b() -> tearDown()
└── tearDownClass()
三、代碼執行過程深度分析
3.1 實際執行日志
【CLASS START】A
【TEST START】test_a
? 執行測試邏輯A
【TEST END】test_a
【TEST START】test_b
? 執行測試邏輯B
【TEST END】test_b
【CLASS END】A
3.2 關鍵執行節點說明
-
類初始化階段:
- 創建測試類實例前執行
setUpClass()
- 適用于全局配置加載
- 創建測試類實例前執行
-
測試方法執行周期:
-
類銷毀階段:
- 所有測試執行完畢后調用
tearDownClass()
- 必須使用
@classmethod
裝飾器
- 所有測試執行完畢后調用
四、特殊場景處理機制
4.1 異常中斷處理
def setUp(self):try:# 初始化操作except Exception as e:self.skipTest(f"初始化失敗: {str(e)}")@classmethod
def tearDownClass(cls):if hasattr(cls, 'db_conn'):cls.db_conn.close() # 確保資源釋放
4.2 多層級繼承場景
class BaseTest(unittest.TestCase):@classmethoddef setUpClass(cls):print("父類初始化")class ChildTest(BaseTest):@classmethoddef setUpClass(cls):super().setUpClass() # 必須顯式調用父類方法print("子類初始化")
五、最佳實踐建議
-
資源管理原則:
- 在
setUpClass
中打開文件/數據庫連接 - 在
tearDownClass
中關閉連接 - 在
setUp
中初始化測試數據 - 在
tearDown
中清理臨時數據
- 在
-
執行效率優化:
"setUpClass" : 15 "tearDownClass" : 10 "setUp/tearDown" : 50 "測試邏輯" : 25
六、完整代碼
"""
Python :3.13.3
Selenium: 4.31.0
"""import unittestclass A(unittest.TestCase):@classmethoddef setUpClass(cls):print(cls.setUpClass.__name__)def setUp(self):print(self.setUp.__name__)def test_a(self):print(self.test_a.__name__)def test_b(self):print(self.test_b.__name__)@classmethoddef tearDownClass(cls):print(cls.tearDownClass.__name__)def tearDown(self):print(self.tearDown.__name__)
「小貼士」:點擊頭像→【關注】按鈕,獲取更多軟件測試的晉升認知不迷路! 🚀