tp8已移除php think test命令,须用phpunit直接运行;测试类需置于tests/目录、以test结尾、继承phpunit\framework\testcase;model测试须通过container::get获取实例;控制器测试需用mocker模拟http请求,避免直接调用方法。

ThinkPHP 8 的单元测试不走 php think test,必须用原生 PHPUnit 启动;没配好 phpunit.xml 或没放对位置,./vendor/bin/phpunit 会报 “no tests found” 或类加载失败。
为什么 php think test 报错或没反应
TP8 官方已移除 think:test 命令。这不是你装错了插件,而是框架设计变更——测试彻底交还给 PHPUnit 管理。
- 执行
php think test时提示Command not found:正常,该命令不存在 - 执行后静默退出、无输出:大概率是
phpunit.xml缺失,或tests/目录下没有符合命名规范的测试类 - 报
Class 'PHPUnit\Framework\TestCase' not found:没装 PHPUnit,或phpunit.xml里没写bootstrap="vendor/autoload.php"
测试类怎么命名、放哪、怎么写
PHPUnit 不认路径和命名随意的文件。它只扫描 tests/ 目录下、类名以 Test 结尾、方法名以 test 开头的 public 方法。
- 目录必须是项目根目录下的
tests/(不是app/tests或tests/Case) - 文件名如
UserServiceTest.php,类名必须严格对应为UserServiceTest - 测试方法必须是
public function testShouldUpdateUser()这种形式,不能带参数、不能是protected - 继承
PHPUnit\Framework\TestCase,别用 TP6 旧文档里写的think\testing\TestCase(TP8 已弃用)
Model 测试为什么 save() 报 Call to a member function query() on null
直接 new User() 绕过了容器初始化,模型内部的 $this->db 是 null。TP8 的 Model 依赖容器注入数据库连接、事件系统等。
- 正确做法:
$user = \think\Container::get(\app\model\User::class);—— 拿到完整生命周期实例 - 如果只是构造数据不操作 DB,可用
User::make(['name' => 'test']),它跳过容器但保留时间戳、自动填充等逻辑 - 注意:
Container::get()默认不加载应用配置,测数据库需在setUp()里手动调用\think\App::init()或显式绑定\think\db\Connection - SQLite 内存库推荐:
sqlite::memory:,速度快、隔离性好,但建表得自己写DB::execute(),TP 不自动迁移
控制器测试不能直接 new Controller()->action()
那样调用等于跳过了整个 HTTP 生命周期:路由解析、中间件、验证器、请求绑定全失效,测出来的是“裸函数”,跟真实行为偏差极大。
- 用 TP8 内置的
think\testing\Mocker快速模拟:$this->mockRequest('GET', '/user/123') - 需要控制 header / cookie / body?手动 new
think\Request实例,再用think\facade\Request::bind($request) - 每个测试结束必须加
think\facade\Request::clear(),否则上一个测试设置的param或header会污染下一个 - 别在测试里调
$controller->index(),要走$this->get('/user')这类语义化方法(需配合think\testing\TestCase扩展,但 TP8 官方未内置,建议自封装或用原生 PHPUnit + Mocker)
最易被忽略的一点:TP8 的测试完全脱离框架命令体系,所有初始化、配置、清理都得手动接管。比如数据库事务回滚、中间件开关、Facade 绑定状态——这些都不会自动重置,靠的是你在 setUp() 和 tearDown() 里写清楚。漏掉一次 Request::clear() 或 DB::disconnect(),就可能让第 17 个测试莫名其妙失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











