我有一个 .Net Core 应用程序和单元测试用例。为此,我在 Azure DevOps 中配置了构建管道。在该管道中,我集成了 SonarQube 任务(准备分析、运行代码分析和发布质量门结果)。
运行成功后可以在SonarQube服务器看到报告。但是在那份报告中,我没有看到代码覆盖率结果和单元测试结果。即使我使用 Cobertura 进行单元测试。
您的管道似乎包含正确的步骤,因此可能存在两个问题:
验证代码覆盖率文件是否正确生成的最简单方法是将其发布为工件。现在检查输出文件的格式。如果没有输出文件,请检查您是否在测试命令中包含了
/p:CollectCoverage=true --logger trx
。如果您在 Linux 上运行构建管道,您还应该添加 /p:CoverletOutputFormat=opencover
并在 .NET 测试项目中安装 coverlet.collector NuGet 包。
如果您正确配置了第 1 步,仍然有可能生成的文件没有发送到 Sonarqube。查看问题所在的最佳方法是检查运行代码分析和发布质量门结果步骤的构建日志。
最常见的问题是 Sonarscanner 检查了错误的目录。在准备步骤中,请指定文件所在的位置,例如:
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/**/coverage.opencover.xml
sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/*.trx
Build pipeline 会生成代码覆盖文件,它是 coverlet 还是 opencover,问题是 Azure Devops pipeline 在构建代理的工作目录外创建报告,它使用 _work 内的 _temp 文件夹,而 soanrquube 在工作目录内搜索。我在使用 coverlet 和 Visual studio 覆盖工具时遇到了这个问题。您可以阅读以下2个线程 https://github.com/coverlet-coverage/coverlet/issues/1399
https://github.com/microsoft/azure-pipelines-tasks/issues/11536.
我在 snoarqube 社区网站上发布了一个问题,但到目前为止没有得到任何回应。我认为的解决方案是要么让构建管道中的测试步骤更改目录,要么配置一些 sonarqube 来搜索工作目录上方的代理构建目录 _temp
这里需要做两处改动
1.- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: 'tests/**/*.csproj'
arguments: '--collect "XPlat Code Coverage;Format=opencover"' # This is all you need to add!
说明:sonar不支持Cobertura格式,可以转成opencover格式
我有同样的问题,我现在才解决它。
参考链接https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/VSTestIntegration.md
- task: SonarQubePrepare@1
inputs:
SonarQube: 'SonarQube'
scannerMode: 'MSBuild'
projectKey: 'my-project-key'
projectName: 'my-project'
extraProperties: |
sonar.cs.opencover.reportsPaths=$(Agent.TempDirectory)/**/coverage.opencover.xml
解释:你明确地告诉生成报告的路径,否则 azure agent 不知道在哪里可以找到报告。