codeigniter中phpunit覆盖率需同时满足xdebug启用(xdebug.mode=coverage)、phpunit.xml配置和、命令带--coverage-html参数三者,缺一不可。

phpunit 在 CodeIgniter 中跑出覆盖率数字,不是“装好就能看”,而是必须手动打通三关:Xdebug 驱动、phpunit.xml 配置、命令执行方式。缺一不可,漏掉任意一个,build/coverage/index.html 就是空目录,或者控制台压根不显示百分比。
覆盖率不显示?先确认 Xdebug 是否真在干活
PHP 8.1+ 默认禁用 coverage 模式,光装 xdebug.so 不够。xdebug.mode 必须显式设为 coverage,否则会报错:No code coverage driver available。
- 检查 php.ini 或 xdebug.ini:确认有
zend_extension=xdebug.so且未被注释 - PHP 8.1+ 必须加这行:
xdebug.mode=coverage(不能只写xdebug.coverage_enable=1,那已废弃) - 运行
php -v和php --ri xdebug,输出里要看到Mode => coverage - 如果用 Docker,注意 CLI 和 FPM 的 php.ini 是分开的,测试用的是 CLI 配置
phpunit.xml 里这两块不补全,覆盖率就等于没开
phpunit.xml 不是摆设——它得同时满足两个条件,HTML 报告才会生成:
-
<filter></filter>必须包含你真正想测的源码路径,比如../application/;只写../system/就会导致控制器、模型全不计数 -
<logging></logging>至少有一条:<log type="coverage-html" target="build/coverage"></log>;ci-phpunit-test 自带的phpunit.xml往往没这行,得自己加 - 路径别写错:
target="build/coverage"要和你后续命令中指定的路径一致,否则报告生成到别处去了 - 如果
<filter></filter>里用了<exclude></exclude>,小心把Models/或Controllers/目录误排除了
运行命令不带 --coverage,覆盖率就只是个幻觉
即使 phpunit.xml 全配对,直接跑 vendor/bin/phpunit -c tests/phpunit.xml 也不会触发统计。必须显式启用:
- 推荐写法:
vendor/bin/phpunit -c tests/phpunit.xml --coverage-html build/coverage(--coverage-html参数优先级高于 XML 中的<logging></logging>) - 也可以删掉命令里的
--coverage-html,完全依赖 XML,但前提是<logging></logging>存在且未被注释,且target路径可写 - 别信 “测试绿了就覆盖全了”——绿色只代表断言通过,跟哪行被执行过毫无关系
- 生成后检查
build/coverage/index.html是否真实存在,权限是否允许 Web 服务器读取(常见 403 就是 www-data 没权限)
控制器测试里 setCallable() 会让覆盖率失真
用 $this->request->setCallable() 模拟请求很常见,但它会在调用栈里插入匿名函数,导致 __construct() 或前置钩子里的真实代码被标记为“未执行”。
- 这不是 bug,是副作用:setCallable() 插入的闭包占了行号,覆盖率工具误判逻辑未达
- 验证方法:改用
$this->resetInstance()+ 正常 HTTP 请求模拟(如$this->request->setMethod('GET')->setURI('/welcome')),再跑一次,对比覆盖率变化 - 若必须用
setCallable(),务必在测试末尾加$this->resetInstance()清理状态,减少跨测试污染 - 模型、库、辅助函数测试不受影响,它们的覆盖率数字更可信
build/coverage/index.html 看到的数字,永远只反映「当前配置下哪些文件被加载并执行过」,而不是「业务逻辑是否真的被验证充分」。最常被忽略的,是 ../application/ 没进 <filter></filter>,以及 PHP CLI 的 xdebug.mode 根本没生效——这两处一错,其他全白搭。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











