发布 Azure DevOps 流水线代码覆盖率报告

12
我试图在我的Azure DevOps Pipeline中在线发布一份详细报告,但最终只得到了一个下载此覆盖率文件的链接 (由于Visual Studio 2019的社区版已无法读取该文件)。 enter image description here 这是我的Pipeline:
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。

3个回答

33

要发布报告,您需要使用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  

[2021 更新]

现在您无需额外的任务来安装/运行自定义ReportGenerator工具:它现在是读取coverage.cobertura.xml文件的默认工具,并包含在dotnet CLI中。

默认情况下,它将保存 cobertura xml 文件到代理的临时目录中。因此,您只需更新 PublishCodeCoverageResults 任务的summaryFileLocation以指向临时目录并跳过“中间人”步骤即可:

# 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"'

- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage'
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
如果您有多个测试项目生成了多个覆盖率文件,请在测试命令之后使用以下步骤。它将在发布前合并文件:
  - task: reportgenerator@4
    displayName: "Merge code coverage reports"
    inputs:
      reports: "**/coverage.cobertura.xml"
      targetdir: "$(Build.ArtifactStagingDirectory)/coverlet"
      reporttypes: "Cobertura"
      verbosity: "Verbose"

  - task: PublishCodeCoverageResults@1
    displayName: "Publish code coverage results"
    inputs:
      codeCoverageTool: Cobertura
      summaryFileLocation: "$(Build.ArtifactStagingDirectory)/coverlet/Cobertura.xml"

2
截至2021年夏季,您无需执行额外的任务来安装/运行ReportGenerator,因为它现在是读取coverage.covertura.xml文件的默认工具。您只需要更新PublicCodeCoverageResults任务的summaryFileLocation以指向临时目录,就像您已经使用脚本任务传递ReportGenerator路径一样即可。 - Thiago Silva
我已经尝试了这些步骤,但不幸的是发布任务失败了:找到了多个文件或目录匹配项。使用第一个匹配项:C:\agent\_work\38\s\artifacts\test-results\$redacted\In\redacted\coverage.cobertura.xml ##[error]未找到要发布的代码覆盖率结果。 我不知道发生了什么。当我在本地运行 dotnet test 时,我可以看到所有的 coverage.cobertura.xml 文件都按预期生成。我甚至可以在我的管道的 dotnet test 输出中看到它们。 - NathanAldenSr
另外,我不能使用 $(Agent.TempDirectory) ,因为我正在运行有状态的本地构建代理(这不是我的选择)。 - NathanAldenSr
@NathanAldenSr:我有多个测试项目,构建流水线报告与您上面报告的相同警告 - 仅有效发布一个测试项目的覆盖率报告。您是否能够解决这个问题? - user527614
@user527614 如果您有多个生成的文件,您需要先合并它们。请查看我的编辑。 - Krzysztof Madej
显示剩余4条评论

2
我已经尝试了很多方法来解决这个问题...首先,问题出在管道的测试任务上(在我的情况下是DotNetCoreCLI@2任务)。如果此任务收集代码覆盖率,则会自动以.coverage格式与测试一起发布。由于某种原因,此文件的推送在管道(或作业 - 我不知道)的末尾,因此会覆盖之前上传的所有文件。
解决方案 使用类似OpenCover的覆盖工具,而不是通过带有CodeCoverage收集的测试任务进行收集。
示例: OpenCover.Console.exe -target:"dotnet.exe" -targetArgs:"test {solution.sln}" -output:"{outputDir}\OpenCover.xml" {-oldstyle} 然后通过ReportGenerator任务将OpenCover文件转换为Cobertura格式。
之后,您可以像往常一样通过PublishCodeCoverageResult任务发布它。
您可能需要尝试一下,但记住这个解决方案,它会奏效。

1
我在Azure DevOps和代码覆盖率报告渲染方面遇到了同样的问题。我尝试了各种方法,但都无济于事。有一些受欢迎的解决方案,但似乎都对我无效。我总是只得到那个愚蠢的下载链接。
阅读了@h0p3zZ的答案后,它给了我一个新的提示。由于某种原因,我的dotnet test命令生成了coverage.cobertura.xml和*.coverage文件,出于某种奇怪的原因,该文件优先于coverage.cobertura.xml文件(这使得DevOps呈现下载链接)。
在我的情况下,我将.runsettings文件传递给dontnet test命令,如下所示,这使它额外输出了一个.coverage文件。
- task: DotNetCoreCLI@2
  displayName: Test
  inputs:
    command: test
    projects: '**/*Tests/*.csproj'
    arguments: --configuration $(buildConfiguration) --collect:"XPlat Code Coverage"  --settings CodeCoverage.runsettings

一旦我摆脱了 --settings CodeCoverage.runsettings 开关,一切都运转良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接