How do I create a coverlet coverage report on Azure DevOps Pipeline with a ".Net FrameWork 4.7" project?
Asked Answered
L

1

6

I'm currently trying to create a Coverlet coverage report with a pipeline on Azure DevOps. But, since my project is a ".Net FrameWork 4.7" project, I can't create a coverage report using "DotNetCoreCLI@2" task like a ".Net Core" project.

There's my pipeline code:

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  buildPlatform: 'Any CPU'
  buildConfiguration: 'release'
  Tests.Filter: '**\UnitTestProject1.dll'
  Tests.Filter.Criteria: 'TestCategory!=Medium&TestCategory!=Large'
  Tests.Filter.SettingsFile:

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'

- task: DotNetCoreCLI@2
  displayName: Test   
  inputs:
    command: 'test'
    projects: |
            $(Tests.Filter)
            !**\obj\**
    publishTestResults: true
    arguments: -c $(BuildConfiguration) --collect:"XPlat Code Coverage"
    
- 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 -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"
  displayName: Create reports
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage'
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(Build.SourcesDirectory)\TestResults\Coverage\*.xml'

When all test are successful I receive:

Starting: Create reports
==============================================================================
Task         : Command line
Description  : Run a command line script using Bash on Linux and macOS and cmd.exe on Windows
Version      : 2.164.2
Author       : Microsoft Corporation
Help         : https://learn.microsoft.com/azure/devops/pipelines/tasks/utility/command-line
==============================================================================
Generating script.
Script contents:
reportgenerator -reports:D:\a\_temp/**/*.coverage -targetdir:D:\a\1\s/coverlet/reports -reporttypes:"Cobertura"
========================== Starting Command Output ===========================
"C:\windows\system32\cmd.exe" /D /E:ON /V:OFF /S /C "CALL "D:\a\_temp\e4754795-32ae-47f2-bd62-d1c8b925eb84.cmd""
2020-09-28T14:56:09: Arguments
2020-09-28T14:56:09:  -reports:D:\a\_temp/**/*.coverage
2020-09-28T14:56:09:  -targetdir:D:\a\1\s/coverlet/reports
2020-09-28T14:56:09:  -reporttypes:Cobertura
2020-09-28T14:56:09: The report file pattern 'D:\a\_temp/**/*.coverage' is invalid. No matching files found.
2020-09-28T14:56:09: No report files specified.
##[error]Cmd.exe exited with code '1'.    
Finishing: Create reports

I also tried to use VSTest@2 and activate "CodeCoverageEnable" but the code coverage is not compatible with Azure DevOps and a download is necessary to see the coverage report.

There's my pipeline code for VSTest@2:

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  buildPlatform: 'Any CPU'
  buildConfiguration: 'release'
  Tests.Filter: '**\UnitTestProject1.dll'
  Tests.Filter.Criteria: 'TestCategory!=Medium&TestCategory!=Large'
  Tests.Filter.SettingsFile:

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'


- task: VSTest@2
  displayName: 'Running UnitTests'
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
            $(Tests.Filter)
            !**\obj\**
    searchFolder: '$(System.DefaultWorkingDirectory)'
    testFiltercriteria: '$(Tests.Filter.Criteria)'
    runSettingsFile: '$(Tests.Filter.SettingsFile)'
    runInParallel: true
    testRunTitle: 'Running UnitTests for $(Tests.Filter)'
    platform: '$(buildPlateform)'
    configuration: -c '$(buildConfiguration)'
    codeCoverageEnabled: true

Is there a way to create a coverage report compatible with Azure DevOps (Cobertura or JaCoCo) for my ".Net FrameWork 4.7" project without changing the project .Net FrameWork Version nor the type of the project?

Loriannlorianna answered 28/9, 2020 at 15:44 Comment(0)
L
7

After some research we manage to produce a Cobertura code coverage report for a .Net FrameWork project. The following pipeline contain two crucial point you should integrate to your pipeline:

-The line : disable.coverage.autogenerate: 'true' in the Initiate pipeline section

-The section Code coverage report

trigger:
- master
#----------------------
# Initiate pipeline 
#----------------------
stages:
- stage: Dev
  pool:
    vmImage: 'windows-latest'
  variables:
    solution: '**/*.sln'
    buildPlatform: 'Any CPU'
    buildConfiguration: 'Release'
    disable.coverage.autogenerate: 'true' # because we overwrite the coverage report generation

  jobs:
  - job: Build
    steps:
    - task: NuGetToolInstaller@1
#-------------------------------
#Intalation report generator
#-------------------------------
    - task: DotNetCoreCLI@2
      inputs:
        command: custom
        custom: tool
        arguments: install --tool-path . dotnet-reportgenerator-globaltool
      displayName: Install ReportGenerator tool
    - task: DotNetCoreCLI@2
      inputs:
        command: custom
        custom: tool
        arguments: install --tool-path . coverlet.console
      displayName: Install Coverlet.Console tool
#-------------------------------
#Execute build
#-------------------------------
    - task: NuGetCommand@2
      inputs:
        restoreSolution: '$(solution)'
    - task: VSBuild@1
      inputs:
        solution: '$(solution)'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
#-------------------------------
#Execute Unit tests
#-------------------------------

    - task: VSTest@2
      inputs:
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
#-------------------------------
#Code coverage report
#-------------------------------
    - task: PowerShell@2
      inputs:
        targetType: inline
        script: |
          Get-ChildItem *\bin -Include *Tests.dll -Recurse |
          Foreach-Object { 
            .\coverlet.exe $_.FullName --target "dotnet" --targetargs "vstest $($_.FullName) --logger:trx" --format "cobertura"
            $NewName = $_.Name + ".coverage.cobertura.xml"
            Rename-Item coverage.cobertura.xml $NewName
          }
      displayName: Generate Coverlet coverage report for test libraries

    - script: |
        mkdir .\reports
        .\reportgenerator.exe -reports:*coverage.cobertura.xml -targetdir:reports -reporttypes:"HTMLInline;HTMLChart"
        dir .\reports
      displayName: Create coverage reports in html format to be displayed in AzureDevOps

    - script: |
        mkdir .\reports
        .\reportgenerator.exe -reports:*coverage.cobertura.xml -targetdir:reports -reporttypes:"cobertura"
        dir .\reports
      displayName: Create coverage reports in xml format to be used for summary
#-------------------------------
#Publish coverage report
#-------------------------------

    - task: PublishCodeCoverageResults@1
      displayName: 'Publish code coverage to AzureDevOps'
      inputs:
        codeCoverageTool: Cobertura
        summaryFileLocation: '$(system.defaultworkingdirectory)\reports\Cobertura.xml'
        reportDirectory: '$(system.defaultworkingdirectory)\reports'

    - task: PublishBuildArtifacts@1
      displayName: 'Publish artifacts'
      inputs:
        PathtoPublish: '$(system.defaultworkingdirectory)\bin'
        ArtifactName: 'PublishBuildArtifacts'

The result is the following: Cobertura code coverage

Loriannlorianna answered 13/11, 2020 at 14:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.