執行測試與命令列
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 就會套用:
更多設定見 設定檔與 conftest.py。