Webman PHPUnit测试失败主因是tests/bootstrap.php未显式引入support/bootstrap.php,导致app()、config()等函数不可用;必须先加载vendor/autoload.php,再引入support/bootstrap.php,并在phpunit.xml中正确配置bootstrap路径为./tests/bootstrap.php。
Webman 的 PHPUnit 测试跑不起来,90% 是因为
没加载框架上下文,导致
、
、容器全不可用——这不是 PHPUnit 配置问题,是 Webman 启动链没接上。
tests/bootstrap.
php
必须桥接 support/bootstrap.php
只写
不够,
会报
。Webman 的初始化逻辑在
,必须显式引入:
放第一行,确保自动加载就绪
紧跟着
,触发 Config 加载、容器注册、Bootstrap 类
可选但推荐:加
,避免开发环境配置干扰测试行为
别在
里重复调用
或遍历
——
已做完这些
phpunit.xml 的 bootstrap 和 directory 路径必须精确
路径错一个字符,PHPUnit 就找不到引导文件或误扫 bootstrap.php 自身,报
:
值是相对路径,从
所在位置(项目根目录)算起,正确写法是
,不是
(少
)或
(多
)
别写成
,否则会把
当测试类加载;应限定为
或
,按类型分目录
和
务必设为
,否则 Webman 容器单例状态被重置,后续测试全挂
Controller 测试不能 new,必须抽离 Service 或 mock Request
直接
会崩在
,因为 Controller 依赖
、
和容器注入:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
优先方案:把业务逻辑从 Controller 移到独立
类,对 Service 写纯单元测试——这才是可维护、可复用的测试
若必须测 Controller 行为:用
构造请求对象,再通过
获取容器托管实例(确保 bootstrap 已执行)
绝对避免在测试中调用
,它会启动完整 HTTP 生命周期,引入路由、中间件、响应输出等不可控副作用
测试数据库操作时,用
trait 或手动
/
,防止测试污染数据
Docker + PHPStorm 调试时 Remote Path 别乱填
在 Docker 容器里跑测试总报
,大概率是 PHPStorm 的 Path mappings 配置反向搞错了:
CLI Interpreter → Path mappings 中,
栏位**必须留空**(不是填
或项目路径)
只填
指向宿主机项目根目录,且确认容器内
与之完全一致(如都是
)
填了
会导致 PhpStorm 把本地路径错误映射成容器内不存在的路径,自动加载失败
PHP 8.5.5 对路径解析更严格,这类映射错误在该版本下更容易暴露
最常被忽略的是:Webman 的测试不是“写完 Test 类就能跑”,而是整个初始化链要手工接通。哪怕只漏掉
这一行,后面所有
、
、
调用都会静默失效——错误不报在测试里,而报在你调用它们的那一行。
bootstrap.phpapp()config()require_once __DIR__ . '/../vendor/autoload.php'app()Call to undefined function app()support/bootstrap.phprequire_once __DIR__ . '/../vendor/autoload.php'require_once __DIR__ . '/../support/bootstrap.php'::start()$_ENV['APP_ENV'] = 'testing'tests/bootstrap.phpWebman\Config::load()config('bootstrap')support/bootstrap.phpCannot declare class Bootstrapbootstrapphpunit.xml./tests/bootstrap.phptests/bootstrap.php./../tests/bootstrap.php.././testsbootstrap.php./tests/unit./tests/httpbackupGlobalsprocessIsolationfalsenew YourControllerCall to a member function input() on nullRequestResponseService$this->createMock(Webman\Http\Request::class)app()->make(YourController::class)Route::dispatch()DatabaseTransactionsDB::beginTransaction()rollback()Class not foundRemote path/var/wwwLocal pathWORKDIR/var/wwwRemote pathsupport/bootstrap.phpapp()db()event()