SonarCloud代码覆盖率始终显示0%问题排查求助
排查SonarCloud代码覆盖率显示0%的解决方案(Bitbucket Cloud + Laravel 11 + PCOV环境)
先确认
coverage.xml本身是否有效- 直接打开生成的
coverage.xml,查看里面的<file>节点是否存在line-rate不为0的条目——如果整个报告全是0,问题出在PHPUnit/PCOV环节,和SonarCloud无关 - 验证PCOV是否正常启用:执行
php -m | grep pcov,输出包含pcov说明扩展已安装;PHPUnit执行时加--verbose参数,日志里需出现“Using PCOV for code coverage”提示,没有则说明PCOV未生效
- 直接打开生成的
核对路径映射是否匹配
- 检查
coverage.xml里<file>标签的name属性,若为绝对路径(如/home/user/project/app/xxx.php),SonarCloud可能无法识别,需改为相对项目根目录的路径(如app/xxx.php) - 在phpunit.xml中添加
processUncoveredFilesFromWhitelist="true",确保未被测试覆盖的文件也能纳入报告 - 在SonarScanner里明确指定
sonar.sources,比如sonar.sources=app,src,避免SonarCloud误判源码目录
- 检查
排查SonarCloud配置细节
- 再次核对
sonar.php.coverage.reportPaths的路径,必须是相对于SonarScanner执行目录的路径——若coverage.xml在项目根目录则写coverage.xml,在build文件夹则写build/coverage.xml - 进入SonarCloud项目的「分析范围」设置,检查排除规则,确保没有误排除
app/这类源码目录 - 查看SonarScanner完整日志,除了“Imported coverage report”,还要留意是否有“所有文件都被排除,不会保存覆盖率信息”这类提示,出现则说明排除规则有问题
- 再次核对
调整PHPUnit覆盖率配置
- 确保phpunit.xml的
<filter>配置正确,示例:<filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> <directory suffix=".php">./src</directory> <exclude> <directory suffix=".php">./app/Http/Controllers/API</directory> <!-- 按需添加无需统计的目录 --> </exclude> </whitelist> </filter> - 生成覆盖率时明确指定配置文件:
php artisan test --coverage-clover=coverage.xml --configuration=phpunit.xml,避免PHPUnit使用默认配置导致异常
- 确保phpunit.xml的
Bitbucket Cloud CI环境特殊检查
- 确保Pipeline中生成coverage.xml和执行SonarScanner的步骤在同一工作目录,或路径传递正确
- 添加步骤打印coverage.xml的前几十行内容,确认文件已生成且包含实际覆盖率数据
- 检查文件权限,确保SonarScanner能正常读取coverage.xml
内容的提问来源于stack exchange,提问作者Kevin Pimentel
相关产品推荐
相关产品推荐

