发布管道Azure Devops代码覆盖率报告

时间:2020-10-29 13:53:48

标签: azure-devops code-coverage pipeline cobertura

我正在尝试在Azure DevOps管道中在线发布详细的报告,但是我所得到的只是一个链接,用于下载此Coverage文件。 (自Visual Studio 2019以来,社区版本无法再读取) enter image description here

这是我的管道:

trigger:
  branches:
    include:
    - '*'

pool:
  vmImage: 'windows-2019'

steps:
- task: NuGetToolInstaller@0
  displayName: Instal Nuget
  inputs:
    checkLatest: true

- task: NuGetCommand@2
  displayName: Restore Nuget Packages
  inputs:
    restoreSolution: '**/*.sln'

- task: UseDotNet@2
  displayName: 'Install .NET Core SDK'
  inputs:
    version: 3.1.x
    performMultiLevelLookup: true

- task: DotNetCoreCLI@2
  displayName: Build Tests
  inputs:
    command: 'build'
    projects: '**/OneTienditaUnitTests/*.csproj'
    arguments: '--configuration Release'

- script: dotnet test OneTienditaUnitTests --logger trx --collect "Code coverage"

- task: PublishTestResults@2
  inputs:
    testRunner: VSTest
    testResultsFiles: '**/*.trx'

- task: XamarinAndroid@1
  displayName: Build Android App
  inputs:
    projectFile: '**/*Android*.csproj'
    outputDirectory: '$(build.binariesDirectory)/Release'
    configuration: 'Release'

如果我像这样使用Cobertura,那是行不通的:

- task: DotNetCoreCLI@2
  displayName: Run Tests
  inputs:
    command: 'test'
    projects: '**/OneTienditaUnitTests/*.csproj'
    arguments: '--configuration Release /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=../reports/coverage/'
    
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage results'
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(build.sourcesdirectory)\reports\coverage\coverage.cobertura.xml'
    reportDirectory: '$(build.sourcesdirectory)\reports\coverage'

请帮忙吗?我不是专业的DevOps

2 个答案:

答案 0 :(得分:1)

要在那里发布报告,您需要使用Cobertura。对于TRX,您将仅获得下载文件的链接。要创建Cobertura报告,您需要在测试项目coverlet.collector nuget软件包中安装。在这里,您可以找到解决问题的代码:

# 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  

答案 1 :(得分:0)

我已经尝试了很多来解决他的问题...

所以首先,问题是管道的测试任务(在我的例子中是 DotNetCoreCLI@2 任务)。如果此任务收集代码覆盖率,它会自动与 .coverage 格式的测试一起发布。出于某种原因,.coverage 文件的推送位于管道(或作业 - 我不知道)的末尾,因此会覆盖所有以前上传的文件。

解决方案 使用像 OpenCover 这样的覆盖率工具,并通过打开 CodeCoverage 集合的测试任务来收集代码覆盖率,而不是收集。

示例:

OpenCover.Console.exe -target:"dotnet.exe" -targetArguments:"test {solution.sln]" -output:"{outputDir}\OpenCover.xml"

然后通过 ReportGenerator 任务将 OpenCover 文件转换为 Cobertura 格式。

之后,您可以像往常一样通过 PublishCodeCoverageResult 任务发布它。

您可能需要稍微尝试一下,但考虑到该解决方案,它会起作用。