coverage-report
Generate test coverage reports with HTML visualization and threshold enforcement
What this skill does
# /dotnet:coverage-report
Generate comprehensive test coverage reports with HTML visualization, threshold enforcement, and coverage gap analysis.
## Arguments
Parse arguments from `$ARGUMENTS`:
| Flag | Description | Default |
|------|-------------|---------|
| `--format <format>` | Output format (cobertura, opencover, html, all) | html |
| `--threshold <percent>` | Fail if line coverage below threshold | None |
| `--project <path>` | Target specific test project | All test projects |
| `--output <path>` | Output directory for reports | ./coverage |
| `--open` | Open HTML report in browser | false |
| `--history` | Include historical trends (if available) | false |
## Prerequisites
This command requires coverage tools. If not installed, will prompt:
```text
Coverage tools not found. Install now?
Required:
- dotnet-coverage (collection)
- reportgenerator (HTML reports)
Run: /dotnet:install-tool --tool coverage
Run: /dotnet:install-tool --tool reportgen --global
```
## Workflow
### Step 1: Check Tool Availability
```bash
# Check for coverage tools
dotnet tool list | grep -E "dotnet-coverage|reportgenerator"
# Check global tools
dotnet tool list --global | grep reportgenerator
```
If missing, offer to install via `/dotnet:install-tool`.
### Step 2: Find Test Projects
```bash
# Find test projects by convention
find . -name "*.Tests.csproj" -o -name "*.Test.csproj" -o -name "*Tests.csproj"
# Or by reference to test frameworks
grep -l "Microsoft.NET.Test.Sdk" **/*.csproj
```
### Step 3: Run Tests with Coverage
**Using dotnet-coverage (recommended for .NET 6+):**
```bash
dotnet-coverage collect \
--output coverage.cobertura.xml \
--output-format cobertura \
dotnet test --no-build
```
**Using coverlet (alternative):**
```bash
dotnet test \
--collect:"XPlat Code Coverage" \
--results-directory ./coverage
```
### Step 4: Generate HTML Report
```bash
reportgenerator \
-reports:coverage.cobertura.xml \
-targetdir:./coverage/html \
-reporttypes:Html \
-assemblyfilters:"-*.Tests;-*.Test" \
-classfilters:"-*Migrations*"
```
### Step 5: Analyze Coverage
Parse coverage report for metrics:
- Line coverage percentage
- Branch coverage percentage
- Method coverage percentage
- Uncovered lines by file
### Step 6: Threshold Check
If `--threshold` specified:
```text
Coverage threshold check:
Required: 80%
Actual: 72.5%
Status: FAILED
Files below threshold:
- src/MyApp/Services/PaymentService.cs (45%)
- src/MyApp/Handlers/OrderHandler.cs (52%)
- src/MyApp/Controllers/ReportController.cs (61%)
```
## Output Format
**Summary Report:**
```text
Test Coverage Report
Generated: 2026-01-18 11:00:00 UTC
Test Projects: 3
Tests Run: 247 passed, 0 failed
═══════════════════════════════════════════════════════════════
COVERAGE SUMMARY
═══════════════════════════════════════════════════════════════
Metric Coverage Target Status
─────────────────────────────────────────────────
Line Coverage 78.5% 80% WARN
Branch Coverage 65.2% 70% WARN
Method Coverage 85.3% 80% PASS
═══════════════════════════════════════════════════════════════
Coverage by Project:
Project Lines Branches Methods
─────────────────────────────────────────────────────────
MyApp.Core 92.1% 88.5% 95.0%
MyApp.Api 75.3% 62.1% 82.4%
MyApp.Infrastructure 68.2% 55.0% 78.6%
Top Uncovered Files:
File Coverage Uncovered
────────────────────────────────────────────────────────────
Services/PaymentService.cs 45.2% 87 lines
Handlers/OrderHandler.cs 52.1% 64 lines
Controllers/ReportController.cs 61.8% 45 lines
Repositories/AuditRepository.cs 64.5% 38 lines
Services/NotificationService.cs 67.2% 31 lines
Coverage Gaps (uncovered code patterns):
- Exception handlers: 23 catch blocks untested
- Edge cases: 15 null checks untested
- Error paths: 12 error branches untested
HTML Report: ./coverage/html/index.html
```
**Detailed Per-File Report:**
```text
Coverage Details: src/MyApp/Services/PaymentService.cs
Overall: 45.2% (78/172 lines covered)
Covered Methods:
✓ ProcessPayment() 100% (15/15 lines)
✓ ValidateCard() 100% (12/12 lines)
✓ GetPaymentStatus() 95% (19/20 lines)
Partially Covered Methods:
~ RefundPayment() 42% (8/19 lines)
~ HandleFailure() 35% (7/20 lines)
Uncovered Methods:
✗ RetryPayment() 0% (0/25 lines)
✗ ProcessBatchPayments() 0% (0/31 lines)
✗ HandleWebhook() 0% (0/30 lines)
Uncovered Line Ranges:
Lines 145-169: RetryPayment() - retry logic
Lines 180-210: ProcessBatchPayments() - batch processing
Lines 220-249: HandleWebhook() - webhook handling
Recommendations:
1. Add tests for retry scenarios
2. Add tests for batch payment edge cases
3. Add tests for webhook validation
```
**Threshold Failure:**
```text
COVERAGE THRESHOLD FAILED
Required: 80% line coverage
Actual: 72.5% line coverage
Gap: 7.5%
To reach 80% coverage, add tests for ~150 more lines
Quick wins (highest impact):
1. PaymentService.cs: +27 lines = +1.5%
2. OrderHandler.cs: +24 lines = +1.3%
3. ReportController.cs: +18 lines = +1.0%
Exit code: 1 (threshold not met)
```
## Report Formats
| Format | Description | Use Case |
|--------|-------------|----------|
| `cobertura` | XML format | CI/CD integration, Azure DevOps |
| `opencover` | XML format | SonarQube, older tools |
| `html` | Interactive HTML | Local review, PR reviews |
| `lcov` | LCOV format | GitHub Actions, Codecov |
| `all` | Generate all formats | Comprehensive reporting |
## Integration Examples
**Azure DevOps:**
```yaml
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Build.SourcesDirectory)/coverage/coverage.cobertura.xml'
```
**GitHub Actions:**
```yaml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: ./coverage/coverage.cobertura.xml
```
**SonarQube:**
```bash
dotnet sonarscanner begin \
/k:"project-key" \
/d:sonar.cs.opencover.reportsPaths="coverage/coverage.opencover.xml"
```
## Examples
```bash
# Generate HTML coverage report
/dotnet:coverage-report
# Generate report with threshold enforcement
/dotnet:coverage-report --threshold 80
# Generate Cobertura XML for CI
/dotnet:coverage-report --format cobertura
# Generate all formats
/dotnet:coverage-report --format all
# Target specific test project
/dotnet:coverage-report --project MyApp.Tests
# Open report in browser
/dotnet:coverage-report --open
# Custom output directory
/dotnet:coverage-report --output ./artifacts/coverage
```
## Filtering
Exclude from coverage analysis:
- Test projects (`*.Tests`, `*.Test`)
- Generated code (Migrations, designer files)
- Third-party code
Configure in reportgenerator call:
```bash
-assemblyfilters:"-*.Tests;-*.Test;-*.Migrations"
-classfilters:"-*Generated*;-*Designer*"
```
## Historical Trends
If `--history` and previous reports exist:
```text
Coverage Trend (last 5 runs):
Date Line% Branch% Change
──────────────────────────────────────
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% --
Trend: Improving (+3.9% over 10 days)
```
Related in Web Dev
generating-lwc-components
IncludedLightning Web Components with PICKLES methodology and 165-point scoring. Use this skill when the user creates or edits LWC components, builds wire service patterns, or writes Jest tests for LWC. TRIGGER when: user creates/edits LWC components, touches lwc/**/*.js, .html, .css, .js-meta.xml files, or asks about wire service, SLDS, or Jest LWC tests. DO NOT TRIGGER when: Apex classes (use generating-apex), Aura components, or Visualforce.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Set up queries with useQuery, mutations with useMutation, configure QueryClient caching strategies, implement optimistic updates, and handle infinite scroll with useInfiniteQuery. Use when: setting up data fetching in React projects, migrating from v4 to v5, or fixing object syntax required errors, query callbacks removed issues, cacheTime renamed to gcTime, isPending vs isLoading confusion, keepPreviousData removed problems.
document-processor-api
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
nutrient-document-processing
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Covers useMutationState, simplified optimistic updates, throwOnError, network mode (offline/PWA), and infiniteQueryOptions. Use when setting up data fetching, fixing v4→v5 migration errors (object syntax, gcTime, isPending, keepPreviousData), or debugging SSR/hydration issues with streaming server components.
accelint-nextjs-best-practices
IncludedNext.js performance optimization and best practices. Use when writing Next.js code (App Router or Pages Router); implementing Server Components, Server Actions, or API routes; optimizing RSC serialization, data fetching, or server-side rendering; reviewing Next.js code for performance issues; fixing authentication in Server Actions; or implementing Suspense boundaries, parallel data fetching, or request deduplication.