$npx -y skills add kevintsengtw/dotnet-testing-agent-skills --skill dotnet-testing-code-coverage-analysis程式碼覆蓋率分析完整指南。當需要分析程式碼覆蓋率、產生覆蓋率報告或設定 CI/CD 覆蓋率檢查時使用。涵蓋 Coverlet 設定、報告產生、指標解讀與循環複雜度整合。包含 Fine Code Coverage、VS Code 內建工具與最佳實踐。 Make sure to use this skill whenever the user mentions code coverage, Coverlet, coverage report, branch coverage, cyclomatic complexity, or test quality me
| 1 | # 程式碼覆蓋率分析指南 |
| 2 | |
| 3 | ## Code Coverage 核心概念 |
| 4 | |
| 5 | **程式碼覆蓋率 (Code Coverage)** 是一種測量指標,用來統計測試執行時實際執行了多少程式碼。 |
| 6 | |
| 7 | **實際價值:** 找出測試盲點、評估測試完整性、輔助重構決策、增加測試信心。 |
| 8 | |
| 9 | **常見誤解:** |
| 10 | |
| 11 | - 涵蓋率 100% 不代表沒有 Bug — 只代表程式碼有被執行,不代表驗證了正確行為 |
| 12 | - 涵蓋率數字越高不一定越好 — 重點是測試的有效性 |
| 13 | - 把涵蓋率當作 KPI 會適得其反 — 開發者會為了衝數字而寫沒有 Assert 的測試 |
| 14 | |
| 15 | ## 覆蓋率工具選擇 |
| 16 | |
| 17 | | 工具 | 優點 | 適用場景 | |
| 18 | | ---------------------------- | ------------------------------ | -------------- | |
| 19 | | Visual Studio Enterprise | 內建整合,完整 UI | 僅 Enterprise | |
| 20 | | Fine Code Coverage(推薦) | 免費,即時顯示,編輯器直接標示 | VS 所有版本 | |
| 21 | | .NET CLI + Coverlet | 跨平台,CLI 自動化 | CI/CD 流程 | |
| 22 | | VS Code 內建 | 跨平台,無需額外擴充套件 | VS Code 開發 | |
| 23 | |
| 24 | ### Fine Code Coverage 設定 |
| 25 | |
| 26 | - **安裝方式:** Visual Studio 延伸模組管理 → 搜尋 "Fine Code Coverage" → 安裝 |
| 27 | - **必要設定:** 工具 → 選項 → Fine Code Coverage → Enable: `True`、Editor Colouring Line Highlighting: `True` |
| 28 | |
| 29 | ### VS Code 內建測試覆蓋率 |
| 30 | |
| 31 | 1. 安裝 C# Dev Kit 擴充套件 |
| 32 | 2. 開啟測試總管(燒杯圖示) |
| 33 | 3. 點選「執行涵蓋範圍測試」 |
| 34 | 4. 查看結果:測試涵蓋範圍視圖、編輯器內顯示、檔案總管顯示 |
| 35 | |
| 36 | ## 執行覆蓋率分析 |
| 37 | |
| 38 | ```powershell |
| 39 | # .NET CLI(推薦用於 CI/CD) |
| 40 | dotnet test --collect:"XPlat Code Coverage" |
| 41 | dotnet test --collect:"XPlat Code Coverage" --results-directory ./coverage |
| 42 | |
| 43 | # Fine Code Coverage:在 VS 中執行測試後自動顯示 |
| 44 | # VS Code:開啟測試總管 → 點選「執行涵蓋範圍測試」 |
| 45 | ``` |
| 46 | |
| 47 | ### 方法說明 |
| 48 | |
| 49 | | 方法 | 工具 | 操作步驟 | |
| 50 | | ----------------- | --------------------- | --------------------------------------------- | |
| 51 | | .NET CLI | Coverlet + CLI | 執行 `dotnet test --collect:"XPlat Code Coverage"` | |
| 52 | | Fine Code Coverage | VS 擴充套件 | 在 VS 中執行測試後自動顯示 | |
| 53 | | VS Code | C# Dev Kit | 開啟測試總管 → 執行涵蓋範圍測試 | |
| 54 | |
| 55 | ## 設定 Coverlet |
| 56 | |
| 57 | 測試專案需安裝 `coverlet.collector` 套件,並可透過 `runsettings` 檔案進行進階設定(排除規則、閾值、報告格式)。 |
| 58 | |
| 59 | > 完整 csproj 配置範例請參考 [references/coverlet-csproj-config.md](references/coverlet-csproj-config.md) |
| 60 | |
| 61 | ## 解讀覆蓋率報告 |
| 62 | |
| 63 | **顏色標示:** 綠色(已覆蓋)、黃色(部分覆蓋)、紅色(未覆蓋) |
| 64 | |
| 65 | **覆蓋率指標:** |
| 66 | |
| 67 | 1. **Line Coverage(行覆蓋率)** — 被執行的行數 / 總行數,最基本的指標 |
| 68 | 2. **Branch Coverage(分支覆蓋率)** — 被執行的分支數 / 總分支數,比行覆蓋率更準確 |
| 69 | 3. **Method Coverage(方法覆蓋率)** — 被執行的方法數 / 總方法數 |
| 70 | |
| 71 | **報告解讀策略:** 優先處理紅色區域(完全未測試)→ 檢查黃色區域(部分分支未測試)→ 評估必要性(簡單 getter/setter 可跳過) |
| 72 | |
| 73 | ## 結合複雜度指標 |
| 74 | |
| 75 | 循環複雜度(Cyclomatic Complexity)代表程式中獨立邏輯路徑的數量,等於至少需要的測試案例數量。每個 if、for、while、case、&&、|| 都會增加複雜度。 |
| 76 | |
| 77 | **Visual Studio 擴充套件:** |
| 78 | |
| 79 | - **CodeMaintainability** — 顯示可維護性指標、計算循環複雜度 |
| 80 | - **CodeMaid** — Spade 功能視覺化程式碼結構、顯示每個方法的複雜度 |
| 81 | |
| 82 | > 完整範例與測試策略請參考 [references/cyclomatic-complexity-example.md](references/cyclomatic-complexity-example.md) |
| 83 | |
| 84 | ## 改善覆蓋率的策略 |
| 85 | |
| 86 | **漸進式改善流程:** |
| 87 | |
| 88 | 1. 第一階段:覆蓋核心業務邏輯(目標 60-70%) |
| 89 | 2. 第二階段:補充邊界條件測試(目標 70-80%) |
| 90 | 3. 第三階段:處理異常情境(目標 80-85%) |
| 91 | 4. 維持階段:新增功能必須有測試 |
| 92 | |
| 93 | **優先順序:** |
| 94 | |
| 95 | - **高優先級**:業務邏輯核心、金融計算、資料驗證、權限控制、異常處理 |
| 96 | - **中優先級**:資料轉換、格式化邏輯、查詢邏輯 |
| 97 | - **低優先級**:簡單 getter/setter、DTO 類別、自動產生的程式碼 |
| 98 | |
| 99 | **排除不必要的程式碼:** 使用 `[ExcludeFromCodeCoverage]` 屬性或在 runsettings 中排除。 |
| 100 | |
| 101 | ## 最佳實踐 |
| 102 | |
| 103 | ### 測試案例數量決策 |
| 104 | |
| 105 | 1. **基於需求分析** — 列出使用案例、識別邊界條件和異常情況 |
| 106 | 2. **參考複雜度指標** — 循環複雜度提供測試案例下限 |
| 107 | 3. **平衡覆蓋率與品質** — 不以 100% 覆蓋率為唯一目標,專注於關鍵業務邏輯 |
| 108 | |
| 109 | ### 四大測試類型 |
| 110 | |
| 111 | 1. **邊界測試**:測試輸入值的上下限 |
| 112 | 2. **異常測試**:驗證錯誤處理邏輯 |
| 113 | 3. **主流程測試**:覆蓋正常的業務流程 |
| 114 | 4. **條件分支測試**:確保所有分支都有測試 |
| 115 | |
| 116 | ### 持續改善 |
| 117 | |
| 118 | - 每次提交前檢查涵蓋率變化,Pull Request 時審查覆蓋率 |
| 119 | - 關注未覆蓋的關鍵程式碼,優先處理高複雜度未測試區域 |
| 120 | - 新功能必須包含測試,Code Review 包含測試檢查 |
| 121 | |
| 122 | ## CI/CD 整合 |
| 123 | |
| 124 | 覆蓋率分析可整合至 CI/CD Pipeline,在 GitHub Actions 中使用 `dotnet test --collect:"XPlat Code Coverage"` 搭配 `reportgenerator` 產生報告;在 Azure DevOps 中使用 `DotNetCoreCLI@2` 任務搭配 `PublishCodeCoverageResults@1`。 |
| 125 | |
| 126 | > 完整 YAML 設定範例請參閱 [references/cicd-integration.md](references/cicd-integration.md) |
| 127 | |
| 128 | ## 常見問題與解決方案 |
| 129 | |
| 130 | ### Q1: 覆蓋率顯示 0%? |
| 131 | |
| 132 | 1. 確認已安裝 `coverlet.collector` 套件 |
| 133 | 2. 檢查 runsettings 設定是否正確 |
| 134 | 3. 確認測試有實際執行 |
| 135 | 4. 查看是否有排除設定過於廣泛 |
| 136 | |
| 137 | ### Q2: Visual Studio 看不到覆蓋率? |
| 138 | |
| 139 | - Community/Professional 版本:安裝 Fine Code Coverage 擴充套件 |
| 140 | - Enterprise 版本:使用內建功能 |
| 141 | - 確認已啟用覆蓋率收集 |
| 142 | |
| 143 | ### Q3: VS Code 無法顯示覆蓋率? |
| 144 | |
| 145 | 1. 確認已安裝 C# Dev Kit |
| 146 | 2. 重新執行「執行涵蓋範圍測試」 |
| 147 | 3. 檢查 lcov 檔案是否產生 |
| 148 | 4. 嘗試重新載入視窗 |
| 149 | |
| 150 | ### Q4: 如何提升覆蓋率? |
| 151 | |
| 152 | 1. 識別未覆蓋的關鍵程式碼(紅色區域) |
| 153 | 2. 補充邊界條件測試 |
| 154 | 3. 測試所有條件分支 |
| 155 | 4. 加入異常情境測試 |
| 156 | 5. 考慮重構過於複雜的方法 |
| 157 | |
| 158 | ## 檢查清單 |
| 159 | |
| 160 | - [ ] 已安裝 `coverlet.collector` 套件 |
| 161 | - [ ] 可以執行 `dotnet test --collect:"XPlat Code Coverage"` |
| 162 | - [ ] 工具可以正常顯示覆蓋率結果 |
| 163 | - [ ] 了解覆蓋率數字的真正意義(不是 KPI) |
| 164 | - [ ] 已排除不必要的程式碼 |
| 165 | - [ ] 專注於測試品質而非覆蓋率數字 |
| 166 | |
| 167 | ## 範本檔案 |
| 168 | |
| 169 | - `templates/runsettings-template.xml` - 覆蓋率設定範本 |
| 170 | - `templates/coverage-workflow.md` - 完整的工作流程說明 |
| 171 | |
| 172 | ## 核心理念 |
| 173 | |
| 174 | > **程式碼覆蓋率是手段,不是目的。** 重點在於關鍵業務邏輯是否都有測試、測試是否真正驗證了預期行為、是否能在重構時提供信心。 |
| 175 | |
| 176 | ## 輸出格式 |
| 177 | |
| 178 | - 產生 `coverage.runsettings` 設定檔,配置覆蓋率收集參數與排除規則 |
| 179 | - 修改測試專案 `.csproj`,確保包含 `coverlet.collector` 套件 |