By code coverage we mean the action of trying to measure how much of our code has been executed by our tests.
This sound like
Untested code is a broken code.
Definitely a strong statement but true in a way, we don't always manage to get enough coverage.
Often this happens because we don't have time, other times because despite having written tests we are not able to read the metrics.
So, how we can "humanize" code coverage metrics? And how we can generate its?
To answer at these questions I usually use two libraries.
to gather metrics, and
for generate human-readable reports.
I usually include coverlet.msbuild by MSBuild .targets Files - Visual Studio | Microsoft Docs.
For alternative ways to include coverlet into yout test project see also coverlet-coverage/coverlet: Cross platform code coverage for .NET (github.com).
In keeping with above to include ReportGenerator by MSBuild .targets Files - Visual Studio | Microsoft Docs.
Also this tool offer a various way to use it, you can find all ways onto official documentation ReportGenerator - converts coverage reports generated by coverlet.
To make everything work we need to add another MSBuild file.
And include this into your test project, something like this
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> <Import Project="Tests.targets" /> </Project>
Now everything you are able to run
dotnet test you will able to inspect and analyze something like this
I think that is an amazing tool to understand at a glance which codes are covered and which not.
It would be nice if this report came was published into the Build pipeline report, don't you think? Maybe even include branch policies for it.
Well that's possible by use Publish Code Coverage Results task, something like this:
- task: PublishCodeCoverageResults@1 displayName: Publish Code Coverage Results inputs: codeCoverageTool: 'cobertura' summaryFileLocation: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Reports/Summary/Cobertura.xml' continueOnError: true condition: always()
We notice the
summaryFileLocation argument, this means that we will push only one file to Azure DevOps why?
This results in an unreliable result.
To fix that problem we can marge multiple reports into a summary reports so that can be publish it only one. One way to make it is the follow
and run MSBuild project into the pipeline with
- script: dotnet msbuild SummaryReportGenerator.proj /p:Configuration=$(Configuration) name: GenerateCodeCoverageSummary displayName: Generate code coverage summary
Once you've done this the sum of covered lines on Build pipeline will true.