【问题标题】:view code coverage report on azure devops portal在 azure devops 门户上查看代码覆盖率报告
【发布时间】: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 框架的解决方案

【问题讨论】:

    标签: azure azure-devops azure-pipelines asp.net-4.5 nunit-3.0


    【解决方案1】:

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

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

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

      继续检查新版本。

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

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

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

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

    6. 覆盖率报告选项卡:

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

    【讨论】:

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

    更新:

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

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

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

    编辑:


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

    1. 不要在 Azure 中使用 VS 测试任务 运行测试
    2. 直接安装Report GeneratorCoverlet工具
    3. 使用 dotnet-vstest 命令通过 Coverlet 运行测试
    4. 发布使用 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 格式,否则这是行不通的。
    猜你喜欢
    • 2021-02-11
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2019-07-14
    • 2014-08-21
    相关资源
    最近更新 更多