商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > ThinkPHP如何做自动化测试_接口测试数据与断言编写【教程】

ThinkPHP如何做自动化测试_接口测试数据与断言编写【教程】

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

做 ThinkPHP 6 接口自动化测试,核心就一条路——用 PHPUnit 配合 Http 门面模拟真实请求,拿到 Response 对象后,通过 getCode()、getContent() 这些方法去断言状态码、响应体内容和响应头。数据库测试就没那么省事了,要么手动清空表,要么单独配置测试专用库,总之不能让数据互相污染。

ThinkPHP如何做自动化测试_接口测试数据与断言编写【教程】

说起来,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() 里统一执行
  • 注意,别想着找 refreshDatabase trait,那是 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'));
本文转载于:https://www.php.cn/faq/2411274.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注