我有一个.NET Framework项目,该项目是在自托管的Windows构建代理上构建的。
有一个步骤可以运行测试,并且该步骤需要提供代码覆盖率报告和统计信息。
当我尝试使用“ dotnet测试”时,将运行该步骤并完成测试,还会生成.coverage文件。完成后检查构建摘要时,我会看到标准测试结果和报告以及“代码覆盖率”选项卡。代码覆盖率选项卡具有下载链接以获取文件。没有代码覆盖率报告。在初始构建摘要屏幕上,还有一个指向“设置代码覆盖率”的链接。
为什么没有代码覆盖率报告?为什么“设置代码覆盖率”链接仍然可见?
这真令人沮丧!我肯定会错过一些非常明显的东西,但是文档表明我所做的是正确的。
使用VSTest任务而不是dotnet测试可以得到相同的结果,但运行速度要慢得多。
displayName: dotnet test
inputs:
command: test
arguments: '--configuration $(BuildConfiguration) --collect:"Code Coverage"'
workingDirectory: '$(Build.SourcesDirectory)\src'```
答案 0 :(得分:1)
最终,我通过使用休·林(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/'
答案 1 :(得分:0)
默认情况下,dotnet测试任务的代码覆盖范围输出到.codecoverage文件,Azure DevOps不知道如何解释,而仅提供为可下载文件。 “代码覆盖率”选项卡仅支持Jacoco
或Cobertura
格式的代码覆盖率数据。因此*.coverage
文件的结果无法通过表格和图形显示。
如果要获取更详细的代码覆盖率报告,则需要在.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" }
然后添加Publish code coverage
任务:
有关详细信息,您可以参考注释中提到的案例以及此ticket。