如何在PHP中使用代理类生成准确的单元覆盖率报告?
解决Hyperf代理类导致PHPUnit代码覆盖率不准确的问题
核心思路
让PHPUnit将代理类的执行记录映射回原始类,而非直接统计代理类的覆盖率。
具体方案
1. 配置PHPUnit的覆盖率过滤规则
在phpunit.xml中添加过滤规则,排除代理类目录,确保原始类被正确纳入统计范围:
<filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> <!-- 你的业务代码根目录 --> <exclude> <directory suffix=".php">./runtime/container/proxy</directory> <!-- 排除代理类生成目录 --> </exclude> </whitelist> </filter>
2. 使用Hyperf自带的覆盖率桥接脚本
Hyperf针对该场景提供了专门的处理脚本,运行PHPUnit时通过--bootstrap参数加载即可自动完成代理类到原始类的执行数据映射:
phpunit --bootstrap vendor/hyperf/testing/src/Coverage/bootstrap.php
3. 测试环境临时禁用代理类生成
若上述方案未生效,可在测试环境配置中关闭代理类生成功能(注意:会影响Inject注解的自动注入,需手动处理测试用例的依赖):
修改config/autoload/proxy.php:
return [ 'enable' => false, ];
4. 临时调整Composer类映射(备选方案)
测试前强制Composer加载原始类而非代理类,测试完成后恢复:
# 临时更新类映射,排除代理类 composer dump-autoload --no-dev # 运行测试 phpunit # 恢复原类映射 composer dump-autoload
验证方式
运行测试后查看覆盖率报告,检查commonController.php的覆盖率数据是否与代码实际执行情况匹配,确认代理类的执行记录已正确映射到原始类。
内容的提问来源于stack exchange,提问作者zds
相关产品推荐
相关产品推荐

