我想问下单元测到底是什么?作用是什么?跟postman、apifox测试的区别在哪里?
2026-05-06
可以这样理解:
单元测试是测试“代码内部某一个小零件是否正确”;Postman / Apifox 是测试“接口从外面访问起来是否正确”。
一、单元测试到底是什么?
单元测试,英文叫 Unit Test。
它测试的是一个很小的代码单元,比如:
一个函数 一个方法 一个类 一个 Service 一个计算逻辑 一个状态判断逻辑
举个例子,你有一个登录服务:
class AuthService
{
public function checkPassword($inputPassword, $realPassword)
{
return $inputPassword === $realPassword;
}
}单元测试就是单独测这个方法:
public function testCheckPassword()
{
$service = new AuthService();
$this->assertTrue($service->checkPassword('123456', '123456'));
$this->assertFalse($service->checkPassword('123456', 'abcdef'));
}它不关心浏览器,不关心接口地址,不关心 nginx,不关心数据库,重点是:
这个函数本身的逻辑对不对。
二、单元测试的作用是什么?
1. 防止你改 A 坏 B
比如你今天改登录接口,结果不小心把 token 生成逻辑改坏了。
如果有单元测试,执行:
composer test
马上能发现:
登录成功测试失败 token 生成测试失败 密码校验测试失败
它就像代码的报警器。
2. 给 AI 写代码加一道安全阀
你现在用通义灵码写代码,AI 很容易出现这种情况:
看起来写得挺像样 但细节逻辑是错的
单元测试可以帮你判断:
AI 写完代码 ↓ 跑测试 ↓ 测试通过,基本可信 ↓ 测试失败,说明 AI 改坏了某些逻辑
所以在 AI 编程时代,单元测试非常重要。
3. 让重构更安全
比如你把 Yii3 项目的登录逻辑从 Controller 里抽到 Service 里。
没有测试的时候,你会很慌:
我这样改,会不会把原来的登录搞坏?
有测试的时候,你可以直接跑:
composer test
只要测试通过,说明核心逻辑大概率没坏。
4. 把业务规则固定下来
比如你的系统规定:
密码错误返回登录失败 用户不存在返回登录失败 账号禁用不能登录 token 过期时间是 2 小时
这些规则都可以写成测试。
以后谁改代码,只要违反这些规则,测试就会失败。
三、它和 Postman / Apifox 有什么区别?
核心区别一句话:
单元测试测代码内部;Postman / Apifox 测接口外部。
可以这样看:
| 对比项 | 单元测试 | Postman / Apifox |
|---|---|---|
| 测试对象 | 函数、类、Service、方法 | HTTP 接口 |
| 测试位置 | 代码内部 | 系统外部 |
| 是否需要启动服务 | 通常不需要 | 通常需要 |
| 是否依赖接口地址 | 不依赖 | 依赖 |
| 是否依赖 nginx / 域名 | 不依赖 | 依赖 |
| 是否适合自动化 CI | 非常适合 | 也适合,但稍重 |
| 测试速度 | 快 | 相对慢 |
| 适合测什么 | 业务逻辑、计算规则、状态判断 | 接口连通性、请求参数、返回格式、完整流程 |
四、举个你 Yii3 登录接口的例子
你现在有接口:
POST /api/auth/login
Postman / Apifox 测的是这个
你在 Apifox 里请求:
{
"username": "admin",
"password": "123456"
}然后看接口返回:
{
"code": 200,
"message": "登录成功",
"data": {
"token": "xxx"
}
}这叫接口测试。
它测的是完整链路:
HTTP 请求 ↓ Nginx ↓ PHP ↓ Yii3 路由 ↓ Controller ↓ Service ↓ 数据库 ↓ 返回 JSON
单元测试测的是里面的小逻辑
比如你单独测试:
密码校验是否正确 token 生成是否正确 用户状态判断是否正确 登录失败返回码是否正确
它不一定真的发 HTTP 请求。
它可能直接调用:
$authService->login('admin', '123456');然后判断结果对不对。
五、用修车打个比方
Postman / Apifox 像是:
你坐进车里,踩油门,看车能不能跑。
单元测试像是:
把发动机、刹车片、火花塞、电瓶分别拿出来检查,每个零件是不是正常。
接口测试看的是:
整辆车跑不跑
单元测试看的是:
每个零件对不对
两个都重要,但位置不同。
六、你现在应该怎么用?
你现在项目刚开始,不要一下子搞太复杂。
建议这样分层:
第一层:单元测试
先测核心业务逻辑:
登录逻辑 密码校验 token 生成 参数校验 状态流转 金额计算 报告状态变更
比如以后你做诺明 OA 接口,就很适合测:
INIT 能不能变成 REVIEWING APPROVED 之后能不能再撤回 REJECTED 能不能重新提交 错误状态是否返回正确错误码
第二层:接口测试
用 Apifox / Postman 测:
接口能不能访问 参数传递是否正确 返回 JSON 是否符合文档 token 鉴权是否生效 数据库是否真的写入
第三层:CI 自动测试
以后每次 push 代码:
先跑单元测试 再跑接口测试 最后才部署
不过你刚开始,先做:
单元测试 + PHP 语法检查
就够了。
七、最简单记法
你就记这三句话:
单元测试:测代码里的一个小零件。 接口测试:测一个接口从外面调通不通。 CI/CD:把这些测试放到提交代码后的自动流程里。
更白话一点:
单元测试保代码逻辑不乱;Apifox 保接口调用不崩;CI/CD 保上线前自动检查。
发表评论: