在 azure devops 门户上查看代码覆盖率报告

Posted

技术标签:

【中文标题】在 azure devops 门户上查看代码覆盖率报告【英文标题】:view code coverage report on azure devops portal 【发布时间】:2019-07-04 18:59:50 【问题描述】:

我正在运行 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 (link) 的解决方案,但没有看到 .Net 框架的解决方案

【问题讨论】:

【参考方案1】:

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

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

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

    继续检查新版本。

    前往 Azure devops,使用经典编辑器创建管道。执行恢复、构建步骤。 (或者您可以选择 dotnet core 模板,如下所示):

    在dotnet core task的测试命令中,添加参数---collect:"XPlat Code Coverage"。记住“XPlat 代码覆盖率”是友好的名称并且区分大小写。您的测试命令如下所示: 如果要发布测试结果,请选中此复选框:Publish test results and code coverage,但它不会发布代码覆盖率。该功能还没有工作(至少在非 Windows 中没有)。

    接下来添加 - Publish code coverage results 任务。选择“代码覆盖工具”作为“Cobertura”并在“摘要文件”字段中添加$(Agent.TempDirectory)/**/coverage.cobertura.xml。看起来像这样:

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

    覆盖率报告选项卡:

    html 覆盖率报告和覆盖率 cobertura xml 作为工件发布:

【讨论】:

但是当您导航到“代码覆盖率”选项卡时,您会看到 HTML 报告吗? 是的,HTML 覆盖率报告和覆盖率 cobertura xml 作为工件发布,覆盖率摘要嵌入在代码覆盖率选项卡中。用截图更新了帖子。【参考方案2】:

更新:

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

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

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

编辑:


我发现从 .Net Framework 项目中获取覆盖结果以显示在 代码覆盖率 选项卡上的技巧与您的 linked article 思路相同。

    不要在 Azure 中使用 VS 测试任务 运行测试 直接安装Report GeneratorCoverlet工具 使用 dotnet-vstest 命令通过 Coverlet 运行测试 发布使用 Report GeneratorCobertura 格式覆盖结果生成的报告


不要使用 VS 测试任务

运行此任务将允许您使用一个简单的复选框来收集覆盖率,但随后您将放弃为代码覆盖率选项卡

提供内容的机会



直接安装工具

使用 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 的机制。 p>

Coverlet 工具,如您链接的文章中所述,如果您告诉它这样做,它将以 Cobertura 格式输出覆盖结果。

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


发布结果



完整的脚本示例

注意:此脚本相当粗略,因此请根据您的个人情况将其用作思考练习。

"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 命令找出引号等的转义,YOU ARE NOT ALONE。我使用PSCX 中的echoargs 命令行开关的次数比我愿意承认的要多,因此我可以看到实际提供给我正在拨打的.exe 调用的内容。



结果!!

...因为这真的很重要






原答案:


由于您提到的链接文章安装和使用报告生成器全局工具的方式,我认为您仍然可以遵循这些指南来创建 HTML 内联和图表报告类型。

我不确定文章所说的是什么意思或它是如何工作的,

重点是报告类型:使用 HTMLInLine 启用 Azure DevOps 页面上的输出。 Azure DevOps Coverage 页面在网络上显示 index.html

我了解到您可以使用该工具从 .xml 覆盖结果创建 HTML 报告,然后将覆盖结果和报告与Publish Code Coverage 任务一起发布。

因此,您似乎只需要拥有 .coverage 工具的 .xml 格式。

我没有让它在直接的 powershell 中工作,但您可以按照 Report Generator documentation 的说明编写 C# 实用程序来访问 Coverage.Analysis 库。

【讨论】:

Coverlet 文档提到了 --no-build 选项给 dotnet test。这不是dotnet vstest 的选项,包含它会产生失败的输出。 dotnet vstest 链将期望在使用该工具时构建程序集,因此在 Coverlet 添加了覆盖检测之后没有重建程序集的风险。 如果您有多个覆盖结果,请不要忘记 Coverlet 中的 merge 功能,因为报告生成器生成的多个 index.html 文件无法用于显示文件在覆盖选项卡上。 另外,被套的--include--exclude 选项非常好用。 @JoshGust 感谢您的解释。一切正常,但最后我没有得到Code Coverage 标签。我必须从代​​理目录手动打开报告。生成的文件有:index.htmlindex.htmClass1.htmClass1_Test.htmCoverageHistory.htm。我只有一个Class.cs 和一个对应的Class_Test.csindex.html 的内容看起来也是空的。知道出了什么问题吗? 这个答案是如此广泛,我希望我能多次投票。谢谢@JoshGust @MarTin 因为你说 I have to open the reports manually from the agent directory 我假设你使用的是 Azure DevOps Server(2019 年?)而不是 Azure DevOps Services,对吗?在这种情况下,也许以下社区线程是您成为not seeing the coverage tab 的原因。至于看似空的报告,排查确认.xml输出中的数据,但只有2个类,我不希望有很多数据。【参考方案3】:

您可以使用 azure devops 管道中的发布代码覆盖结果任务来查看 Jacoco 格式的代码覆盖结果。

有关设置和配置的更多信息,请查看 MSDN 中的博客

https://docs.microsoft.com/hi-in/azure/devops/pipelines/tasks/test/publish-code-coverage-results?view=tfs-2015#q--a

希望对你有帮助。

【讨论】:

请看我的示例代码,我已经在使用它但它仍然无法正常工作 除非有办法将 netFW 测试运行的代码覆盖率结果转换为 Cobertura ro Jacoco 格式,否则这是行不通的。

以上是关于在 azure devops 门户上查看代码覆盖率报告的主要内容,如果未能解决你的问题,请参考以下文章

Azure 门户没有看到 DevOps 组织 [帐户问题?]

发布管道 Azure Devops 代码覆盖率报告

未从 Azure Devops .NET 核心构建获得 SonarCloud 中的代码覆盖率

具有代码质量的 Azure Devops 拉取请求修饰

Azure DevOps:如何为不同的测试(.net core、angular)合并两个代码覆盖率报告

无法在 Azure 门户中查看通过 Visual Studio 创建/部署的函数的代码,但是当我通过门户创建函数时可以