PHPUnit生成Clover XML覆盖率报告时preprocessGrammar重复声明报错
问题根因
这个错误是由于phpunit开启覆盖率统计时,你的配置会扫描根目录下所有PHP文件(包括vendor目录下的第三方依赖文件),nikic/php-parser包中的phpyLang.php文件包含无命名空间的全局函数preprocessGrammar(),被覆盖率组件重复加载时就会触发重定义报错。
解决方法
- 调整phpunit.xml的覆盖率配置,优先指定需要统计的业务源码目录,同时排除不需要统计的第三方目录、缓存目录等,修改后的
<coverage>段配置如下:
<coverage processUncoveredFiles="true"> <include> <!-- 仅统计你自己的业务代码目录,比如src,不要直接写根目录. --> <directory suffix=".php">./src</directory> </include> <exclude> <!-- 强制排除第三方依赖目录 --> <directory suffix=".php">./vendor</directory> <!-- 其他不需要统计的目录也可以加在这里,比如缓存、测试目录等 --> <directory suffix=".php">./.phpunit.cache</directory> <directory suffix=".php">./tests</directory> </exclude> <report> <clover outputFile="phpunit.coverage.xml"/> </report> </coverage>
- 如果调整后仍报错,可以直接将
processUncoveredFiles参数改为false,关闭未覆盖文件的自动扫描,也可以规避重复加载的问题。 - 额外检查composer.json的autoload配置,确认没有手动引入
vendor/nikic/php-parser/grammar目录下的文件。
内容的提问来源于stack exchange,提问作者Oleg Dmitrochenko
相关产品推荐
相关产品推荐

