在軟體開發中,「單元測試」(Unit Testing)是用來檢驗個別函式或模組是否正確的重要機制。Python 提供內建的 assert 關鍵字以及 unittest 測試框架來輔助開發者自動化測試流程。
assert 是 Python 內建的關鍵字,用於快速檢查程式邏輯是否正確,條件為 False 時會拋出 AssertionError。
assert 條件, "錯誤訊息(可選)"def divide(x, y):
return x / y
assert divide(6, 2) == 3
assert divide(10, 5) == 2, "除法計算錯誤"適合用於簡單測試或原型開發階段的自我檢查。
Python 標準函式庫中的 unittest 模組提供完整的單元測試支援,可定義測試類別與多個測試方法。
import unittest
def add(a, b):
return a + b
class TestAddFunction(unittest.TestCase):
def test_add_positive(self):
self.assertEqual(add(2, 3), 5)
def test_add_zero(self):
self.assertEqual(add(0, 0), 0)
def test_add_negative(self):
self.assertEqual(add(-1, -1), -2)
if __name__ == '__main__':
unittest.main()| 方法名稱 | 說明 |
|---|---|
assertEqual(a, b) |
驗證 a == b |
assertNotEqual(a, b) |
驗證 a != b |
assertTrue(x) |
驗證 bool(x) 為 True |
assertFalse(x) |
驗證 bool(x) 為 False |
assertIs(a, b) |
驗證 a is b |
assertIsNone(x) |
驗證 x is None |
assertIn(a, b) |
驗證 a in b |
assertRaises() |
測試是否拋出特定例外 |
class TestExample(unittest.TestCase):
def setUp(self):
print("建立測試前的環境")
def tearDown(self):
print("清理測試後的資源")from unittest.mock import patch
@patch('module.function')
def test_with_mock(mock_func):
mock_func.return_value = 10
assert module.function() == 10使用迴圈或外部資料批次測試多組輸入:
class TestMultiply(unittest.TestCase):
def test_multiples(self):
test_cases = [(2, 3, 6), (0, 10, 0), (-1, 5, -5)]
for a, b, expected in test_cases:
with self.subTest(a=a, b=b):
self.assertEqual(a * b, expected)setUp() 和 tearDown() 是常見樣板方法,在每個測試前後執行初始化與清理。
可使用 @unittest.skip() 或在條件下使用 self.skipTest():
class TestCondition(unittest.TestCase):
@unittest.skip("跳過這個測試")
def test_skip(self):
self.assertEqual(1, 1)
def test_maybe_skip(self):
if True: # 替換為實際條件
self.skipTest("不符合條件,跳過")
self.assertEqual(2, 2)- 函數名稱以
test_開頭 - 每個邏輯分支或邊界情況應有測試
- 單元測試應獨立,不依賴順序或外部狀態
- 測試資料固定、可重現(可配合
fixtures)
單元測試與斷言是保障程式正確性與可維護性的基礎工具。小至 assert、大至完整的測試框架,都是提升開發品質不可或缺的工具。