前幾天在 Hugging Face 上實作的 AI 營養顧問,目的是為了快速部署並驗證核心概念,當時是將所有程式碼都整合在單一的 app.py 檔案裡,算是一個典型的單體式(monolithic)應用程式。
這個架構在原型開發階段效率極高,但隨著功能愈加愈多之後,這份「單一檔案」的程式碼將變得越來越難以維護與擴充。再加上,這種開發方式繞過單元測試,很容易埋下 bug 地雷,修正時會浪費更多時間,甚至需要更多的依賴單元反覆修改。
單元測試是一種軟體測試方法,專門用來檢查程式中最小單元(通常是函式或方法)的正確性。在開發軟體時,開發人員會寫一段額外的程式(測試程式),自動化地呼叫這個功能單元,然後驗證它的輸出是否如預期。
簡單的說,單元測試就像是在開發階段時設下「防護的天羅地網」,讓人可以放心調整、增加或重構功能,也能幫助團隊合作時減少踩雷的風險。
在軟體開發的早期階段,或是開發過程中,就應該開始撰寫單元測試(養成「先寫測試,後寫功能」的習慣)。
在 Python 世界中,單元測試是保障專案品質的基石。最常用的兩種測試框架就是 unittest 和 pytest。unittest 設計較嚴謹且古典,pytest 則以極簡語法和高度自動化廣受歡迎。
| 項目 | pytest | unittest |
|---|---|---|
| 語法寫法 | 極簡、無需class,函式+assert就行 | 需繼承TestCase,寫setUp/tearDown |
| 執行命令 | pytest 測試檔案.py |
python -m unittest 檔案.py |
| 常用功能 | 自動收斂 test_開頭函式,詳細錯誤報告 | 需手動寫測試集/更繁瑣 |
| 資源隔離/Mocking | 建議用pytest fixture,彈性高 | 依賴unittest.mock,結構較死板 |
| 擴充性 | 許多第三方插件(如pytest-cov, pytest-mock) | 擴充和插件較少 |
| 社群現況 | 現代Python主流,社群支持活躍 | 標準庫、較多舊專案 |
pytest 例子(執行方法:pytest 檔名.py)# 以 pytest 為例
def add(x, y):
return x + y
# 函式命名規則:test_開頭
def test_add():
assert add(3, 4) == 7
Day23. Flask 與資料庫整合 Ep2:用 SQLite 實作留言板功能