在 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 Generator和Coverlet工具
使用 dotnet-vstest 命令通过 Coverlet 运行测试
发布使用 Report Generator 和 Cobertura 格式覆盖结果生成的报告
不要使用 VS 测试任务
运行此任务将允许您使用一个简单的复选框来收集覆盖率,但随后您将放弃为代码覆盖率选项卡
提供内容的机会直接安装工具
使用 Powershell 任务(或类似任务)直接安装 Coverlet 和 Report 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.html
、index.htm
、Class1.htm
、Class1_Test.htm
和 CoverageHistory.htm
。我只有一个Class.cs
和一个对应的Class_Test.cs
。 index.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 .NET 核心构建获得 SonarCloud 中的代码覆盖率