使用 sonarqube 跨多个项目文件进行代码覆盖分析

Code coverage analysis across multiple project files with sonarqube

.NET 中的常见模式是在单独的项目中进行单元测试,这似乎工作正常,但是,我们正在尝试实现一种模式,其中单元测试与实现一起存在于项目中。

尝试使用 coverlet 生成覆盖文件时,sonarscanner 工具正在接受多个文件,但未报告覆盖范围:

dotnet-sonarscanner /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml"
...    

dotnet test --configuration Release \
                    --no-build \
                    --no-restore \
                    --logger "trx;LogFileName=testresults.trx" \
                    /p:CollectCoverage=true \
                    /p:CoverletOutputFormat=opencover
...

INFO: Parsing the OpenCover report /root/app/src/./Project.Data/coverage.opencover.xml
INFO: Adding this code coverage report to the cache for later reuse: /root/app/src/./Project.Data/coverage.opencover.xml
INFO: Parsing the OpenCover report /root/app/src/./Project.WebAPI/coverage.opencover.xml
INFO: Adding this code coverage report to the cache for later reuse: /root/app/src/./Project.WebAPI/coverage.opencover.xml
INFO: Parsing the OpenCover report /root/app/src/./Project.Domain/coverage.opencover.xml
INFO: Adding this code coverage report to the cache for later reuse: /root/app/src/./Project.Domain/coverage.opencover.xml
WARN: The Code Coverage report doesn't contain any coverage data for the included files. For troubleshooting hints, please refer to https://docs.sonarqube.org/x/CoBh

所提供的 link 在这种情况下没有显示任何帮助,并且在项目文件中添加 DebugType Full(来自相关答案)不会产生不同的结果。

看看.sonarqube\out\ProjectInfo.log。这将告诉您每个项目是如何分类的。如果它被归类为测试项目,则不会上传覆盖范围。

MSBuild 扫描器使用许多标准来确定项目是否为测试项目,例如文件中列出的项目类型 guid 和项目功能 (see here)。如果您引用的是众所周知的测试框架,那么 Scanner 很可能会将整个项目确定为测试项目而不对其进行分析。

如果是这种情况,那么您可以按如下方式解决它:

  • 通过设置 MSBuild 属性 <SonarQubeTestProject>false</SonarQubeTestProject> 将项目明确标记为非测试项目。这将使扫描器分析项目,包括项目中的测试文件。
  • 然后使用排除项忽略测试文件,这样它们就不会被分析。