【问题标题】:Azure DevOps - Builds not showing code coverage when using "dotnet test --collect:'Code Coverage'"Azure DevOps - 使用“dotnet test --collect:'Code Coverage'”时构建不显示代码覆盖率
【发布时间】:2020-10-05 05:16:36
【问题描述】:

我有一个在自托管 Windows 构建代理上构建的 .NET Framework 项目。

有一个运行测试的步骤,该步骤需要提供代码覆盖率报告和统计数据。

当我尝试使用“dotnet test”时,步骤运行并且测试完成,.coverage 文件也会生成。当我在完成后检查构建摘要时,我会看到标准测试结果和报告,以及代码覆盖率选项卡。代码覆盖率选项卡有一个下载链接来获取文件。没有代码覆盖率报告。在初始构建摘要屏幕上还有一个指向“设置代码覆盖率”的链接。

为什么没有代码覆盖率报告?为什么“设置代码覆盖率”链接仍然可见?

这真是令人沮丧!我一定遗漏了一些非常明显的东西,但文档表明我所做的是正确的。

使用 VSTest 任务而不是 dotnet 测试会产生相同的结果,但运行速度要慢得多。

        displayName: dotnet test
        inputs: 
          command: test 
          arguments: '--configuration $(BuildConfiguration) --collect:"Code Coverage"'
          workingDirectory: '$(Build.SourcesDirectory)\src'```

【问题讨论】:

标签: unit-testing build azure-devops


【解决方案1】:

我最终通过使用 Hugh Lin 的答案寻求帮助并为我自己的目的进行修改来实现这一点。

我们在项目中使用 Coverlet 作为参考,并将 ReportGenerator 安装到 Azure DevOps 中,这样就更容易了。

我发现 SOAP API 引用存在问题,导致生成报告时出现巨大的性能问题。一旦我用“classfilter”过滤掉它,这个过程就变得更易于管理。我还发现,如果没有“disable.coverage.autogenerate”变量,“PublishCodeCoverageResults”任务将花费很长时间,并且可能会失败,因为它试图在没有“classfilters”的情况下自行执行“ReportGenerator”步骤。这样做是因为“ReportGenerator”现在已内置到“PublishCodeCoverageResults”步骤中,但由于没有过滤器,它不适用于这种情况。

这是针对 .NET Framework 项目运行的,因此需要对项目进行一些调整以确保“dotnet 测试”成功运行。

variables:
  disable.coverage.autogenerate: 'true'


  - task: DotNetCoreCLI@2
    displayName: dotnet test
    inputs: 
      command: test 
      publishTestResults: true
      arguments: '/p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --no-restore'
      workingDirectory: '$(Build.SourcesDirectory)\src'
      configuration: "$(buildConfiguration)"
      
  - task: reportgenerator@4
    inputs:
      reports: '$(Build.SourcesDirectory)\src\*.UnitTests\coverage.cobertura.xml'
      targetdir: '$(Common.TestResultsDirectory)/CoverageReport/'
      classfilters: '-NAMESPACE*'

  - task: PublishCodeCoverageResults@1
    inputs:
      codeCoverageTool: 'Cobertura'
      summaryFileLocation: '$(Build.SourcesDirectory)\src\*.UnitTests\coverage.cobertura.xml'
      reportDirectory: '$(Common.TestResultsDirectory)/CoverageReport/'

【讨论】:

    【解决方案2】:

    默认情况下,dotnet 测试任务的代码覆盖率输出到 .codecoverage 文件,Azure DevOps 不知道如何解释,仅作为可下载文件提供。代码覆盖率选项卡仅支持JacocoCobertura 格式的代码覆盖率数据。所以*.coverage文件的结果不能以表格和图形的形式显示。

    如果您想要更详细的代码覆盖率报告,您需要在.Net framework 中使用coverlet,通过在管道期间安装该工具,然后生成报告。例如在 PowerShell 脚本中:

    dotnet tool install dotnet-reportgenerator --tool-path . --version 4.0.12
    dotnet tool install coverlet.console --tool-path . --version 1.4.1
    mkdir .\reports
    $unitTestFile = gci -Recurse | ?{ $_.FullName -like "*bin\*test*.dll" }
    $coverlet = "$pwd\coverlet.exe"
    & $coverlet $unitTestFile.FullName --target "dotnet" --targetargs "vstest $($unitTestFile.FullName) --logger:trx" --format "cobertura"
    gci -Recurse |
    ?{ $_.Name -eq "coverage.cobertura.xml"} |
    %{ &"$pwd\reportgenerator.exe" "-reports:$($_.FullName)" "-targetdir:reports" "-reportstypes:HTMLInline;HTMLChart" }
    

    然后添加Publish code coverage任务:

    具体可以参考评论中提到的案例和这个ticket

    【讨论】:

    • 我会试试这个。我昨天在使用 Coverlet 后尝试了发布代码覆盖任务,它需要几个小时才能运行(实际小时数)。它为项目中的每个类(数千个)创建了 70mb 的 HTML 文件。我的怀疑是任务现在被破坏了。我确实在 Azure DevOps 任务的 GitHub 存储库中注意到,发布代码覆盖率任务已有多年历史,并且有一个 v2,但 v2 似乎没有公开可用。我放弃了!
    • 好几天没收到您的回复,能否分享一下您对此问题的最新信息?
    • 我使用您的评论来帮助找到我遇到的问题,但最终以稍微不同的方式实现了这一目标。
    猜你喜欢
    • 2021-06-13
    • 2020-11-25
    • 2018-12-05
    • 2020-05-22
    • 2020-02-01
    • 2018-03-27
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多