Pytest(0) unittest vs pytest:Python 測試框架大對決,你該選哪一個?

  • 在 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: 使用 setUptearDown 方法。這通常會讓測試程式碼變得很長,且所有測試共用同一套設定,不夠靈活。
    • pytest: 使用 fixtures。這是 pytest 的殺手級功能,它可以像「依賴注入」一樣,讓你在需要的測試函式中隨傳隨到,且管理起來非常模組化。
  • 3. 相容性
  • 這點最重要:pytest 可以執行 unittest 寫的測試,但 unittest 不能執行 pytest 的測試。 這意味著,如果你接手了一個舊專案是用 unittest 寫的,你依然可以安裝 pytest 來跑所有的測試,享受 pytest 漂亮的輸出介面。
  • 結語
  • 工具是為了讓開發更順暢而存在的。pytest 移除了寫測試的繁瑣儀式感,讓我們能專注於確保程式碼的品質。現在就打開你的終端機,輸入 pip install pytest,開始你的測試之旅吧!

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments