SonarQube 测试覆盖率 .NET 5

Posted

技术标签:

【中文标题】SonarQube 测试覆盖率 .NET 5【英文标题】:SonarQube test coverage .NET 5 【发布时间】:2021-07-09 05:19:45 【问题描述】:

我想在本地 SonarQube 实例(在 Windows 上)中显示 .NET 5 单元测试的测试覆盖率。

dotnet sonarscanner begin /k:"MyProject" /d:sonar.host.url="http://localhost:9000"  /d:sonar.login="<token>" /d:sonar.cs.opencover.reportsPaths="**\TestResults\*\*.xml"

dotnet build

dotnet test --no-build --collect:"XPlat Code Coverage"

dotnet sonarscanner end /d:sonar.login="<token>"

dotnet test 命令在&lt;TestProjectDir&gt;.TestResults\&lt;some-guid&gt;\ 文件夹中将覆盖率报告生成为coverage.cobertura.xml 文件。

在日志中,我可以看到以下警告: WARN: Could not import coverage report '&lt;MyTestProject&gt;\TestResults\a4af5812-7f80-469b-8876-3ea0c7c4c98d\coverage.cobertura.xml' because 'Missing root element &lt;CoverageSession&gt; in C:\Users\&lt;Path&gt;\TestResults\a4af5812-7f80-469b-8876-3ea0c7c4c98d\coverage.cobertura.xml at line 2'. Troubleshooting guide: https://community.sonarsource.com/t/37151

根据警告消息中的link,我可以看到只有 Visual Studio Code CoveragedotCoverOpenCover/Coverlet支持的。据我从他们的GitHub page 得知,OpenCover/Coverlet 是“XPlat 代码覆盖率”。

在我的测试项目中,安装了coverlet.collector NuGet 包 v 3.0.3。

我错过了什么?

我发现了这个相关问题:SonarQube: Unable to import test coverage 但它对我没有帮助,因为我无法使用 dotCover

【问题讨论】:

Coverlet 默认生成cobertura 格式的报告(如文件名所示) 【参考方案1】:

经过大量试验和错误,这是对我有用的解决方案。

我必须安装最新版本的 dotnet-sonarscannerdotnet-reportgenerator-globaltool 才能正常工作。我已经安装了报告生成器,但需要对其进行更新以使用 SonarQube 报告类型。

dotnet tool install --global dotnet-sonarscanner --version 5.2.0
dotnet tool update dotnet-reportgenerator-globaltool -g --version 4.8.7

使用reportgenerator,cobertura 文件可以转换为 SonarQube 格式。

dotnet sonarscanner begin /k:"MyProject" /d:sonar.host.url="http://localhost:9000"  /d:sonar.login="<token>" /d:sonar.coverageReportPaths=".\sonarqubecoverage\SonarQube.xml"

dotnet build

dotnet test --no-build --collect:"XPlat Code Coverage"

reportgenerator "-reports:*\TestResults\*\coverage.cobertura.xml" "-targetdir:sonarqubecoverage" "-reporttypes:SonarQube"

dotnet sonarscanner end /d:sonar.login="<token>"

报告生成器支持的文件格式:https://github.com/danielpalme/ReportGenerator#supported-input-and-output-file-formats

SonarQube 通用测试数据格式: https://docs.sonarqube.org/latest/analysis/generic-test/

【讨论】:

【参考方案2】:

我认为问题在于您正在尝试导入 opencover 测试,但测试采用 cobertura 格式。您可以为您的测试执行此命令:

dotnet test --no-build --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover

而且它可能会起作用。

【讨论】:

工作正常!这确实应该在官方 sonarqube 文档中提及

以上是关于SonarQube 测试覆盖率 .NET 5的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube + Jacoco - 无法读取 Koin 模块测试覆盖率

代码覆盖率:.NET 代码覆盖率和 SonarQube VSTS 集成

iOS单元测试-04-覆盖率上传sonarqube

Jacoco和SonarQube的测试覆盖率不一样

具有 android 测试和测试覆盖率的 sonarqube

SonarQube 没有从 lcov 读取 javascript 测试覆盖率