DEV Community

Cover image for Code Coverage .NET
davinceleecode
davinceleecode Subscriber

Posted 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)