一句话定义:单元测试(Unit Test)只验证一个函数或模块自己的逻辑;集成测试(Integration Test)验证几个部件接起来后数据能不能对上;端到端测试(End-to-End Test,E2E)则从用户入口一路走到最终结果,验证"这件事用户真的能办成"。
打个比方:开一家餐厅。 单元测试是后厨逐项检查:这把刀快不快、这锅水会不会烧开、这个秤准不准。每项都单独测,几秒钟出结果,坏了立刻知道是哪一件。集成测试是看配菜、灶台、传菜口能不能衔接:配菜递过去,灶台收到的是不是它要的份量,传菜口拿到的菜名和桌号对不对。端到端测试是请一位顾客真的进门:点单、下单进后厨、出菜、上桌、买单,全程走完。
放到 AI 系统里更具体。写一个"从模型输出里抠出 JSON"的解析函数,喂它十几种畸形输入,看它是修复还是干净报错,这是单元测试,全部依赖换成假的,毫秒级。把向量检索、重排、拼 prompt 三步串起来跑一遍,检查检索到的文档确实进了 prompt、字段名没写错、空结果和超时被正确处理,这是集成测试,通常要连真实数据库,秒到分钟。打开页面输入问题、后端检索、调模型、把带出处的答案渲染出来,检查屏幕上真的出现了那段文字,这是端到端测试,要真模型、真浏览器,慢且脆。
| 单元测试 | 集成测试 | 端到端测试 | |
|---|---|---|---|
| 测什么 | 一个函数或模块的逻辑 | 部件之间的接口与数据流 | 用户完成一件事的整条路径 |
| 依赖 | 全部换成假对象 | 部分真实,常含真实数据库 | 全部真实,含真实模型和浏览器 |
| 速度 | 毫秒级 | 秒到分钟 | 分钟级甚至更久 |
| 失败后怎么查 | 基本能直接定位到行 | 要看是哪两个部件对不上 | 只能沿链路两头往中间二分 |
| 数量比例 | 最多 | 中等 | 很少 |
| 给人的信心 | "这块逻辑是对的" | "它们能接上" | "用户能用" |
和相邻概念的区别:三者不是难度分级,而是"测的范围"不同。单元测试的边界是函数,所以它对"系统能不能用"几乎不发言;端到端测试的边界是用户目标,所以它最接近真相,但一旦挂了,你只知道链路断了,不知道断在哪。中间的集成测试是最容易被跳过的一层,因为单元测试全绿、E2E 也偶尔跑通,人就以为没事了。
实际意义:三层缺一不可,而且比例大致是个金字塔。只写单元测试,你会得到"每个零件都合格、整车开不动";只写端到端测试,你会得到"改一行代码等半小时才知道砸没砸",然后大家开始跳过测试。实操上:新写一段逻辑先补单元测试;改动任何接口约定时补集成测试;把最常用、最赚钱的那几条用户路径写成少量但稳定的 E2E。AI 产品还有一个坑:模型输出本身不确定,不要把它塞进单元测试去断言具体文字,而是当外部依赖用固定假响应替代,真模型的验证留给上层。测试框架和工具怎么选,以官方文档为准。
