根本原因是路径或权限问题,非代码错误;需检查是否在项目根目录执行命令、coverage-report目录是否Web可读、Xdebug/PCOV是否启用;业务代码须手动加入phpunit.xml.dist的并指定suffix=".php";高覆盖率不等于高测试质量,应重点排查标红函数、标黄分支及未出现的业务目录。

覆盖率报告空白或报 Failed to load resource
根本原因几乎总是路径或权限问题,不是代码写错了。生成命令看似成功,但打开 coverage-report/index.html 是白页或控制台报 Failed to load resource,先检查三件事:
- 执行
./vendor/bin/phpunit --coverage-html coverage-report时,是否在项目根目录(即有phpunit.xml.dist的位置)?不在根目录会导致配置未加载、路径解析错乱 -
coverage-report/目录是否对 Web 服务器可读?若用 PHP 内置服务器访问,不能双击打开 HTML,必须用php -S localhost:8000 -t coverage-report - PHP 是否真启用了 Xdebug 或 PCOV?运行
php --ri xdebug看输出里有没有Enabled;若用 PCOV,运行php -m | grep pcov确认已加载
覆盖率报告里全是 framework/ 目录,业务代码没出现
Yii 2 默认只分析 framework/ 下的文件,你自己的 common/models/、modules/api/controllers/ 等完全不会被扫描——除非手动加进 phpunit.xml.dist 的 。
-
必须带完整路径前缀和suffix=".php",例如:,漏掉common/models suffix就不识别 -
不递归,想排除tests/helpers/,就得单独加一行:tests/helpers - 用了
yii2-app-advanced模板?console/和backend/的代码默认也不在范围内,得分别加
覆盖率数值高,但关键逻辑实际没跑
行覆盖率达 90% ≠ 测试质量高。Yii 中大量短路逻辑、条件赋值、?: 表达式容易造成「假阳性」分支覆盖。
-
if ($model->status === self::STATUS_ACTIVE || $user->isAdmin):覆盖率可能标绿,但只测了$user->isAdmin === true,左边分支根本没走 -
return $this->getRelation('profile') ?: new Profile();:new Profile()只在关联为空时执行,极易遗漏 - 模型钩子如
beforeSave、afterFind、验证规则里的filter或when回调,常因测试数据构造不全而跳过
Xdebug 驱动类找不到报错
PHP 8.2 下运行覆盖率命令报 Class "SebastianBergmann\CodeCoverage\Driver\Xdebug2Driver" not found,说明 PHPUnit 找不到兼容的 Xdebug 驱动。
- 不是版本装错了,而是 Xdebug 未启用:运行
php -v看输出末尾有没有with Xdebug v3.x;没有就说明扩展没加载 - Xdebug 3 要求
xdebug.mode=coverage,不是旧版的xdebug.coverage_enable=1;确认php.ini里是前者 - 如果用 PCOV,确保
pcov.enabled=1且没和其他覆盖率扩展冲突(比如同时启了 Xdebug 和 PCOV)
真正要盯住的不是百分比数字,而是 HTML 报告里那些标红的函数名、标黄的 if 行、以及压根没出现在文件列表里的业务目录——这些地方,往往藏着没触发的验证分支、没走到的钩子、和永远构造不出的异常路径。











