名称: coverage-report 描述: 生成带有 HTML 可视化和阈值强制执行的测试覆盖率报告 参数提示: “[–format <format>] [–threshold <percent>] [–open]” 允许工具: Bash, Read, Glob, Grep, AskUserQuestion
/dotnet:coverage-report
生成全面的测试覆盖率报告,包括 HTML 可视化、阈值强制执行和覆盖率差距分析。
参数
从 $ARGUMENTS 解析参数:
| 标志 | 描述 | 默认值 |
|---|---|---|
--format <format> |
输出格式 (cobertura, opencover, html, all) | html |
--threshold <percent> |
如果行覆盖率低于阈值则失败 | 无 |
--project <path> |
针对特定测试项目 | 所有测试项目 |
--output <path> |
报告输出目录 | ./coverage |
--open |
在浏览器中打开 HTML 报告 | false |
--history |
包括历史趋势(如果可用) | false |
先决条件
此命令需要覆盖率工具。如果未安装,将提示:
未找到覆盖率工具。立即安装?
必需:
- dotnet-coverage (收集)
- reportgenerator (HTML 报告)
运行: /dotnet:install-tool --tool coverage
运行: /dotnet:install-tool --tool reportgen --global
工作流程
步骤 1: 检查工具可用性
# 检查覆盖率工具
dotnet tool list | grep -E "dotnet-coverage|reportgenerator"
# 检查全局工具
dotnet tool list --global | grep reportgenerator
如果缺失,通过 /dotnet:install-tool 提供安装。
步骤 2: 查找测试项目
# 通过约定查找测试项目
find . -name "*.Tests.csproj" -o -name "*.Test.csproj" -o -name "*Tests.csproj"
# 或通过引用测试框架
grep -l "Microsoft.NET.Test.Sdk" **/*.csproj
步骤 3: 运行带覆盖率的测试
使用 dotnet-coverage (推荐用于 .NET 6+):
dotnet-coverage collect \
--output coverage.cobertura.xml \
--output-format cobertura \
dotnet test --no-build
使用 coverlet (替代方案):
dotnet test \
--collect:"XPlat Code Coverage" \
--results-directory ./coverage
步骤 4: 生成 HTML 报告
reportgenerator \
-reports:coverage.cobertura.xml \
-targetdir:./coverage/html \
-reporttypes:Html \
-assemblyfilters:"-*.Tests;-*.Test" \
-classfilters:"-*Migrations*"
步骤 5: 分析覆盖率
解析覆盖率报告以获取指标:
- 行覆盖率百分比
- 分支覆盖率百分比
- 方法覆盖率百分比
- 按文件划分的未覆盖行
步骤 6: 阈值检查
如果指定了 --threshold:
覆盖率阈值检查:
要求:80%
实际:72.5%
状态:失败
低于阈值的文件:
- src/MyApp/Services/PaymentService.cs (45%)
- src/MyApp/Handlers/OrderHandler.cs (52%)
- src/MyApp/Controllers/ReportController.cs (61%)
输出格式
摘要报告:
测试覆盖率报告
生成时间:2026-01-18 11:00:00 UTC
测试项目:3
测试运行:247 通过,0 失败
═══════════════════════════════════════════════════════════════
覆盖率摘要
═══════════════════════════════════════════════════════════════
指标 覆盖率 目标 状态
─────────────────────────────────────────────────
行覆盖率 78.5% 80% 警告
分支覆盖率 65.2% 70% 警告
方法覆盖率 85.3% 80% 通过
═══════════════════════════════════════════════════════════════
按项目覆盖率:
项目 行 分支 方法
─────────────────────────────────────────────────────────
MyApp.Core 92.1% 88.5% 95.0%
MyApp.Api 75.3% 62.1% 82.4%
MyApp.Infrastructure 68.2% 55.0% 78.6%
顶部未覆盖文件:
文件 覆盖率 未覆盖
────────────────────────────────────────────────────────────
Services/PaymentService.cs 45.2% 87 行
Handlers/OrderHandler.cs 52.1% 64 行
Controllers/ReportController.cs 61.8% 45 行
Repositories/AuditRepository.cs 64.5% 38 行
Services/NotificationService.cs 67.2% 31 行
覆盖率差距 (未覆盖代码模式):
- 异常处理程序:23 个捕获块未测试
- 边缘情况:15 个空检查未测试
- 错误路径:12 个错误分支未测试
HTML 报告:./coverage/html/index.html
详细按文件报告:
覆盖率详情:src/MyApp/Services/PaymentService.cs
总体:45.2% (78/172 行覆盖)
已覆盖方法:
✓ ProcessPayment() 100% (15/15 行)
✓ ValidateCard() 100% (12/12 行)
✓ GetPaymentStatus() 95% (19/20 行)
部分覆盖方法:
~ RefundPayment() 42% (8/19 行)
~ HandleFailure() 35% (7/20 行)
未覆盖方法:
✗ RetryPayment() 0% (0/25 行)
✗ ProcessBatchPayments() 0% (0/31 行)
✗ HandleWebhook() 0% (0/30 行)
未覆盖行范围:
行 145-169:RetryPayment() - 重试逻辑
行 180-210:ProcessBatchPayments() - 批量处理
行 220-249:HandleWebhook() - Webhook 处理
建议:
1. 为重试场景添加测试
2. 为批量支付边缘情况添加测试
3. 为 Webhook 验证添加测试
阈值失败:
覆盖率阈值失败
要求:80% 行覆盖率
实际:72.5% 行覆盖率
差距:7.5%
要达到 80% 覆盖率,需要为约 150 多行添加测试
快速获胜 (最高影响):
1. PaymentService.cs: +27 行 = +1.5%
2. OrderHandler.cs: +24 行 = +1.3%
3. ReportController.cs: +18 行 = +1.0%
退出代码:1 (阈值未达到)
报告格式
| 格式 | 描述 | 使用场景 |
|---|---|---|
cobertura |
XML 格式 | CI/CD 集成,Azure DevOps |
opencover |
XML 格式 | SonarQube,旧工具 |
html |
交互式 HTML | 本地审查,PR 审查 |
lcov |
LCOV 格式 | GitHub Actions,Codecov |
all |
生成所有格式 | 全面报告 |
集成示例
Azure DevOps:
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Build.SourcesDirectory)/coverage/coverage.cobertura.xml'
GitHub Actions:
- name: 上传覆盖率到 Codecov
uses: codecov/codecov-action@v3
with:
files: ./coverage/coverage.cobertura.xml
SonarQube:
dotnet sonarscanner begin \
/k:"project-key" \
/d:sonar.cs.opencover.reportsPaths="coverage/coverage.opencover.xml"
示例
# 生成 HTML 覆盖率报告
/dotnet:coverage-report
# 生成带阈值强制执行的报告
/dotnet:coverage-report --threshold 80
# 生成 Cobertura XML 用于 CI
/dotnet:coverage-report --format cobertura
# 生成所有格式
/dotnet:coverage-report --format all
# 针对特定测试项目
/dotnet:coverage-report --project MyApp.Tests
# 在浏览器中打开报告
/dotnet:coverage-report --open
# 自定义输出目录
/dotnet:coverage-report --output ./artifacts/coverage
过滤
从覆盖率分析中排除:
- 测试项目 (
*.Tests,*.Test) - 生成代码 (Migrations,设计器文件)
- 第三方代码
在 reportgenerator 调用中配置:
-assemblyfilters:"-*.Tests;-*.Test;-*.Migrations"
-classfilters:"-*Generated*;-*Designer*"
历史趋势
如果指定了 --history 且存在先前报告:
覆盖率趋势 (最近 5 次运行):
日期 行% 分支% 变化
──────────────────────────────────────
2026-01-18 78.5% 65.2% +2.1%
2026-01-15 76.4% 63.8% +1.5%
2026-01-12 74.9% 62.1% +0.8%
2026-01-10 74.1% 61.5% -0.5%
2026-01-08 74.6% 62.0% --
趋势:改善 (过去 10 天 +3.9%)