C# 显示NUnit测试Azure DevOps上的代码覆盖率
我已经在Azure DevOps上设置了一个新的管道,用于构建和运行项目测试。测试是用NUnit编写的 在管道中,我正在使用C# 显示NUnit测试Azure DevOps上的代码覆盖率,c#,azure-devops,nunit,C#,Azure Devops,Nunit,我已经在Azure DevOps上设置了一个新的管道,用于构建和运行项目测试。测试是用NUnit编写的 在管道中,我正在使用VSTest@2task运行单元测试,我将codeCoverageEnabled添加到true 最后管道运行,当我进入作业的“代码覆盖率”选项卡时,它允许我下载.codecoverage文件,但它不会在选项卡中显示其内容。我的理解是这应该发生 我怎样才能解决这个问题 感谢默认情况下,VSTest任务的代码覆盖率将输出到.codecoverage文件,Azure DevOps
VSTest@2
task运行单元测试,我将codeCoverageEnabled
添加到true
最后管道运行,当我进入作业的“代码覆盖率”选项卡时,它允许我下载.codecoverage
文件,但它不会在选项卡中显示其内容。我的理解是这应该发生
我怎样才能解决这个问题
感谢默认情况下,VSTest任务的代码覆盖率将输出到
.codecoverage
文件,Azure DevOps不知道如何解释该文件,仅作为可下载文件提供。您需要使用一些DotNetCoreCLI
任务,并能够在azure管道中的“代码覆盖率”选项卡上显示代码覆盖率结果
所以,如果您使用的是.NETCore,那么有一种方法可以做到这一点
步骤1
在测试项目中添加Coverlet.collector
nuget包
步骤2
更改您的azure pipelines.yml
以包含以下代码覆盖范围:
如果您有CodeCoverage.runsettings
文件中的任何设置,也可以保留它们
- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/*.Tests/*.csproj'
arguments: -c $(BuildConfiguration) --collect:"XPlat Code Coverage" -- RunConfiguration.DisableAppDomain=true
testRunTitle: 'Run Test and collect Coverage'
displayName: 'Running tests'
- task: DotNetCoreCLI@2
inputs:
command: custom
custom: tool
arguments: install --tool-path . dotnet-reportgenerator-globaltool
displayName: Install ReportGenerator tool
- script: reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"
displayName: Create reports
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: $(Build.SourcesDirectory)/coverlet/reports/Cobertura.xml
上述代码还需要注意的一点是。根据您使用的.net core版本,可能需要获得不同版本的工具
更多信息也可以在上找到,我还不明白为什么,但似乎我无法使用
dotnet
二进制文件进行构建。但如果我理解正确,我需要使用coverlet将.codecoverage文件转换为Cobertura格式,以便正确显示代码覆盖率?coverlet是实现这一功能的重要元素,但不是唯一已知的方法。由于您无法访问dotnet
,因此我假定您在.Net Framework上。您也可以尝试其他方法,例如或为报表生成器输入,但我没有这些经验。我刚刚收到有关此问题的警报,我意识到我没有对您的详细回答表示感谢。。。所以谢谢你,伙计D没有机会回顾这一点,但肯定会的。仅供参考:我能够使用msbuild任务来构建框架项目,然后调用上述任务来运行测试并获得代码覆盖率。这不是很理想,但它确实为我完成了工作。