Azure DevOps-使用“ dotnet测试--collect:'代码覆盖率”时,生成不显示代码覆盖率

时间:2020-06-15 18:02:53

标签: unit-testing build azure-devops

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

有一个步骤可以运行测试,并且该步骤需要提供代码覆盖率报告和统计信息。

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

最终,我通过使用休·林(Hugh Lin)的答案寻求帮助并针对自己的目的进行了修改。

我们在项目中将Coverlet作为参考,并将ReportGenerator安装到Azure DevOps中,从而使此操作变得容易一些。

我发现我们的SOAP API参考存在问题,导致生成报告时出现了巨大的性能问题。一旦使用“类过滤器”将其过滤掉,该过程就变得更易于管理。我还发现,如果没有“ 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/'

答案 1 :(得分:0)

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

如果要获取更详细的代码覆盖率报告,则需要在.Net框架中使用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任务:

enter image description here

有关详细信息,您可以参考注释中提到的案例以及此ticket