You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:18:28