一句话定义:录制回放测试(VCR / Cassette)是把第一次真实的外部调用请求与响应录成文件(通常叫 cassette,即"录像带"),之后的测试直接读文件回放,不再真的发请求。
打个比方
拍戏时请真人演员演一遍,全程实拍下来;之后每次排练就放录像带,演员跟着录像对口型。好处有三:不用每次把真人请来(不用真调外部 API、不排队不耗额度);不怕演员临时状态不好(不受网络抖动、限流、模型随机性影响);同一盘带子放一百遍,结果完全相同(可复现)。
在智能体里,录的是什么
不只是大模型 API 的那句回答,更重要的是工具调用(tool call):智能体决定调"查订单"接口、传了什么参数、接口返回了什么 JSON,全被记下来。回放时这些调用原样重现,智能体拿到与当时一字不差的输入,就能稳定跑完整条链路。对天生带随机性的 LLM 来说这点尤其值钱——否则同一个用例今天过、明天挂。
和相邻做法的区别
| 做法 | 数据来自哪 | 速度 | 稳定性 | 贴近真实程度 |
|---|---|---|---|---|
| 端到端真连 | 每次现调 | 慢 | 差 | 最高 |
| 手写 Mock | 人凭空编 | 快 | 好 | 看人想得全不全 |
| 录制回放 | 真实流量剪下来 | 快 | 好 | 高 |
关键差别在数据来源:手写 Mock 是"我以为接口会返回什么",容易漏掉真实世界里的怪换行、空字段、错误码;录制回放是从真实流量剪下来的,天然带着这些毛刺。它和快照测试(snapshot testing)也不是一回事:快照通常比对渲染输出,录制回放针对的是跨进程的调用本身。
对从业者的意义
CI 里几百条智能体用例能很快跑完,不再因为对方 API 一抖就全员红灯;线上出 bug,把那一次真实调用录下来,本地反复重放调试,省去苦苦复现的环节。代价是录像带会过期:对方接口改了字段、你的提示词(prompt)改了导致请求指纹对不上,缓存就命中不了。所以要设一个"禁止新录制"的开关,让 CI 只回放、不真连,否则测试会悄悄退化成真调用。另外,带子里可能夹着 API key、手机号、用户原话,提交前必须脱敏。这类工具在多个语言生态里都有实现,配置项叫法各异,以官方文档为准。
对普通人的意义
你用的产品如果做了这层测试,意味着每次改代码都会把你上次的真实操作重放一遍,回归问题发现得更快。反过来说,你那次请求可能被当成素材存了下来——所以"录之前先擦干净"是团队必须守的规矩。
