在Azure DevOps门户上查看代码覆盖率报告

23

我正在运行NUnit测试(项目在.NET Framework 4.5中),作为Azure DevOps构建管道的一部分。

- task: VSTest@2
  inputs:
    testAssemblyVer2: 'tests/**/*.Tests.dll'
    pathtoCustomTestAdapters: '$(Build.SourcesDirectory)/packages'
    codeCoverageEnabled: true
  displayName: 'NUnit Testing'

- task: PublishCodeCoverageResults@1
  inputs:
    codeCoverageTool: JaCoCo
    summaryFileLocation: '$(Common.TestResultsDirectory)/**/*.xml'
  displayName: 'Publish Code Coverage'
  //        summaryFileLocation: '$(Common.TestResultsDirectory)/**/*.coverage'

但我看不到覆盖率报告,我只能看到覆盖率结果的下载链接...

代码覆盖率下载链接

我该如何将 .coverage 报告转换为 JaCoCo 格式?或者如何直接生成 JaCoCo 格式的报告?

我已经看到了一些 .Net Core 的解决方案 (链接),但没有 .Net Framework 的。

3个回答

38

更新:

根据发布到Azure Devops的Sprint 150版本

在发布代码覆盖率报告时,您不再需要指定HTML文件。

因此,我的示例脚本不再需要直接使用报告生成工具来创建HTML报告,并且在发布覆盖率结果时,不需要指定包含这些HTML报告的目录。

编辑:


我发现从.Net Framework项目获取覆盖率结果并显示在代码覆盖率选项卡中的技巧与您链接的文章的思路相同。

  1. 不要在Azure中使用VS Test任务运行测试
  2. 直接安装Report GeneratorCoverlet工具
  3. 使用dotnet-vstest命令通过Coverlet运行测试
  4. 发布用Report Generator生成的报告和Cobertura格式的覆盖率结果


不要使用VS测试任务

运行此任务将允许您通过简单的复选框收集覆盖率,但您将失去为代码覆盖率选项卡提供内容的机会。

no VsTest task



直接安装工具

使用 Powershell 任务(或类似工具)直接安装CoverletReport Generator工具。这样可以在非 .Net Core 项目中使用它们。

"install tools:"
&dotnet tool install dotnet-reportgenerator-globaltool --tool-path . --version 4.0.12
&dotnet tool install coverlet.console --tool-path . --version 1.4.1



通过Coverlet使用dotnet vstest

我理解dotnet test.Net Framework项目/程序集不兼容。但是,我们仍然可以使用dotnet命令,因为我们知道它会在代理机器上,但我们需要将其用作访问vstest.console.exe的机制。

正如您链接的文章中提到的,Coverlet工具将在Cobertura格式中输出覆盖率结果,如果您告诉它这样做。

&$coverlet $unitTestFile.FullName --target "dotnet" --targetargs "vstest $($unitTestFile.FullName) --logger:trx" --format "cobertura"


发布结果

use publish code coverage task



完整的脚本示例

注意:这个脚本还比较粗糙,所以将其作为针对您个人情况的思考练习。

"install tools:"
&dotnet tool install dotnet-reportgenerator-globaltool --tool-path . --version 4.0.12
&dotnet tool install coverlet.console --tool-path . --version 1.4.1

"`nmake reports dir:"
mkdir .\reports

"`nrun tests:"
$unitTestFile = gci -Recurse | ?{ $_.FullName -like "*bin\*UnitTestProject2.dll" }
Write-Host "`$unitTestFile value: $unitTestFile"

$coverlet = "$pwd\coverlet.exe"

"calling $coverlet for $($unitTestFile.FullName)"
&$coverlet $unitTestFile.FullName --target "dotnet" --targetargs "vstest $($unitTestFile.FullName) --logger:trx" --format "cobertura"

"`ngenerate report(s)"
gci -Recurse | 
    ?{ $_.Name -eq "coverage.cobertura.xml" } | 
    %{ &"$pwd\reportgenerator.exe" "-reports:$($_.FullName)" "-targetdir:reports" "-reporttypes:HTMLInline;HTMLChart" }

如果你在使用Coverlet命令时遇到引号等字符的转义问题,你并不孤单。我使用PSCX中的echoargs命令行工具比我想象中的要多得多,这样我可以看到实际提供给我所做的.exe调用的内容。



结果!!

...因为这才是真正重要的

enter image description here



enter image description here




抱歉,我无法翻译您的请求。
由于您提到的链接文章安装和使用报告生成器全局工具的方式,我认为您仍然可以遵循创建HTML内联和图表报告类型的指南。
当文章中说到以下内容时,我不确定其含义或工作原理:
“关键是报告类型:使用HTMLInLine启用Azure DevOps页面上的输出。Azure DevOps覆盖率页面在Web上显示index.html。”
我理解您可以使用该工具从.xml覆盖结果创建HTML报告,然后与“发布代码覆盖”任务一起发布覆盖结果和报告。
因此,似乎您只需要具有.coverage工具的.xml格式。
我没有在纯PowerShell中使其工作,但是您可以按照报告生成器文档中的说明编写C#实用程序以访问Coverage.Analysis库。

2
Coverlet文档提到了dotnet test命令中的--no-build选项。但是,这个选项在dotnet vstest中不适用,使用它会导致测试失败。当使用dotnet vstest工具时,该工具链将期望构建程序集,因此在Coverlet添加覆盖率工具后,不会重新构建程序集。 - Josh Gust
1
如果您有多个覆盖率结果,请不要忘记使用Coverlet中的merge功能,因为由报告生成器生成的多个index.html文件无法用于在覆盖选项卡上显示文件。此外,Coverlet的--include--exclude选项非常好用。 - Josh Gust
@JoshGust - 谢谢分享,这很有效,但是我在测试选项卡中丢失了我的测试结果。所以我在发布代码覆盖任务之前添加了“发布测试结果”任务,并使用**\TestResults\*.trx ,然后测试结果回来了。 - Stinky Towel
@JoshGust 我按照你的步骤操作,但在 shell 脚本中出现了这个错误:“程序 'coverlet.exe' 运行失败:文件名或扩展名太长。请帮忙解决,谢谢。 - Chameera Dulanga
@JoshGust 谢谢您,先生。您的脚本解决方案运行得非常完美。 - sanjeev
显示剩余6条评论

2

对于任何想在Azure Devops(使用经典编辑器,不用Yaml)中寻找代码覆盖率的人,在当前.NET(Core)5和xUnit测试中:

  1. 在您的xUnit测试项目中,添加以下内容(通常默认情况下会出现在.NET 5 xUnit模板中):

    <PackageReference Include="coverlet.collector" Version="3.0.3" />

    不断检查新版本。

  2. 前往Azure devops,使用经典编辑器创建管道。执行还原、构建步骤。(或者你可以选择下面的.NET Core模板):select dotnet core pipeline template

  3. 在dotnet core任务的测试命令中,添加参数 - --collect:"XPlat Code Coverage"。请记住,“XPlat Code Coverage”是友好名称并且区分大小写。你的测试命令看起来像这样:enter image description here如果你想发布你的测试结果,请勾选这个复选框:Publish test results and code coverage,但它不会发布代码覆盖率。这个功能还没有工作(至少在非Windows上)。

  4. 接下来添加 - Publish code coverage results 任务。选择“Code coverage tool”为“Cobertura”,在“Summary file”字段中添加$(Agent.TempDirectory)/**/coverage.cobertura.xml。看起来像这样:dotnet test task config in pipeline

  5. 保存并排队(在任何代理中,我使用Ubuntu),并在管道运行完成后查看结果:pipeline run result

  6. 覆盖率报告选项卡:code coverage summary

  7. HTML覆盖率报告和覆盖率cobertura xml作为工件发布:coverage reports


当您导航到代码覆盖率选项卡时,您是否看到HTML报告? - Ε Г И І И О
1
是的,HTML覆盖率报告和覆盖率cobertura xml作为构件发布,覆盖率摘要嵌入在代码覆盖选项卡中。已更新帖子并附上截图。 - Meer

0

请查看我的示例代码,我已经在使用它,但它仍然无法正常工作。 - harishr
除非有一种方法将netFW测试运行的代码覆盖率结果转换为Cobertura或Jacoco格式,否则这是无法实现的。 - Josh Gust

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