- 在 Python 的開發世界裡,寫測試(Testing)就像是為你的程式碼買保險。它能確保當你修改功能時,舊的邏輯不會崩壞。但在開始寫測試之前,新手往往會面臨第一個難題:「我該用 Python 內建的
**unittest**
,還是大家都推薦的 **pytest**
?」
- 這篇文章將剝開這兩個框架的外衣,用最淺顯易懂的方式分析它們的優缺點,並告訴你為什麼這場對決的勝負其實很明顯。
- 選手一:unittest —— 嚴謹的公務員
unittest
是 Python 標準庫(Standard Library)的老將。它的設計深受 Java 的 JUnit 啟發,因此帶有濃厚的「物件導向」風格。
- 它的特徵:
- 出身名門(內建):你不需要安裝任何東西,只要安裝了 Python,它就在那裡。
- 講究規矩(類別導向):寫測試必須建立 Class,並繼承特定的父類別。
- 一板一眼(斷言方法):你不能直接說
a == b
,你必須說 self.assertEqual(a, b)
。
- 程式碼範例:
import unittest
def add(x, y):
return x + y
class TestAddFunction(unittest.TestCase): # 1. 必須繼承 TestCase
def test_add(self):
# 2. 必須使用特定的斷言方法
self.assertEqual(add(1, 2), 3)
self.assertNotEqual(add(1, 2), 4)
if __name__ == '__main__':
unittest.main()
- 選手二:pytest —— 靈活的魔術師
pytest
是一個第三方的測試框架,需要透過 pip install pytest
安裝。它是目前 Python 社群中最受歡迎的選擇,因為它徹底貫徹了 Python “Simple is better than complex” 的哲學。
- 它的特徵:
- 極簡主義:不需要繼承、不需要 Class,寫一個普通的函式就能當測試用。
- 聰明絕頂:它能讀懂 Python 原生的
assert
指令,不需要記一堆 API。
- 強大外掛:擁有豐富的插件生態系(Plugins)和強大的 Fixture 功能。
- 程式碼範例:
- 同樣的測試,換成
pytest
寫,變得非常清爽:
import pytest
def add(x, y):
return x + y
def test_add():
# 直接用 assert,直觀又好懂
assert add(1, 2) == 3
assert add(1, 2) != 4
- 深度解析:為什麼大家紛紛跳槽到 pytest?
- 雖然
unittest
是內建的,但在現代 Python 開發中,pytest
幾乎呈現壓倒性的勝利。以下是三個關鍵差異點:
- 1. 斷言(Assertions)的寫法
- unittest: 你需要記憶
assertTrue
, assertFalse
, assertEqual
, assertIn
, assertIsInstance
… 等繁雜的方法。
- pytest: 你只需要一個關鍵字:
assert
。pytest 會在測試失敗時,自動幫你分析變數內容,告訴你為什麼 1 + 2
不等於 4
。
- 2. 初始化與清理(Fixtures vs setUp/tearDown)
- 在測試前(例如連線資料庫)和測試後(斷開連線),我們常需要做準備與清理工作。
- unittest: 使用
setUp
和 tearDown
方法。這通常會讓測試程式碼變得很長,且所有測試共用同一套設定,不夠靈活。
- pytest: 使用
fixtures
。這是 pytest 的殺手級功能,它可以像「依賴注入」一樣,讓你在需要的測試函式中隨傳隨到,且管理起來非常模組化。
- 3. 相容性
- 這點最重要:pytest 可以執行 unittest 寫的測試,但 unittest 不能執行 pytest 的測試。 這意味著,如果你接手了一個舊專案是用
unittest
寫的,你依然可以安裝 pytest
來跑所有的測試,享受 pytest 漂亮的輸出介面。
- 結語
- 工具是為了讓開發更順暢而存在的。
pytest
移除了寫測試的繁瑣儀式感,讓我們能專注於確保程式碼的品質。現在就打開你的終端機,輸入 pip install pytest
,開始你的測試之旅吧!
Post Views: 54