2.7 KiB
2.7 KiB
測試覆蓋率 (Test Coverage)
分析測試覆蓋率,識別缺口,並生成缺失的測試,以達到 80% 以上的覆蓋率。
步驟 1:偵測測試框架
| 指標 | 覆蓋率指令 |
|---|---|
jest.config.* 或 package.json 中的 jest |
npx jest --coverage --coverageReporters=json-summary |
vitest.config.* |
npx vitest run --coverage |
pytest.ini / pyproject.toml 中的 pytest |
pytest --cov=src --cov-report=json |
Cargo.toml |
cargo llvm-cov --json |
pom.xml 搭配 JaCoCo |
mvn test jacoco:report |
go.mod |
go test -coverprofile=coverage.out ./... |
步驟 2:分析覆蓋率報告
- 執行覆蓋率指令並擷取輸出
- 解析輸出結果 (JSON 摘要或終端機輸出)
- 列出覆蓋率低於 80% 的檔案,按覆蓋率由低到高排序
- 針對每個覆蓋率不足的檔案,識別:
- 未經測試的函式或方法
- 缺失的分支覆蓋 (if/else, switch, 錯誤路徑)
- 膨脹分母的死碼 (Dead code)
步驟 3:生成缺失的測試
針對每個覆蓋率不足的檔案,按以下優先順序生成測試:
- 快樂路徑 (Happy path) — 使用有效輸入測試核心功能
- 錯誤處理 (Error handling) — 無效輸入、缺少資料、網路故障
- 邊緣情況 (Edge cases) — 空陣列、null/undefined、邊界值 (0, -1, MAX_INT)
- 分支覆蓋 (Branch coverage) — 涵蓋每個 if/else, switch case, 三元運算子
測試生成規則
- 測試檔案應鄰近原始碼:
foo.ts→foo.test.ts(或遵循專案慣例) - 使用專案現有的測試模式 (匯入風格、斷言庫、Mock 方式)
- Mock 部依賴 (資料庫、API、檔案系統)
- 每個測試應相互獨立 — 測試之間不共享可變狀態
- 描述性的測試命名:
test_create_user_with_duplicate_email_returns_409
步驟 4:驗證
- 執行完整的測試套件 — 所有測試必須通過
- 重新執行覆蓋率檢查 — 驗證改善情況
- 如果仍低於 80%,針對剩餘缺口重覆步驟 3
步驟 5:報告
顯示前後對比:
覆蓋率報告 (Coverage Report)
──────────────────────────────
檔案 之前 之後
src/services/auth.ts 45% 88%
src/utils/validation.ts 32% 82%
──────────────────────────────
總體覆蓋率: 67% 84% ✅
重點關注區域
- 具有複雜分支的函式 (高循環複雜度)
- 錯誤處理器與 catch 區塊
- 程式碼庫中通用的工具函式 (Utility functions)
- API 端點處理程序 (Request → Response 流程)
- 邊緣情況:null, undefined, 空字串, 空陣列, 零, 負數