ThinkPHP 5.0 接口单元测试核心是模拟HTTP请求、隔离数据库、验证响应结构与状态;需继承think\testing\TestCase,禁用真实DB,用Mockery模拟模型与第三方服务,并通过withHeaders、assertStatus、assertJson等方法完成断言。

ThinkPHP 5.0 的接口开发配合单元测试,核心是模拟 HTTP 请求、隔离数据库、验证返回结构与状态。重点在于使用 think\testing\PHPUnit 基类、正确构造请求上下文、避免真实 DB 操作。
配置测试环境与基础类
确保已安装 phpunit 并在 tests/ 目录下创建基础测试类。推荐继承 ThinkPHP 提供的 think\testing\TestCase:
- 在
tests/TestCase.php中定义基础类,自动加载框架并初始化应用实例 - 重写
setUp()方法,调用$this->app = Factory::app();获取测试专用 App 实例 - 禁用真实数据库:在测试配置中将
database.type设为mock,或使用Mockery替换 Db 类
编写接口测试用例(以 GET /api/user/{id} 为例)
在 tests/controller/Api/UserControllerTest.php 中编写:
- 使用
$this->get('/api/user/1')发起模拟 GET 请求,自动处理路由和中间件 - 用
->assertStatus(200)断言响应状态码 - 用
->assertJson(['code' => 1, 'data' => ['id' => 1]])验证 JSON 结构与字段值 - 若需传参(如 token),通过
$this->withHeaders(['Authorization' => 'Bearer xxx'])添加请求头
模拟依赖与数据(绕过数据库)
接口逻辑若依赖模型查询,不应连接真实库:
立即学习“PHP免费学习笔记(深入)”;
- 用
Mockery::mock('think\Model')创建模型 mock,并设置期望返回值:->shouldReceive('find')->andReturn(new User(['id' => 1, 'name' => 'test'])) - 通过容器绑定替换原模型:
$this->app->bind('app\common\model\User', $mockUser) - 对第三方服务(如 Redis、HTTP 客户端),同样用 Mockery 或
Http::fake()(需自行封装适配)拦截调用
运行与调试技巧
执行测试时注意路径与环境隔离:
- 使用
vendor/bin/phpunit tests/controller/Api/UserControllerTest.php单独运行 - 在
phpunit.xml中设置TP_ENV=test环境变量,让配置自动加载config/test/下的覆盖文件 - 开启调试:在测试方法中插入
echo $response->getContent();查看原始响应内容 - 避免测试间污染:每个测试方法应独立,不依赖前一个的数据库状态;用
DatabaseMigrationstrait(需自行实现)清空测试表
不复杂但容易忽略的是请求上下文的完整性——中间件、全局过滤、多语言等都可能影响结果,测试前确认 app_debug 关闭、异常处理被正确捕获。



















