如何将.coverage文件上传至SonarCloud展示代码覆盖率
你遇到的覆盖率为0的问题有两个核心原因:
- 你通过
--collect "Code Coverage"生成的.coverage是微软专有二进制格式,SonarCloud无法直接解析 - 你没有在sonarscanner的begin阶段声明覆盖率报告的路径和对应格式,扫描器不会主动识别未声明的覆盖率文件
以下是两种可落地的解决方法:
方案一:使用Coverlet生成SonarCloud兼容的覆盖率报告(推荐)
- 第一步:给所有单元测试项目安装两个NuGet包:
Coverlet.MSBuild、Coverlet.Collector - 第二步:使用修正后的命令序列执行扫描:
# begin阶段声明opencover格式的覆盖率报告路径 dotnet sonarscanner begin /k:"project-key" /d:sonar.login="myToken" /o:"myOrg" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" # 构建解决方案 dotnet build "myPathTo.sln" # 执行测试并生成opencover格式的覆盖率报告,加--no-build避免重复构建 dotnet test --no-build /p:CollectCoverage=true /p:CoverletOutputFormat=opencover # 结束扫描 dotnet sonarscanner end /d:sonar.login="myToken"
方案二:转换原生.coverage文件为可识别的XML格式
如果你不想引入Coverlet依赖,可以把生成的二进制.coverage文件转换为Sonar支持的XML格式:
- 第一步:全局安装dotnet-coverage工具:
dotnet tool install --global dotnet-coverage - 第二步:使用修正后的命令序列执行扫描:
# begin阶段声明vs coverage xml格式的报告路径 dotnet sonarscanner begin /k:"project-key" /d:sonar.login="myToken" /o:"myOrg" /d:sonar.cs.vscoveragexml.reportsPaths="**/coverage.xml" # 构建解决方案 dotnet build "myPathTo.sln" # 生成原生.coverage文件 dotnet test --collect "Code Coverage" # 转换二进制.coverage为xml格式,把<path-to-generated-.coverage>替换为你实际生成的.coverage文件路径 dotnet coverage convert <path-to-generated-.coverage> --output-format xml --output coverage.xml # 结束扫描 dotnet sonarscanner end /d:sonar.login="myToken"
其他注意事项
- 确保你的业务代码项目的
DebugType属性设置为Portable或者Full,否则覆盖率采集会出现异常 - SonarCloud默认会自动排除单元测试项目的代码,不需要手动添加过滤规则,避免误过滤业务代码
- 如果你有多个测试项目,不需要单独合并报告,SonarScanner会自动聚合所有匹配路径的覆盖率文件
内容的提问来源于stack exchange,提问作者Miguel Vale
相关产品推荐
相关产品推荐

