Unit testing Azure DevOps-使用“时生成不显示代码覆盖率”;dotnet测试——收集:';代码覆盖率'&引用;

Unit testing Azure DevOps-使用“时生成不显示代码覆盖率”;dotnet测试——收集:';代码覆盖率'&引用;,unit-testing,build,azure-devops,Unit Testing,Build,Azure Devops,我有一个.NET Framework项目,它是在自托管Windows构建代理上构建的 运行测试需要一个步骤,该步骤需要提供代码覆盖率报告和统计数据 当我尝试使用“dotnettest”时,步骤运行,测试完成,也会生成.coverage文件。当我在构建摘要完成后检查它时,我会看到标准测试结果和报告,以及代码覆盖率选项卡。代码覆盖率选项卡有一个下载链接来获取文件。没有代码覆盖率报告。在初始构建摘要屏幕上还有一个指向“设置代码覆盖率”的链接 为什么没有代码覆盖率报告?为什么“设置代码覆盖率”链接仍然可

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

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

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

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

这真令人沮丧!我肯定错过了一些非常明显的东西,但医生们认为我所做的是正确的

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

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


默认情况下,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" }
然后添加<代码>发布代码覆盖率任务:


有关详细信息,您可以参考评论和本文中提到的案例。

我最终通过使用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/'

这回答了你的问题吗?我要试一试。在使用coverlet之后,我昨天尝试了发布代码覆盖率任务,但运行它需要几个小时(实际时间)。它为项目中的每个类(数千个)创建了70mb的HTML文件。我怀疑这项任务现在已经完成了。我在GitHub repo for Azure DevOps任务中注意到,发布代码覆盖率任务已经存在多年了,并且有一个v2,但v2似乎并不公开。我放弃了!好几天没有收到您的回复,请您分享您关于此问题的最新信息好吗?我使用您的评论来帮助查找我遇到的问题,但最终以稍微不同的方式实现了这一点。