如何实现一个mock平台

过去几年里一直在做产业平台订单业务相关的开发工作。随着上下游相关业务日渐增多,系统日趋复杂,在开发测试中经常会遇到如下两个问题:
  1. 要实现一个功能可能会需要协调几个甚至十来个业务方来完成联调测试数据的准备
  2. 多人或多团队合作时,开发进度不好协调,如果关键节点上的一环开发进度慢了就可能会影响到整个项目的进度

mock是解决以上问题的一个办法:

  1. 我们可以不找依赖方生产数据,需要什么数据我们自己mock一个就好了;
  2. 合作方没有开发完,那就约定好输入输出结构,先mock一个预期结果写死在代码中,自己凑合着开发。

很多时候我们都是这么做的。合作的测试同学甚至还提出过要求:让我在业务代码中插入一些造数据的代码以支持根据某个特定的传入参数返回指定的值,以便他们进行测试。

目前成熟的mock工具也着实有几个,比如mockito、gmock、spock等等。这几个mock工具各有其特点,但是使用场景通常只限于单元测试,在功能上算是一个开发校验工具,对测试同学的作用不大。此外不管是使用mock工具mock数据、还是使用硬编码mock数据都需要写代码(或者说存在代码侵入)。另外,因为是通过插入的硬编码来实现的数据mock,灵活性什么的是压根儿没法儿说的。

一个理想的mock工具该是什么样的呢?我觉得需要能满足如下的要求:

  1. 能够根据返回值类型mock数据(mock数据的基本要求)
  2. 在方法层mock数据,而不仅仅是在接口层mock数据
  3. 能够基于接口mock数据
  4. 能够根据不同的传入参数返回不同的值
  5. 可以根据不同的环境(dev,test,stg,prod)来开启或关闭mock能力
  6. 可以在方法层随时开启或关闭mock能力
  7. 可以界面化配置
  8. 低代码侵入或无代码侵入

其中第1、2项是mock数据的基础要求,第3项可以解决多个合作方开发进度不同步的问题,第4、5、6项是对mock能力的灵活性要求,第7、8项是易用性的要求。简而言之就是要灵活好用。

下面介绍一个实现这种mock工具的方案。在这个方案里我们需要如下几种组件:

  1. mock-server,独立部署的服务,提供可视化界面,管理方法元数据,维护mock信息等功能。
  2. mock-agent, 集成到项目里,负责实现方法代理,完成方法元数据解析,与mock-server通信等功能。
  3. 方法AOP,方法切面,用来标记要mock的方法,获取方法请求参数,反馈mock数据

三个组件的关系大致如下图:

通过这三个组件来mock数据的整体流程如下图:

看完流程后,期望中的mock工具(或者说mock平台)是什么样的已经很清晰了:

  1. 工程整体上可以分为两部分:一个独立的mock-server,以及可以嵌入到业务系统里的mock-agent。
  2. mock-server 是一个信息管理平台,可以提供界面化的方式来维护应用信息、方法信息、mock数据信息及mock规则信息、用户信息,这个还是相对比较简单的
  3. mock-agent 则承担了两种职责:实现方法切面、完成和mock-server的通信;在springboot生态中可以通过自定义的springboot starter来实现,core java系统中可以通过asm或者byte-buddy来实现;mock-agent的实现是比较麻烦的,因为被嵌入的项目各有不同,情况比较复杂,需要较高的兼容性,事实上我就是在解决了这一块儿后才确信了整体方案的可行性

至于再具体的功能细节和代码实现就不一一展开说了,如有兴趣可以参考我的开源项目 Mocko 。mocko这个项目就是基于以上思路来做的实现,目前仅是一个MVP(最小可行性产品)版本,待完善的地方还有很多,欢迎大家多提意见,也欢迎有兴趣的朋友一起合作开发。

END!!!

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据