Unit testing Azure DevOps-使用“时生成不显示代码覆盖率”;dotnet测试——收集:';代码覆盖率'&引用;
我有一个.NET Framework项目,它是在自托管Windows构建代理上构建的 运行测试需要一个步骤,该步骤需要提供代码覆盖率报告和统计数据 当我尝试使用“dotnettest”时,步骤运行,测试完成,也会生成.coverage文件。当我在构建摘要完成后检查它时,我会看到标准测试结果和报告,以及代码覆盖率选项卡。代码覆盖率选项卡有一个下载链接来获取文件。没有代码覆盖率报告。在初始构建摘要屏幕上还有一个指向“设置代码覆盖率”的链接 为什么没有代码覆盖率报告?为什么“设置代码覆盖率”链接仍然可见 这真令人沮丧!我肯定错过了一些非常明显的东西,但医生们认为我所做的是正确的 使用VSTest任务而不是dotnet测试会产生相同的结果,但运行速度要慢得多Unit testing Azure DevOps-使用“时生成不显示代码覆盖率”;dotnet测试——收集:';代码覆盖率'&引用;,unit-testing,build,azure-devops,Unit Testing,Build,Azure Devops,我有一个.NET Framework项目,它是在自托管Windows构建代理上构建的 运行测试需要一个步骤,该步骤需要提供代码覆盖率报告和统计数据 当我尝试使用“dotnettest”时,步骤运行,测试完成,也会生成.coverage文件。当我在构建摘要完成后检查它时,我会看到标准测试结果和报告,以及代码覆盖率选项卡。代码覆盖率选项卡有一个下载链接来获取文件。没有代码覆盖率报告。在初始构建摘要屏幕上还有一个指向“设置代码覆盖率”的链接 为什么没有代码覆盖率报告?为什么“设置代码覆盖率”链接仍然可
displayName: dotnet test
inputs:
command: test
arguments: '--configuration $(BuildConfiguration) --collect:"Code Coverage"'
workingDirectory: '$(Build.SourcesDirectory)\src'```
默认情况下,dotnet测试任务的代码覆盖率输出到.codecoverage文件,Azure DevOps不知道如何解释该文件,只提供为可下载文件。代码覆盖率选项卡仅支持
Jacoco
或Cobertura
格式的代码覆盖率数据。因此,*.coverage
文件的结果不能用表格和图形显示
如果需要更详细的代码覆盖率报告,则需要在.Net framework中使用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" }
然后添加<代码>发布代码覆盖率任务:
有关详细信息,您可以参考评论和本文中提到的案例。我最终通过使用Hugh Lin的答案寻求帮助并出于自己的目的进行修改来实现这一点 我们将Coverlet作为项目中的参考,并将ReportGenerator安装到Azure DevOps中,这样做会更容易一些 我发现SOAP API引用存在问题,导致生成报告时出现巨大的性能问题。一旦我用“类过滤器”将其过滤掉,这个过程就变得更容易管理了。我还发现,如果没有“disable.coverage.autogenerate”变量,“PublishCodeCoverageResults”任务将花费很长时间,并且可能会失败,因为它试图在没有“classfilters”的情况下自行执行“ReportGenerator”步骤。之所以这样做,是因为“ReportGenerator”现在内置在“PublishCodeCoverageResults”步骤中,但由于没有过滤器,因此在这种情况下不起作用 这是针对.NET Framework项目运行的,因此需要对项目进行一些调整,以确保“dotnet测试”成功运行
variables:
disable.coverage.autogenerate: 'true'
- task: DotNetCoreCLI@2
displayName: dotnet test
inputs:
command: test
publishTestResults: true
arguments: '/p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --no-restore'
workingDirectory: '$(Build.SourcesDirectory)\src'
configuration: "$(buildConfiguration)"
- task: reportgenerator@4
inputs:
reports: '$(Build.SourcesDirectory)\src\*.UnitTests\coverage.cobertura.xml'
targetdir: '$(Common.TestResultsDirectory)/CoverageReport/'
classfilters: '-NAMESPACE*'
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: '$(Build.SourcesDirectory)\src\*.UnitTests\coverage.cobertura.xml'
reportDirectory: '$(Common.TestResultsDirectory)/CoverageReport/'
这回答了你的问题吗?我要试一试。在使用coverlet之后,我昨天尝试了发布代码覆盖率任务,但运行它需要几个小时(实际时间)。它为项目中的每个类(数千个)创建了70mb的HTML文件。我怀疑这项任务现在已经完成了。我在GitHub repo for Azure DevOps任务中注意到,发布代码覆盖率任务已经存在多年了,并且有一个v2,但v2似乎并不公开。我放弃了!好几天没有收到您的回复,请您分享您关于此问题的最新信息好吗?我使用您的评论来帮助查找我遇到的问题,但最终以稍微不同的方式实现了这一点。