Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ _TeamCity*
*.coverage
*.coveragexml

# Coverlet code coverage
coverage.json
coverage.cobertura.xml
coverage.opencover.xml
TestResults/

# NCrunch
_NCrunch_*
.*crunch*.local.xml
Expand Down
127 changes: 127 additions & 0 deletions COVERAGE_IMPLEMENTATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Code Coverage Implementation Summary

This document summarizes the implementation of code coverage for the XHarness project.

## Changes Made

### 1. Package Dependencies
- Added `coverlet.collector` version 6.0.0 to `Directory.Packages.props`
- Added `coverlet.msbuild` version 6.0.0 to `Directory.Packages.props`

### 2. Test Project Configuration
- Created `tests/Directory.Build.props` to automatically add Coverlet packages to all test projects
- This eliminates the need to manually add coverage packages to each test project

### 3. Coverage Configuration
- Created `tests/coverlet.runsettings` with optimized coverage settings:
- Excludes test assemblies, xUnit, and Moq from coverage
- Excludes generated code and compiler-generated code
- Outputs in multiple formats (Cobertura, OpenCover, JSON)
- Uses SourceLink for better source mapping
- Skips auto-properties for cleaner reports

### 4. Coverage Scripts
- **`run-coverage.sh`** - Bash script for Linux/macOS
- **`run-coverage.ps1`** - PowerShell script for Windows
- Both scripts:
- Run all tests with coverage collection
- Output coverage results to `artifacts/coverage/`
- Support configuration and format parameters
- Provide instructions for generating HTML reports

### 5. Documentation
- **`docs/code-coverage.md`** - Comprehensive guide including:
- Quick start instructions
- Viewing options (HTML reports, VS Code extensions, CLI)
- Manual execution commands
- Configuration details
- CI/CD integration examples (Azure Pipelines, GitHub Actions)
- Coverage thresholds
- Troubleshooting guide
- Updated `README.md` with code coverage section

### 6. Git Configuration
- Updated `.gitignore` to exclude coverage output files:
- `coverage.json`
- `coverage.cobertura.xml`
- `coverage.opencover.xml`
- `TestResults/` directory

## Usage

### Basic Usage
```bash
# macOS/Linux
./run-coverage.sh

# Windows
.\run-coverage.ps1
```

### With Parameters
```bash
# Run Release build with specific format
./run-coverage.sh Release cobertura
```

### View HTML Report
```bash
# Install ReportGenerator (one-time)
dotnet tool install -g dotnet-reportgenerator-globaltool

# Generate HTML report
reportgenerator \
-reports:"artifacts/coverage/**/coverage.cobertura.xml" \
-targetdir:"artifacts/coverage/report" \
-reporttypes:Html

# Open report
open artifacts/coverage/report/index.html
```

## Current Coverage

Initial test run shows:
- **Line Coverage**: ~39.79%
- **Branch Coverage**: ~39.63%

This provides a baseline for tracking coverage improvements over time.

## Next Steps (Optional)

1. **CI Integration**: Add coverage collection to Azure Pipelines
2. **Coverage Badge**: Add coverage badge to README
3. **Coverage Thresholds**: Enforce minimum coverage requirements
4. **Coverage Trends**: Track coverage changes over time
5. **Coverage Reports**: Publish reports to Azure DevOps or Codecov

## Files Modified

- `Directory.Packages.props` - Added Coverlet packages
- `.gitignore` - Added coverage output exclusions
- `README.md` - Added code coverage section

## Files Created

- `tests/Directory.Build.props` - Test project configuration
- `tests/coverlet.runsettings` - Coverage settings
- `run-coverage.sh` - Coverage script for Unix
- `run-coverage.ps1` - Coverage script for Windows
- `docs/code-coverage.md` - Comprehensive documentation
- `COVERAGE_IMPLEMENTATION.md` - This file

## Testing

The implementation has been tested and verified to:
- ✅ Restore packages successfully
- ✅ Run all test projects
- ✅ Generate coverage data in multiple formats
- ✅ Output results to `artifacts/coverage/`
- ✅ Properly exclude test assemblies from coverage

## Notes

- Coverlet version 6.0.0 is used (latest available in dotnet-public feed)
- Coverage data is generated per test project in separate directories
- Multiple output formats are generated simultaneously (Cobertura, OpenCover, JSON)
- Scripts are designed to work with XHarness's existing build infrastructure
95 changes: 95 additions & 0 deletions COVERAGE_QUICKSTART.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Quick Start: Code Coverage in XHarness

## 🚀 Run Coverage (Simplest)

```bash
./run-coverage.sh
```

That's it! Coverage will be generated in `artifacts/coverage/`.

---

## 📊 View Coverage Report (HTML)

### One-time setup:
```bash
dotnet tool install -g dotnet-reportgenerator-globaltool
```

### Generate and view report:
```bash
# Generate HTML report
reportgenerator \
-reports:"artifacts/coverage/**/coverage.cobertura.xml" \
-targetdir:"artifacts/coverage/report" \
-reporttypes:Html

# Open in browser (macOS)
open artifacts/coverage/report/index.html

# Or Linux
xdg-open artifacts/coverage/report/index.html
```

---

## 🎯 Quick Commands

### Run with different configuration:
```bash
./run-coverage.sh Release
```

### Run with specific format:
```bash
./run-coverage.sh Debug opencover
```

### Run a single test project:
```bash
dotnet test tests/Microsoft.DotNet.XHarness.CLI.Tests/Microsoft.DotNet.XHarness.CLI.Tests.csproj \
--collect:"XPlat Code Coverage" \
--results-directory artifacts/coverage \
--settings tests/coverlet.runsettings
```

### View summary in terminal:
```bash
reportgenerator \
-reports:"artifacts/coverage/**/coverage.cobertura.xml" \
-reporttypes:TextSummary
```

---

## 📝 What's Included

- ✅ Coverlet configured for all test projects
- ✅ Scripts for Linux/macOS and Windows
- ✅ Multiple output formats (Cobertura, OpenCover, JSON)
- ✅ Excludes test assemblies and auto-properties
- ✅ Optimized settings for best performance
- ✅ Comprehensive documentation

---

## 📚 More Information

See [docs/code-coverage.md](docs/code-coverage.md) for:
- Advanced usage
- CI/CD integration
- VS Code extensions
- Troubleshooting
- Configuration options

---

## 🎨 VS Code Integration (Optional)

Install the [Coverage Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters) extension to see coverage directly in your editor:

1. Install the extension
2. Run coverage: `./run-coverage.sh`
3. Press `Ctrl+Shift+7` (or `Cmd+Shift+7` on Mac) to toggle coverage display
4. Coverage will be shown as colored lines in the editor gutter
3 changes: 3 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
<PackageVersion Include="xunit.extensibility.execution" Version="$(XUnitVersion)" />
<PackageVersion Include="xunit.runner.utility" Version="$(XUnitVersion)" />
<PackageVersion Include="Moq" Version="4.20.70" />
<!-- Code Coverage -->
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
<PackageVersion Include="coverlet.msbuild" Version="6.0.0" />
</ItemGroup>

</Project>
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,20 @@ The workaround we went with lies in sharing a random string with the application
To turn this workaround on, run XHarness with `--signal-app-end` and make sure your application logs the string it reads from the env variable.
Using the `TestRunner` from this repository will automatically give you this functionality.

## Code Coverage

XHarness uses [Coverlet](https://github.com/coverlet-coverage/coverlet) for code coverage. To generate coverage reports:

```bash
# Run tests with coverage (Linux/macOS)
./run-coverage.sh

# Run tests with coverage (Windows)
.\run-coverage.ps1
```

See [docs/code-coverage.md](docs/code-coverage.md) for detailed instructions on generating and viewing coverage reports.

## Contribution

We welcome contributions! Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
Expand Down
41 changes: 41 additions & 0 deletions docs/azure-pipelines-coverage-example.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Example: Azure Pipelines Code Coverage Integration

# Add this to your existing Azure Pipelines YAML file to enable code coverage

steps:
# ... existing build steps ...

# Run tests with code coverage
- task: DotNetCoreCLI@2
displayName: 'Run Tests with Coverage'
inputs:
command: 'test'
projects: 'XHarness.slnx'
arguments: '--configuration $(BuildConfiguration) --collect:"XPlat Code Coverage" --settings:tests/coverlet.runsettings --results-directory:$(Build.SourcesDirectory)/artifacts/coverage'
publishTestResults: true

# Publish code coverage results
- task: PublishCodeCoverageResults@1
displayName: 'Publish Code Coverage'
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: '$(Build.SourcesDirectory)/artifacts/coverage/**/coverage.cobertura.xml'
reportDirectory: '$(Build.SourcesDirectory)/artifacts/coverage/report'
failIfCoverageEmpty: false

# (Optional) Generate HTML report using ReportGenerator
- task: reportgenerator@5
displayName: 'Generate Coverage Report'
inputs:
reports: '$(Build.SourcesDirectory)/artifacts/coverage/**/coverage.cobertura.xml'
targetdir: '$(Build.SourcesDirectory)/artifacts/coverage/report'
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
assemblyfilters: '-*.Tests'

# (Optional) Publish coverage as build artifact
- task: PublishBuildArtifacts@1
displayName: 'Publish Coverage Report'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/coverage/report'
ArtifactName: 'CoverageReport'
publishLocation: 'Container'
Loading
Loading