配置Scrutinizer后代码覆盖率显示NaN%,如何解决?
我之前也碰到过一模一样的情况,NaN%本质上是Scrutinizer要么没找到你的覆盖率文件,要么没法正常解析它。咱们一步步来排查解决:
先在本地验证覆盖率文件能否正常生成
先在你本地项目根目录执行一遍vendor/bin/phpunit --coverage-clover=some-file,跑完后检查some-file是否存在,打开看看里面有没有完整的XML结构(要有<coverage>标签,以及具体的类、方法覆盖数据)。如果本地都生成不了有效文件,那Scrutinizer肯定也拿不到数据——这时候得先解决PHPUnit本身的覆盖率生成问题,比如检查phpunit.xml里有没有正确配置覆盖范围,或者是不是有依赖缺失。核对Scrutinizer配置的文件路径
确保配置里file: 'some-file'的路径和PHPUnit实际生成的文件路径完全一致。Scrutinizer是在它的构建容器里执行命令的,相对路径的基准是项目根目录,如果你的PHPUnit命令是在子目录里运行的,那生成的文件路径也要对应调整,比如改成subdir/some-file。查看Scrutinizer的构建日志
这是最关键的一步!打开你的Scrutinizer项目页面,找到最近的构建记录,点进去看详细日志。你大概率会看到类似“无法读取覆盖率文件”“文件不存在”或者“XML格式错误”的提示——这些直接指向问题根源。比如如果日志说some-file不存在,那要么是PHPUnit命令没执行成功,要么就是路径写错了。确保构建时依赖被正确安装
如果Scrutinizer构建过程中没执行composer install,那vendor/bin/phpunit根本不存在,命令自然执行失败,不会生成覆盖率文件。可以在配置里加上依赖安装步骤:build: dependencies: override: - composer install --no-interaction --prefer-dist tests: override: - command: 'vendor/bin/phpunit --coverage-clover=some-file' coverage: file: 'some-file' format: 'clover'尝试调整配置的结构化写法
有时候Scrutinizer更适配结构化的phpunit配置,而非直接写命令,试试改成这种格式:build: tests: override: - phpunit: configuration: phpunit.xml.dist # 如果你有这个配置文件的话 coverage: file: coverage.xml format: clover这种写法能让Scrutinizer更清晰地处理覆盖率数据,减少路径或命令执行的潜在问题。
检查PHPUnit版本兼容性
某些旧版本的PHPUnit生成的Clover格式可能和Scrutinizer的解析器不兼容,试试把PHPUnit更新到对应PHP版本的稳定最新版(比如PHP 7.4对应PHPUnit 9.x,PHP 8.x对应PHPUnit 10.x),再重新构建试试。
按这些步骤排查下来,应该就能定位到问题,解决NaN%的显示异常了。
内容的提问来源于stack exchange,提问作者Babak no'doust

