tp8单元测试必须用原生phpunit且phpunit.xml须置于根目录并配置bootstrap="vendor/autoload.php"和tests

TP8 的单元测试不走 php think test,必须用原生 phpunit 启动;没配好 phpunit.xml 或没放对位置,./vendor/bin/phpunit 会报 “no tests found” 或类加载失败。
phpunit.xml 放哪、怎么写才有效
文件必须放在项目根目录(和 app/、public/ 同级),不能塞进 app/tests 或 tests/Case 里。PHPUnit 默认只从当前工作目录找这个配置。
-
bootstrap="vendor/autoload.php"必须显式写上,否则Container::get()、模型类全报Class not found -
<directory suffix="Test.php">tests</directory>是底线配置,别漏掉suffix属性——TP8 只认*Test.php后缀 - 不用写
<source></source>,TP 的自动加载靠composer.json里的"autoload-dev": {"psr-4": {"tests\": "tests/"}},确认它存在 - 别复制旧项目里的
phpunit.xml.dist就完事,TP8 要求明确指定tests/目录,模糊路径如./tests在某些 PHP 版本下会失效
测试类命名与位置硬性规则
PHPUnit 不扫描路径或类名“差不多”的文件,只认严格匹配的三要素:路径、后缀、类名。
- 目录必须是根目录下的
tests/(不是app/tests或tests/unit) - 文件名必须以
Test.php结尾,例如UserModelTest.php - 类名必须和文件名完全一致,
UserModelTest.php里只能写class UserModelTest,写成UserTest或usermodeltest都会被跳过 - 继承必须是
PHPUnitFrameworkTestCase,TP6 文档里提过的think estingTestCase在 TP8 已弃用,用了会报Call to a member function bind() on null
Model 测试为什么 new User() 就报 query() on null
直接 new User() 绕过了容器初始化,模型内部的 $this->db 是 null,所有数据库操作都会崩。这不是代码写错了,是生命周期没走完。
- 要测带关联、自动时间戳、事件钩子的逻辑,必须用
hinkContainer::get(ppmodelUser::class) - 如果只是构造测试数据(不查库、不 save),用
User::make(['name' => 'test'])更轻量,它保留字段处理但不依赖容器 -
Container::get()默认不加载应用配置,测数据库前得在setUp()里补一句hinkApp::init(),否则Db::connect()找不到配置 - 别在测试里写
User::where()->find()——这跳过了模型实例,hidden、append、getAttr全部不生效
控制器测试不能直接调 $controller->index()
那样等于把路由解析、中间件、验证器、请求绑定全绕过去了,测出来的是个裸函数,CI 环境里根本发现不了中间件漏配或参数绑定失败的问题。
- 必须用
think estingMocker模拟 HTTP 请求:$this->mockRequest('GET', '/user/123') - 需要控制 header 或 cookie?手动构造:
$request = hinkacadeRequest::create('/user', 'POST', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer abc']); hinkApp::bind('request', $request); - 每个测试结束务必加
hinkacadeRequest::clear(),否则上一个测试的 request 数据会污染下一个 - 多域名场景下,
$_SERVER['HTTP_HOST']默认是localhost,得在setUp()里设:$_SERVER['HTTP_HOST'] = 'api.example.com';,测完unset($_SERVER['HTTP_HOST'])
最易被忽略的点:TP8 的测试环境默认不加载任何应用配置,连数据库连接都得手动触发 App::init();还有就是 phpunit.xml 里漏了 bootstrap,整个 autoload 就断了,连 TestCase 类都找不到——这种错误不会报具体类名,只说 “no tests found”,容易卡半天。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











