【问题标题】:How to generate code coverage report for asp.net unit tests in Azure DevOps build如何在 Azure DevOps 构建中为 asp.net 单元测试生成代码覆盖率报告
【发布时间】:2019-06-09 15:52:08
【问题描述】:

我需要在 Azure 构建管道中生成 Asp.net 单元测试的代码覆盖率报告方面的指导。我的项目基于 .Net Framework 4.6。

我能够使用 "visual studio test" 任务运行所有单元测试。

我尝试了 "report generator" 任务,但它需要 cobertura 或 jacoco 等 xml 文件,无法在构建管道中生成。

期望 - 我想获得已运行单元测试的代码覆盖率报告,该报告将显示行覆盖率、分支覆盖率、函数覆盖率等完整信息,与“报告生成器”生成的相同。

注意:我可以在本地系统上使用 opencover 和 reportgenerator 生成报告,但无法在 azure build pipeline 中找到相同的方法。

【问题讨论】:

  • 你可以使用被套作为这篇文章的解释:Computing code coverage for a .NET Core project with Azure DevOps and Coverlet
  • 感谢@meziantou 的回复。我的项目基于 .net framework 4.6 而不是 .net core。我在描述中更新了相同的内容。我很抱歉之前没有提到同样的事情。只是想确认我可以在 .net framework 4.6 中使用 coverlet。如果是,那么我需要使用哪个 azure build 任务。

标签: azure-devops azure-pipelines azure-pipelines-build-task opencover azure-pipelines-tasks


【解决方案1】:

要在 .Net 框架中获得代码覆盖率结果,您只需在“Visual Studio 测试”任务中启用它:

如果你使用 .yml 构建语法是:

- task: VSTest@2
  inputs:
    codeCoverageEnabled: true

结果:

注意:如果您使用 Microsoft Hosted Agent,您会看到结果,如果您使用 Self Hosted Agent,您必须使用 Visual Studio Enterprise 版本才能看到代码覆盖率结果。

如果您想要更详细的代码覆盖率报告,您可以在 .Net 框架中使用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" }

然后使用这些参数添加“发布代码覆盖率”任务:

结果:

【讨论】:

  • 非常感谢@Shayki。最初,当我尝试在 azure devops 中运行您的代码时,我收到错误“无法找到包 dotnet-reportgenerator”。但是当我将 "dotnet tool install dotnet-reportgenerator --tool-path . --version 4.0.12" 中的 "dotnet-reportgenerator" 更改为 "dotnet -reportgenerator-globaltool"。它开始工作了。
  • 不过,@Shayki,出于好奇,只是想知道我们是否需要在 powershell 脚本中使用 gci -Recurse | ?{ $_.Name -eq "coverage.cobertura.xml"} | %{ &"$pwd\reportgenerator.exe" "-reports:$($_.FullName)" "-targetdir:reports" "-reportstypes:HTMLInline;HTMLChart" },因为 发布代码覆盖率结果任务 无论如何都会发布报告。
  • @Shubho 不客气!谢谢你的评论!我真的不知道为什么,我只是在其他地方看到它,它对我有用:)
  • 没问题,@Shayki。我还有一个要求。我还需要在电子邮件中显示一些代码覆盖率信息。你能告诉我是否有任何 api 可以通过它获取生成的覆盖信息,如果不是完整的,至少它的一部分。我试过 (docs.microsoft.com/en-us/rest/api/azure/devops/test/…) 但没有得到任何信息
  • 请打开一个新问题,你做了什么。
【解决方案2】:

对于在当前 .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)并在管道运行完成后查看结果:

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 2019-09-02
    • 2017-09-03
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2016-11-18
    • 2017-02-11
    • 2021-02-11
    相关资源
    最近更新 更多