目录

传统接口录制为何难落地?Keploy 给出新答案

在测试领域,流量录制一直是一个“听起来很美好,但落地往往困难重重”的方向。

我体验了一段时间 Keploy 后,发现它可能是目前少数真正把“录制 → 回归”链路打通的工具,但目前网络上它好像有点低调,因此我专门写一篇文章。

一、传统流量录制方案是怎么做的

我这里所谓的流量录制,就是把真实线上或者测试环境的真实流量记录下来,清洗后成为测试用例,在需要回归时,在新代码上进行回放,然后对比请求返回的结果。传统的方案,无非“代理型”、“日志型”两种。

1.“代理型”

本质是在顶层网关记录通过的流量,一般记录 HTTP 的,也有在 tcp 层进行记录的。这种方式接入简单、无需侵入业务代码,但是看不到服务内部调用,对 gRPC、WebSocket 或者一些定制协议支持也比较复杂。

2.“日志型”

通过打日志的方式记录流量,在前端的网络请求函数打一个桩来记录也属于这种类型。

这种方式灵活、容易定制,但开发成本高、回放能力弱。

二、传统方案的核心问题

起码在我个人的工作经历中,没有遇到过能把流量录制做到“通解”的方案,最多在一些特定场景发挥比较好的作用。我认为主要是有以下几个核心问题:

1.服务运行高度依赖环境

工具只能记录 API 请求和响应,但真正的请求还依赖 MySQL 查询、Redis 缓存、MQ 消息、配置中心等等等等,环境不同时,回放一定失真。

2.测试数据不可复现

回放时,可能遇到数据库早已变更、用户状态已变化、时间戳失效、token过期、幂等校验失败等等问题,需要耗费大量心力清洗数据、适配逻辑。用例录下来了,但大量用例是跑不通的。

3.维护成本增长

有一个悖论:如果只录高价值、几乎不改动的核心接口,那为什么要用录制方案,直接白盒编写自动化代码可以把覆盖率提得很高,而且具有可解释性;如果录全量接口,测试库会迅速膨胀,而代码迭代会让大量历史用例快速腐坏,最终测试库越来越大,真正能用的越来越少,维护成本甚至高于手写自动化测试。有人可能会说,那形成一套稳定可用的清洗数据工作流不就行了,那你一定没干过这活,干过就知道有多难。

正因以上几个问题,录制往往沦为“存档”,而难以形成持续测试能力。当然,我再次重申,在一些特定场景,我确实曾经用录制方案达成过比较好的效果。

三、微服务架构下问题进一步放大

微服务架构特点:

  • 服务拆分多
  • 依赖复杂
  • RPC 调用链路长
  • 异步任务多
  • 状态分散

加剧了传统录制方案的缺点。

四、Keploy 工作原理

Keploy 也是录制真实 API 流量,但它还能录制例如 DB 查询、缓存查询等外部依赖,并自动与 API 匹配对应,生成测试用例,在回放时直接使用录制时录上的外部依赖调用结果。即,Keploy 最大的不同,是把重点从“录流量”变成“录环境”

流程:

  1. 启动应用并接入 Keploy
  2. 用户真实请求进入服务
  3. Keploy 捕获:
    • Request
    • Response
    • DB 查询
    • 外部依赖调用
  4. 自动生成:
    • Test Case
    • Mock 数据
  5. 后续版本自动回放验证

五、Keploy 解决了什么问题

1.接入成本极低

不用写代码,不用梳理业务逻辑,和“代理型”录制一样,直接正常使用应用即可。

2.屏蔽环境影响

你录制时候是什么环境,回放时候就是什么环境,甚至回放时候完全不需要依赖网络。

3.不怕数据变动

原本需要固化一些测试数据,例如账号、物料,不能随便改动,否则写用例时候读出来的数据和执行时候读出来的数据就不一样。但是 Keploy 的方案完全没有这个问题,读出来的数据以后直接就 mock 住,可以专心测代码逻辑。

但是,说一个但是,Keploy 方案更偏向于集成测试而不是端到端测试,其核心在测试单接口自己内部的逻辑,所以我认为适合做回归测试,在基线版本上进行录制,接口改动后执行,可以发现被改坏的老逻辑。

六、怎么落地

Keploy 的使用非常简单,比如项目启动命令是 python main.py,那么直接执行keploy record -c "python main.py"即可开始启动录制,录制结果会以人类可读的格式存储成文本,所以录制完成后还可以很方便地手动修改。当然,清洗工作还是要做的,不然录制下来的用例可能有很多不必要的重复。

Docker 环境也是同理。现在流行微服务架构,那么推荐使用 sidecar 接入,会很方便,然后接入 CI/CD 自动回归,定期或者随迭代维护基线版本。

七、与 AI 结合的展望

我认为, Keploy 的本质是“固定外部世界,只验证代码逻辑”,那么未来完全可能结合 AI 自动生成测试输入。

就是说,既然 Keploy 在回放时都是使用的 mock 数据,那么数据的真实性也许没有那么重要:一条真实数据和一条模拟数据,如果都能在代码里走一模一样的路径,那么对于测试代码逻辑来说,有什么区别?

AI 可以基于代码路径分析生成请求参数,结合 Keploy Mock 外部依赖,持续探索未覆盖逻辑区域。说人话就是,直接让 AI 阅读代码,让它自己构造输入数据,执行后检查代码覆盖情况,然后继续让 AI 修改输入数据、Keploy 的 mock 数据来尝试进入未覆盖的代码区域,从而不断提高覆盖率。

这意味着接口测试的一种方向未来可能从“录制真实流量”演变为“AI 自动生成高覆盖测试资产”。