ThinkPHP如何做自动化测试_接口测试数据与断言编写【教程】
作者:WeekendFlower
时间:2026-07-09
浏览:0
ThinkPHP6自动化测试使用PHPUnit配合Http门面模拟请求,通过Response对象的getCode()、getContent()等方法断言状态码、响应体及响应头。数据库测试需手动清空表或单独配置测试库,避免数据污染。框架不再提供封装测试基类,需采用原生PHPUnit写法。
做 ThinkPHP 6 接口自动化测试,核心就一条路——用 PHPUnit 配合 Http 门面模拟真实请求,拿到 Response 对象后,通过 getCode()、getContent() 这些方法去断言状态码、响应体内容和响应头。数据库测试就没那么省事了,要么手动清空表,要么单独配置测试专用库,总之不能让数据互相污染。

说起来,TP6 之后的自动化测试确实让不少人皱过眉头。框架不再提供封装好的测试基类,得回到原生 PHPUnit 写法。但别觉得麻烦,内建的 Http 门面和响应对象都还在,用对路之后反而比之前更可控——少了些黑盒子,多了些透明感。
用 Http::get/post 发起请求
以前 $this->get() 那种快捷方法在 TP6 里已经没了,现在所有请求都得显式调用 think\facade\Http:
- GET 请求直接写
$response = Http::get('/api/user/1'); - 要发 POST JSON,加上头信息:
$response = Http::withHeaders(['Content-Type' => 'application/json'])->post('/api/user', ['name' => 'Tom']); - 需要带 Cookie 或 Token?也简单:
Http::withCookie('PHPSESSID', 'abc123')->withHeader('Authorization', 'Bearer xxx')->get('/api/profile'); - 如果测试场景要求完整走一遍中间件链(比如鉴权、日志),那就不能跳过应用入口,推荐这样写:
App::make('http')->handle(Request::create('/api/test', 'GET'));
对响应做状态与内容断言
拿到的响应对象是 think\Response 实例,不是 PSR-7 标准对象,所以千万别用 getStatusCode()——这个方法是真不存在。正确的姿势是这样:
- 断言状态码:
$response->getCode() === 200或者$this->assertEquals(200, $response->getCode()); - 断言 JSON 响应体:先用
json_decode取数据,再逐个键值判断,比如$data = json_decode($response->getContent(), true); $this->assertArrayHasKey('id', $data); - 如果控制器直接返回字符串(比如
return 'ok';),用$this->assertEquals('ok', $response->getContent());就能校验 - 碰上重定向(302),既要验状态码也要验 Location 头:
$this->assertEquals(302, $response->getCode()); $this->assertEquals('https://example.com', $response->getHeader('Location'));
数据库测试前清空或重置数据
TP6 不再像旧版那样自动隔离测试数据库连接了。多个测试用例如果共用同一个库,稍不注意就会互相污染——这是很多团队踩过的坑。
- 最简单的办法:每次测试前手动清空表
Db::name('user')->delete(true);(true表示无条件清空) - 想做得更规范?用迁移回滚加数据填充:
php think migrate:rollback --step=1 && php think seed:run,然后在setUp()里统一执行 - 注意,别想着找
refreshDatabasetrait,那是 Lara vel 的专利,TP 没有原生支持,得自己封装 - 如果测试涉及删表这类敏感操作,强烈建议单独配一个测试专用数据库。在
database.php里把'default' => 'test'切过去,再配上独立的账号密码,这样最安全
常见断言写法对照(TP5 vs TP6)
从 TP5 升上来的人最头疼的就是那些老方法全废了——see()、seeJson(),一个都不剩。以下是常见写法的迁移对照:
- 原来
$this->visit('/api/test')->see('hello');→ 现在变成$response = Http::get('/api/test'); $this->assertStringContainsString('hello', $response->getContent()); - 原来
$this->seeJson(['code' => 0]);→ 现在手动解码 JSON:$data = json_decode($response->getContent(), true); $this->assertEquals(0, $data['code'] ?? null); - 原来
$this->assertResponseOk();→ 直接断言状态码:$this->assertEquals(200, $response->getCode()); - 检查响应头也是一样的路数:
$this->assertEquals('application/json', $response->getHeader('Content-Type'));
作者最新文章
赤友清理大师
2026-09-16 17:43
南邮光擎智算团队:GaN基Micro-LED光计算芯片从理论到流片的突破
2026-09-08 18:35
多张照片怎么合成PDF文件?三种图片转PDF工具怎么选?
2026-09-03 17:04
Excel转PDF防乱版指南:在线与本地双方案及排版检查
2026-09-03 10:04
多个PDF怎么合并成一个?合并后顺序怎么检查?
2026-09-02 19:54
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































