无尘阁日记

无尘阁日记

我想问下单元测到底是什么?作用是什么?跟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 保上线前自动检查。