使用 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>
将项目明确标记为非测试项目。这将使扫描器分析项目,包括项目中的测试文件。
- 然后使用排除项忽略测试文件,这样它们就不会被分析。
.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>
将项目明确标记为非测试项目。这将使扫描器分析项目,包括项目中的测试文件。 - 然后使用排除项忽略测试文件,这样它们就不会被分析。