覆盖率需显式启用扩展、正确配置路径、执行带参数命令三者缺一不可;常见错误包括未启用Xdebug/pcov、filter路径错误、未传--coverage-html参数及阈值校验基于coverage.xml精确值。

覆盖率不是“装了PHPUnit就能出”,而是必须显式启用、路径配对、扩展就位,三者缺一不可。
phpunit --coverage-html 报错“no code coverage driver available”
这是最常被当成 PHPUnit 配置问题的环境缺失错误。PHPUnit 本身不生成覆盖率数据,它只调用底层驱动——而默认情况下,Xdebug 或 pcov 都没启用。
- 先确认 PHP 是否加载了覆盖率扩展:
php -m | grep -E 'xdebug|pcov';没有输出就说明没装或没启 - Xdebug ≥ 3.1 推荐用
xdebug.mode=coverage(不是 old-style 的xdebug.coverage_enable=1) - PHP ≥ 8.0 且不想装 Xdebug?改用
pcov:运行pecl install pcov,然后在php.ini加extension=pcov.so和pcov.enabled=1 - CI 环境(如 GitHub Actions)里记得显式安装扩展,光有
phpunit/phpunit包没用
覆盖率报告里 src/ 目录全标为“未执行”,但测试明明跑过了
这说明 PHPUnit 知道哪些文件该测,但没把它们和实际执行的代码路径对上——通常是 <filter></filter> 配置漏了或写错了。
- 确保
phpunit.xml里有完整的<filter></filter>块,且<directory></directory>指向你的真实源码路径,例如:<directory>src/</directory> - 别用相对路径如
./src,PHPUnit 解析时容易出错;统一用src/ - 如果用了 PSR-4 自动加载,
<whitelist></whitelist>不再自动推导命名空间,必须手动列目录或加<file></file>条目 - 运行命令时别漏掉
--coverage-html coverage参数,只跑./vendor/bin/phpunit是不会触发覆盖率收集的
thor-juhasz/phpunit-coverage-check 提示“Coverage below threshold”但报告里数字看起来达标
这个工具读的是 PHPUnit 生成的原始 XML(coverage.xml),不是 HTML 页面里的四舍五入值。它校验的是精确到小数点后两位的行覆盖率(lines-covered / lines-total)。
立即学习“PHP免费学习笔记(深入)”;
- 检查
coverage.xml文件里<project></project>节点下的line-rate属性值,比如0.7932就算 79.32%,低于 80% 就会失败 - 在
composer.json的scripts里加一行:"coverage:check": "phpunit-coverage-check --min-line-coverage=80",避免手敲参数出错 - 注意:它默认只检查
<file></file>下的源码,不包含 tests/ 或 vendor/,所以阈值是针对你<whitelist></whitelist>里的代码算的
最容易被忽略的其实是 phpunit.xml 里 bootstrap 和 <filter></filter> 的耦合关系——bootstrap 文件若提前 require 了未覆盖的类,或 filter 路径和 autoload-dev 映射不一致,覆盖率数字就会失真。别只盯着“有没有报告”,先确认“报的是谁的告”。



















