How to include code coverage in Azure DevOps pipeline?
Nicola Biancolini
Posted on January 16, 2021
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
TL;DR
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.
coverlet-coverage / coverlet
Cross platform code coverage for .NET
to gather metrics, and
danielpalme / ReportGenerator
ReportGenerator converts coverage reports generated by coverlet, OpenCover, dotCover, Visual Studio, NCover, Cobertura, JaCoCo, Clover, gcov or lcov into human readable reports in various formats.
for generate human-readable reports.
How can set-up coverlet?
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).
How can set-up ReportGenerator?
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.
How to wire-up all that?
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.
And now, how I can put it into Azure DevOps pipeline?
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?
One unwrite note of Publish Code Coverage Results task or limitation, I don't know, is that the sum of covered lines, when we publish more reports, is take from the first file
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.
Posted on January 16, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.