覆盖率报告生成器Skill coverage-report

这个技能用于生成 .NET 测试覆盖率报告,提供 HTML 可视化、阈值强制、覆盖率差距分析等功能,适用于测试、DevOps 和 CI/CD 流程,关键词包括 .NET 测试、覆盖率报告、HTML 可视化、阈值检查、覆盖率分析、测试工具、自动化测试、DevOps、CI/CD、代码质量。

测试 0 次安装 0 次浏览 更新于 3/11/2026

名称: 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%)