70 lines
2.7 KiB
Markdown
70 lines
2.7 KiB
Markdown
# 測試覆蓋率 (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:分析覆蓋率報告
|
||
|
||
1. 執行覆蓋率指令並擷取輸出
|
||
2. 解析輸出結果 (JSON 摘要或終端機輸出)
|
||
3. 列出**覆蓋率低於 80%** 的檔案,按覆蓋率由低到高排序
|
||
4. 針對每個覆蓋率不足的檔案,識別:
|
||
- 未經測試的函式或方法
|
||
- 缺失的分支覆蓋 (if/else, switch, 錯誤路徑)
|
||
- 膨脹分母的死碼 (Dead code)
|
||
|
||
## 步驟 3:生成缺失的測試
|
||
|
||
針對每個覆蓋率不足的檔案,按以下優先順序生成測試:
|
||
|
||
1. **快樂路徑 (Happy path)** — 使用有效輸入測試核心功能
|
||
2. **錯誤處理 (Error handling)** — 無效輸入、缺少資料、網路故障
|
||
3. **邊緣情況 (Edge cases)** — 空陣列、null/undefined、邊界值 (0, -1, MAX_INT)
|
||
4. **分支覆蓋 (Branch coverage)** — 涵蓋每個 if/else, switch case, 三元運算子
|
||
|
||
### 測試生成規則
|
||
|
||
- 測試檔案應鄰近原始碼:`foo.ts` → `foo.test.ts` (或遵循專案慣例)
|
||
- 使用專案現有的測試模式 (匯入風格、斷言庫、Mock 方式)
|
||
- Mock 部依賴 (資料庫、API、檔案系統)
|
||
- 每個測試應相互獨立 — 測試之間不共享可變狀態
|
||
- 描述性的測試命名:`test_create_user_with_duplicate_email_returns_409`
|
||
|
||
## 步驟 4:驗證
|
||
|
||
1. 執行完整的測試套件 — 所有測試必須通過
|
||
2. 重新執行覆蓋率檢查 — 驗證改善情況
|
||
3. 如果仍低於 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, 空字串, 空陣列, 零, 負數
|