thinkphp7测试基类自动完成app初始化等12项动作,只需继承think\testing\testcase并实现createapplication()返回start.php路径;控制器测试用$this->get()/post()触发完整请求链路;数据库用refreshdatabase trait自动事务回滚;mock外部服务通过$this->mock()或app()->bind()拦截容器解析。

ThinkPHP7内置测试基类自动管理应用生命周期
原生PHP项目中每次写测试都要手动初始化Autoloader、加载配置、启动服务容器,而ThinkPHP7的think\testing\TestCase在setUp()阶段已自动完成App实例构建、数据库连接注册、事件监听器绑定等12项核心初始化动作。
你只需继承该基类,【createApplication()方法返回start.php路径即可触发完整框架启动流程】,无需再手动调用App::init()或Container::get()——漏掉任一环节都会导致模型查询报Call to a member function query() on null。
控制器测试直接模拟HTTP请求而非构造对象
原生PHP测试控制器需手动传入Request/Response对象并处理路由解析,ThinkPHP7提供$this->get()、$this->post()等链式方法,底层自动注入think\Request实例并走完整中间件→路由→控制器执行链路。
比如测试登录接口:$this->post('/api/login', ['username'=>'test','password'=>'123']),会真实触发TokenVerify中间件和LoginController::login()方法,响应体、状态码、Header全部可断言。
这一步操作起来很简单,直接把URL和参数传进去就行,但若改用new LoginController手动调用,中间件不会执行,Session无法写入,Auth门面不可用——所有依赖框架运行时环境的功能全部失效。
数据库状态通过RefreshDatabase一键重置
原生PHP单元测试要自己写事务回滚或truncate语句清理数据,ThinkPHP7只需在测试类中使用use RefreshDatabase; trait,每个测试方法执行前自动开启事务,方法结束时回滚,完全隔离测试间的数据污染。
第一步:在tests/TestCase.php中确认已引入use think\testing\middleware\RefreshDatabase;;
第二步:在具体测试类顶部声明use RefreshDatabase;;
第三步:运行测试时无需任何额外代码,数据库自动回到初始干净状态。注意:该机制仅对Db::和Model::操作生效,raw SQL执行后需手动DB::statement('TRUNCATE table')。
Mock外部服务无需修改业务代码
方法一:用$this->mock(AlipayService::class)替换容器中的服务实例,后续任何地方app()->make(AlipayService::class)都返回Mock对象;
方法二:在测试方法内调用app()->bind(AlipayService::class, MockAlipay::class),仅对当前测试生效;
原生PHP若想Mock支付网关,必须把服务实例作为构造参数注入控制器,否则只能改业务代码加判断分支——ThinkPHP7直接拦截容器解析过程,业务层完全无感。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











