覆盖率需显式启用并生成报告,PHP项目中须在phpunit.xml配置指定源码目录、启用HTML报告,且运行时需带--coverage参数或确保Xdebug已启用并配置xdebug.mode=coverage。

覆盖率不是自动显示的,必须显式启用并生成报告;默认不生成 HTML 报告,也不在控制台输出行覆盖详情。
phpunit.xml 里必须配置 和
只运行 phpunit 命令,哪怕测试全绿,也看不到任何覆盖率数字。关键在 tests/phpunit.xml 中补全两块:
-
指定哪些源码目录参与统计,比如../application/或../system/,漏掉application/models/就会导致模型代码不被计入 -
启用 HTML 报告,至少加一条:,否则build/coverage/index.html根本不会生成 - 如果用 ci-phpunit-test,注意它自带的
phpunit.xml可能没开,要手动补上,否则vendor/bin/phpunit -c tests/phpunit.xml什么报告都不会吐
运行命令要带 --coverage 参数或依赖配置
即使 phpunit.xml 配置正确,直接执行 phpunit 仍不会触发覆盖率收集。有两条路:
- 显式加参数:运行
vendor/bin/phpunit -c tests/phpunit.xml --coverage-html build/coverage(路径与中的target保持一致) - 或删掉命令里的
--coverage-html,完全依赖 XML 配置——但前提是已存在且未被注释 - 注意:Xdebug 必须启用(
zend_extension=xdebug.so),PHP 8.1+ 还得确认xdebug.mode=coverage,否则报No code coverage driver available
控制器测试中 $this->request->setCallable() 会干扰覆盖率
ci-phpunit-test 的控制器测试常通过 $this->request->setCallable() 模拟请求,但这个调用本身会插入额外的匿名函数调用栈,导致部分逻辑行被标记为“未执行”,尤其影响 __construct() 或前置钩子中的代码。
- 真实覆盖缺失时,优先检查是否用了
setCallable()而非resetInstance()+ 正常请求流程 - 若必须用
setCallable(),可在对应测试方法末尾加$this->resetInstance()清理状态,减少干扰 - 模型和库测试不受此影响,覆盖率更可信
HTML 报告打开后空白或 404?检查 build/ 目录权限和路径拼写
生成完 build/coverage/index.html 却打不开,常见原因不是 Xdebug 问题,而是路径或权限:
-
build/目录需存在且 Web 服务器用户(如 www-data)有读取权,否则浏览器访问时 403 - 路径写成
build/coverage,但实际生成在tests/build/coverage——看清楚target值是相对phpunit.xml所在位置还是当前工作目录 - 用 IDE(如 PHPStorm)直接点“Run with Coverage”时,它可能绕过
phpunit.xml,改用内置配置,此时需在 IDE 设置里单独勾选“Include source files”并指定application/路径
覆盖率数字容易误导人,特别是控制器里混着输出、重定向、异常处理时;真正该盯紧的是模型层的行覆盖,那里逻辑最集中,也最容易补全断言。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











