DEV Community

Cover image for Code Coverage .NET
davinceleecode
davinceleecode Subscriber

Posted on Edited on

Code Coverage .NET

Code Coverage .NET

For .NET projects, the most common manual way is using:

  • coverlet
  • or built-in dotnet test --collect:"XPlat Code Coverage"

Simplest first:

dotnet test --collect:"XPlat Code Coverage"
Enter fullscreen mode Exit fullscreen mode

After running, you’ll see something like:

Attachments:
.../coverage.cobertura.xml
Enter fullscreen mode Exit fullscreen mode

That XML file contains the coverage result.

Then install the report generator globally:

dotnet tool install -g dotnet-reportgenerator-globaltool
Enter fullscreen mode Exit fullscreen mode

Generate an HTML report:

If this is not working target directly the result file

reportgenerator -reports:**/coverage.cobertura.xml -targetdir:coveragereport
Enter fullscreen mode Exit fullscreen mode

target result file

reportgenerator -reports:TestResults/{ID}/coverage.cobertura.xml -targetdir:coveragereport
Enter fullscreen mode Exit fullscreen mode

Then open:

coveragereport/index.html
Enter fullscreen mode Exit fullscreen mode

You’ll see:

  • Line coverage
  • Branch coverage
  • Covered/not covered lines
  • Per class/service/controller coverage

Typical enterprise flow:

dotnet test
-> code coverage
-> stryker mutation test
-> CI/CD quality gate
Enter fullscreen mode Exit fullscreen mode

Question

  • What is the official steps after setting-up above?
dotnet test --collect:"XPlat Code Coverage"
Enter fullscreen mode Exit fullscreen mode

and

If this is not working target directly the result file

reportgenerator -reports:**/coverage.cobertura.xml -targetdir:coveragereport
Enter fullscreen mode Exit fullscreen mode

target result file

reportgenerator -reports:TestResults/{ID}/coverage.cobertura.xml -targetdir:coveragereport
Enter fullscreen mode Exit fullscreen mode

Then open:

coveragereport/index.html
Enter fullscreen mode Exit fullscreen mode

COVERLET

Coverlet is the more common approach in real .NET projects now because it integrates nicely with CI/CD and gives flexible reporting.

Here’s the normal flow.

1. Install Coverlet in your TEST project

Inside your test project folder:

dotnet add package coverlet.msbuild
Enter fullscreen mode Exit fullscreen mode

This adds the MSBuild integration of Coverlet.


2. Run coverage manually

dotnet test /p:CollectCoverage=true
Enter fullscreen mode Exit fullscreen mode

After running, you’ll see something like:

+--------+------+--------+--------+
| Module | Line | Branch | Method |
+--------+------+--------+--------+
Enter fullscreen mode Exit fullscreen mode

and a generated file:

coverage.json
Enter fullscreen mode Exit fullscreen mode

3. Generate HTML report (better UI)

Usually we use Cobertura format:

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Enter fullscreen mode Exit fullscreen mode

Then generate HTML:

reportgenerator -reports:coverage.cobertura.xml -targetdir:coveragereport
Enter fullscreen mode Exit fullscreen mode

Open:

coveragereport/index.html
Enter fullscreen mode Exit fullscreen mode

Future workflow now

Whenever code changes:

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Enter fullscreen mode Exit fullscreen mode

then:

reportgenerator -reports:coverage.cobertura.xml -targetdir:coveragereport
Enter fullscreen mode Exit fullscreen mode

Difference from built-in collector

Built-in collector:

dotnet test --collect:"XPlat Code Coverage"
Enter fullscreen mode Exit fullscreen mode

Coverlet MSBuild:

dotnet test /p:CollectCoverage=true
Enter fullscreen mode Exit fullscreen mode

Both are valid.

But Coverlet gives:

  • easier CI/CD integration
  • thresholds
  • filtering
  • merging reports
  • multiple formats
  • more enterprise flexibility

Example threshold:

dotnet test /p:CollectCoverage=true /p:Threshold=80
Enter fullscreen mode Exit fullscreen mode

This FAILS the build if coverage goes below 80%.

Top comments (0)