跳轉至

建立 2026-10-11 更新 2026-10-11

執行測試與命令列

pytest 的命令列選項決定「要跑哪些測試」與「輸出多詳細」。日常開發最常用的是 -v(詳細列出)、-k(依名稱篩選)、-x(第一個失敗就停)與 --lf(只重跑上次失敗的測試),學會這幾個就能大幅縮短除錯時間。

選擇要執行的測試

指令 執行範圍
pytest 目前目錄(或設定的 testpaths)下所有測試
pytest tests/test_shop.py 單一檔案
pytest tests/unit/ 單一資料夾
pytest tests/test_shop.py::test_apply_discount 單一測試函式(用節點 ID)
pytest tests/test_cart.py::TestCart 單一測試類別
pytest -k discount 名稱包含 discount 的測試
pytest -k "discount and not zero" 用 and/or/not 組合條件
pytest -m slow 只跑標記為 slow 的測試,見 Marker

-k 比對的是測試名稱、類別名稱與檔名,不分大小寫,適合快速挑出同一功能的測試。

最常用的選項

選項 作用 什麼時候用
-v 每個測試一行,顯示 PASSED/FAILED 想看清楚每個測試的結果
-q 精簡輸出 測試很多、只想看總結
-x 遇到第一個失敗就停止 修 bug 時避免被一堆連帶失敗洗版
--maxfail=3 失敗 3 個後停止 介於 -x 與全部跑完之間
--lf 只重跑上次失敗的測試(last failed) 修完 bug 快速驗證
--ff 先跑上次失敗的,再跑其餘(failed first) 驗證修正,同時確認沒弄壞別的
-s 不攔截 print() 輸出 臨時用 print 除錯
-l 失敗時顯示區域變數 想知道失敗當下各變數的值
--pdb 失敗時進入 Python 除錯器 需要互動式檢查狀態
-ra 結尾摘要列出所有非通過的測試與原因 想看 skip/xfail 的理由
--durations=5 列出最慢的 5 個測試 找出拖慢測試的元兇

--lf 與 --ff 依賴 pytest 在專案根目錄寫入的 .pytest_cache/ 資料夾,記得把它加進 .gitignore。

典型的除錯流程

pytest -x            # 1. 跑到第一個失敗就停
pytest --lf -l       # 2. 修改後只重跑失敗的,並顯示區域變數
pytest --ff -q       # 3. 失敗的通過後,再確認整體沒有被弄壞

結束代碼

CI 等自動化流程靠 pytest 的結束代碼(exit code)判斷成敗:

代碼 意義
0 全部通過
1 有測試失敗
2 使用者中斷(例如按 Ctrl+C)
3 pytest 內部錯誤
4 命令列用法錯誤
5 沒有收集到任何測試

代碼 5 常出現在命名不符合規則時,請回頭檢查 測試探索與命名規則。

把常用選項寫進設定檔

每次都要打的選項,可以寫進 pyproject.toml 的 addopts,之後直接執行 pytest 就會套用:

pyproject.toml
[tool.pytest]
addopts = ["-ra", "--strict-markers"]

更多設定見 設定檔與 conftest.py。