如何在Azure DevOps构建中为ASP.NET单元测试生成代码覆盖率报告

7
我需要指导如何在Azure构建管道中生成Asp.net单元测试代码覆盖率报告。我的项目基于.Net Framework 4.6。
我能够使用 "Visual Studio Test" 任务运行所有单元测试。
我尝试了 "Report Generator" 任务,但它需要Cobertura或Jacoco等XML文件,而我无法在构建管道中生成这些文件。
期望 - 我想获取运行的单元测试的代码覆盖率报告,其中将显示完整信息,例如行覆盖率、分支覆盖率、函数覆盖率等,与 "Report Generator" 生成的相同。
注意:我能够在本地系统上使用OpenCover和ReportGenerator生成报告,但无法找到在Azure构建管道中执行相同操作的方法。

您可以按照此文章中的说明使用Coverlet:使用Azure DevOps和Coverlet计算.NET Core项目的代码覆盖率 - meziantou
感谢您的回复,@meziantou。我的项目基于**.net framework 4.6而不是.net core。我已在描述中进行了更新。很抱歉之前没有提到这一点。只是想确认我是否可以在.net framework 4.6中使用coverlet**。如果可以,那么我需要使用哪个Azure构建任务呢? - Shubho
2个回答

17

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

enter image description here

如果您使用的是.yml构建,则语法如下:

- task: VSTest@2
  inputs:
    codeCoverageEnabled: true

结果:

在此输入图像描述

注意:如果您使用的是Microsoft托管代理,则将看到结果;如果您使用的是自托管代理,则必须使用Visual Studio Enterprise版本才能查看代码覆盖率结果。

如果您想要更详细的代码覆盖率报告,可以通过在流水线中安装coverlet工具,然后生成报告来使用.Net框架中的它。您可以使用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" }

输入图像描述

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

输入图像描述

结果:

输入图像描述


1
非常感谢@Shayki。最初,当我尝试在Azure DevOps中运行您的代码时,出现了错误“无法找到包dotnet-reportgenerator”。但是当我将_"dotnet tool install dotnet-reportgenerator --tool-path . --version 4.0.12"_ 中的 "dotnet-reportgenerator" 更改为 "dotnet-reportgenerator-globaltool" 后,它开始正常工作了。 - Shubho
然而,@Shayki,出于好奇,我想知道我们是否需要在PowerShell脚本中使用gci -Recurse | ?{ $_.Name -eq "coverage.cobertura.xml"} | %{ &"$pwd\reportgenerator.exe" "-reports:$($_.FullName)" "-targetdir:reports" "-reportstypes:HTMLInline;HTMLChart" },因为发布代码覆盖率结果任务会自动发布报告。 - Shubho
实际上,我找不到一种方法从构建管道中下载opercover,所以必须在触发构建之前在构建服务器上下载它。而在.Net Core中,我们可以在构建过程中使用.Net Core CLI下载coverlet。 - Shubho
嗨@ShaykiAbramczyk和Shubho,我尝试了Shayki Abramczyk分享的PS脚本,但它失败并显示错误“文件名或扩展名太长”。有多个测试文件\dll需要生成覆盖率文件。我收到以下错误--程序'coverlet.exe'无法运行:文件名或扩展名太长,在E:\Cache\Agent03\18\s\codecoverage.ps1:8字符1处 - SRP
这是我正在使用的脚本 --- CD $PSScriptRoot dotnet tool install dotnet-reportgenerator-globaltool --tool-path . --version 4.0.12 dotnet tool install coverlet.console --tool-path . --version 1.4.1 mkdir .\reports1 $unitTestFile = gci -Recurse | ?{ $_.FullName -like "test.dll" } Write-Host "$unitTestFile" $coverlet = "$pwd\coverlet.exe" & $coverlet $unitTestFile.FullName --target "dotnet" --targetargs "vstest $($unitTestFile.FullName) --logger:trx" --format "cobertura" - SRP
显示剩余17条评论

4

如果你正在寻找在Azure DevOps中进行代码覆盖率(使用经典编辑器,不使用Yaml)的解决方案,以下是.NET 5和xUnit测试的步骤:

  1. 在你的xUnit测试项目中添加以下内容(通常在.NET 5中默认提供了xUnit模板):

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

    并保持检查更新。

  2. 进入Azure DevOps,使用经典编辑器创建流水线。执行还原、生成步骤。(或者你可以选择下面的Dotnet Core模板): enter image description here

  3. 在dotnet core任务的测试命令中添加参数- --collect:“XPlat Code Coverage”,记住“XPlat Code Coverage”是友好名称且区分大小写。你的测试命令应如下所示: enter image description here 如果要发布测试结果,请选中此复选框:发布测试结果和代码覆盖率但它不会发布代码覆盖率。该功能目前尚未在非Windows系统中使用。

  4. 接下来,添加- 发布代码覆盖率结果任务。选择“Code coverage tool”作为“Cobertura”,在“Summary file”字段中添加$(Agent.TempDirectory)/**/coverage.cobertura.xml。如下所示: enter image description here

  5. 保存并排队(在任何代理上,我使用Ubuntu),一旦流水线运行完成即可查看结果: enter image description here


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