常用外掛
pytest 外掛(plugin)是擴充 pytest 功能的套件,安裝後通常會自動啟用,不需要額外設定。最常用的是 pytest-cov(測量測試覆蓋率)與 pytest-xdist(多核心平行執行),其他還有處理非同步程式、隨機執行順序等外掛。本頁介紹最值得先認識的幾個。
常用外掛一覽
| 外掛 | 用途 | 常用指令 |
|---|---|---|
| pytest-cov | 測量覆蓋率(哪些程式碼被測試執行過) | pytest --cov=my_package |
| pytest-xdist | 用多個 CPU 核心平行執行測試 | pytest -n auto |
| pytest-mock | 提供 mocker fixture,見 Mock |
— |
| pytest-randomly | 每次打亂測試順序,找出彼此相依的測試 | pytest -p no:randomly 暫停使用 |
| pytest-asyncio | 測試 async def 函式 |
@pytest.mark.asyncio |
| pytest-django、Flask/FastAPI 測試工具 | 網頁框架整合 | 依框架而定 |
以 uv 安裝為開發依賴:
測量覆蓋率:pytest-cov
覆蓋率(coverage)是「測試執行時,被跑到的程式碼占全部程式碼的比例」。pytest-cov 底層使用 coverage.py:
Name Stmts Miss Cover Missing
----------------------------------------------------------
src/my_package/exchange.py 10 2 80% 7-8
src/my_package/shop.py 5 0 100%
----------------------------------------------------------
TOTAL 15 2 87%
Missing 欄列出沒有被執行過的行號,這是覆蓋率報告最有用的資訊:它直接告訴你哪些分支沒測到。其他報告格式:
--cov-report=html:產生可在瀏覽器逐行檢視的htmlcov/報告。--cov-fail-under=80:覆蓋率低於 80% 時讓測試失敗,常用在 CI。
覆蓋率是找漏洞的工具,不是目標
100% 覆蓋率只代表每一行都被執行過,不代表每個結果都被正確驗證。沒有 assert 的測試也能把覆蓋率拉高。把它當成「哪裡完全沒測」的提示,而不是追求的分數。
平行執行:pytest-xdist
測試多到要跑好幾分鐘時,pytest-xdist 能把測試分配給多個行程(process)同時執行:
平行執行的前提是測試彼此獨立:如果兩個測試寫入同一個檔案或同一筆資料庫資料,平行時就可能互相干擾。用 tmp_path 與 function 範圍的 fixture 可以避免這類問題。
怎麼找外掛?
pytest 官方維護一份 外掛清單,列出上千個外掛與最後更新日期。挑選時優先考慮 pytest-dev 組織維護的外掛,並確認近期仍有更新、支援你使用的 pytest 版本。
推薦影音
pytest Basics: Test Parallelization with pytest-xdist
約 5 分鐘的短片,示範安裝 pytest-xdist 並用 -n 平行執行測試,觀察執行時間的差異。
I don't use pytest-cov
pytest 核心開發者 Anthony Sottile 說明他為什麼直接使用 coverage.py 而不透過 pytest-cov 外掛,適合想了解覆蓋率工具運作方式、比較兩種做法的進階讀者。