Azure DevOps code coverage with .coverage for PR and Cobertura for full report
I have an Azure DevOps pipeline that validates pull requests. I have configured dotnet test
to collect code coverage metrics using the --collect "Code coverage"
argument:
- task: DotNetCoreCLI@2
displayName: dotnet test
inputs:
command: 'test'
arguments: '--configuration $(BuildConfiguration) --collect "Code coverage" /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura'
workingDirectory: $(baseWorkingDirectory)
projects: 'tests/**/*.csproj'
nobuild: true
As you can see, I'm also passing /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
. This I have to do in order to generete a coverage report:
- task: CmdLine@2
inputs:
script: dotnet tool install -g dotnet-reportgenerator-globaltool
- task: CmdLine@2
inputs:
script: reportgenerator -reports:$(Build.SourcesDirectory)/tests/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/CodeCoverage -reporttypes:HtmlInline_AzurePipelines;Cobertura
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Build.SourcesDirectory)/CodeCoverage/Cobertura.xml'
reportDirectory: '$(Build.SourcesDirectory)/CodeCoverage'
Documentation states that code coverage for pull requests is available only using the Visual Studio code coverage results format (file extension .coverage)
So:
- I have to use Visual Studio code coverage
--collect:"Code Coverage"
to get code coverage for pull requests, because Cobertura format won't work. - I need to use Cobertura format in order to get a readable report on the Code Coverage tab in the pipeline, but the Cobertura report won't show up if I use
--collect:"Code Coverage"
at the same time.
It seems I can't get both code coverage for PRs and a full report in Cobertura format at the same time.
Other people seem to have the same problem, but the issue wasn't resolved in that thread.
Am I missing something?
Solution 1:
Can you try use this?
You have to install coverlet.collector
package in all your test projects. Please notice that I used argument --collect:"XPlat Code Coverage"
.
# You just added coverlet.collector to use 'XPlat Code Coverage'
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- RunConfiguration.DisableAppDomain=true'
workingDirectory: $(Build.SourcesDirectory)
- task: DotNetCoreCLI@2
inputs:
command: custom
custom: tool
arguments: install --tool-path . dotnet-reportgenerator-globaltool
displayName: Install ReportGenerator tool
- script: ./reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"
displayName: Create reports
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: $(Build.SourcesDirectory)/coverlet/reports/Cobertura.xml
Please be aware that you may have different folder strcture.
If you want to use Code coverage for pull requests
feature you should not use Cobertura:
Code coverage for pull requests capability is currently only available for Visual Studio code coverage (.coverage) formats. This can be used if you publish code coverage using the Visual Studio Test task, the test verb of dotnet core task and the TRX option of the publish test results task. Support for other coverage tools and result formats will be added in future milestones.