江湖郎中,你要吗?
不知道说到江湖郎中,大家会想到什么。很多人可能就要联想到自己一些悲催的伤心往事,之前有同事就曾经被江湖郎中欺骗,买了很多茶叶,往事不堪回首。
今天我其实想和大家聊的话题是mountebank,为什么mountebank会和江湖郎中联系在一起呢? 因为mountebank直译的话就是“江湖郎中,骗子”, mountebank官方的图中给出的图片也很有意思,也是一个人拿着一瓶药,一副“我有药,你要吗” 的形象,如下图:
什么是江湖郎中?
Mountebank其实就是提供假的API的一个工具,其实光看字面意思也很好理解。他是第一个开源的能够提供跨平台,支持的多协议的一个工具,而且使用起来也很简单,只要把你的端口指向mountebank就可以了。 Mountebank通过配置一个或者多个imposters文件,唯一需要注意的是各个imposter的监控端口不可重复,否则会有一个imposter不会被加载。
为什么要搭建自己的mock server?
可能很多人就要问,现在不都已经开始流行契约测试了吗? 契约即为mock,那为什么还要专门的mock services呢。主要原因是需要和第三去集成,比如之前我们和银行系统集成,和SAP系统集成。这个时候其实并不需要用到契约测试,契约测试一般用于微服务架构,或者前后端分离开发。而Mock一般仅仅只是为了模拟第三方的系统,是更加轻量级的架构。
在我们当前的项目中就同时用到了契约测试(pact)和MockServer(Mountbank)。整体项目架构是WEB->BFF->Platform(微服务)->SAP(客户的第三方系统)。契约测试主要是运用于前端分离开发(BFF和platform之间),以及platform的微服务之间,而Mountbank主要是用来模拟SAP系统。
考虑到了一下几个方面,我们决定使用mock server:
1. 首先是我们需要一个mock sever,客户的SAP测试系统是一个第三方的系统,不仅极不稳定,这些都是短期内很难去和客户协调解决的问题,而且我们只有读的权限,并没有写的权限。导致我们在开发platform的过程中不能很好的和SAP集成,影响开发进度。
2. 其次,是关于持续集成,当我们做完开发,pipline需要执行所有的测试,其中包括与SAP的集成测试,试想如果SAP不稳定,那么集成测试很多时候都会因为这个失败,怎样去做持续集成;即使是SAP变的稳定了,还有另外一个棘手的问题就是,我们当前只有读的权限,如何在SAP里面创建我们所需要的测试数据,以得到我们期望的测试结果?
综合这些原因所以我们决定搭建自己的mock server。
为何我们选择了Mountbank
其实还有很多工具都和Mountbank又类似的功能,比如很常见的moco,也能够提供类似的服务,为何选择了mountbank呢?
1. 首先我们是在客户的环境里搭建mock server,客户的docker镜像有各种各样的限制,很多软件或者工具都不能再里面安装,mountbank在这方面有天然的优势,他为不同的系统提供binary的包,只需要把binary的包考到相应的环境里,不需要任何安装的步骤,非常方便。当然如果想安装,他也提供了非常方便的安装方式。
2. Mountbank是第一个开源的工具,并且支持多系统,多协议的工具。选择Mountbank也是考虑到项目可能会用到不同的协议。
3. 还有一些其他的原因,比如mountbank提供了录制,回放等一些列方便功能,以及丰富的predicate定义,使得我们能够更加灵活的构建我们的mock server。
Mountebank的具体用法
关于Mountebank的具体用法,我个人觉得最主要的两点就是predicates和responds:
Mountebank提供了很丰富的predicates,比如equals,deepEquals,contains,startsWith,endWith,可以很方便在Json文件里面进行定义,下面例子的predicates,就定义了必须是“get方法”,路径必须为“/sap/opu/odata/sap/ZHELLO_SRV/DeveloperSet”,而且query必须是"sap-language":"EN",才能获得相应的response。如果想知道某一种predicates的具体用法,详见 http://www.mbtest.org/docs/api/predicates
Responds就相对来说容易理解一些,当满足了predicates之后,才能得到相应的response,就像下面的情况,当body里面有email和password,并且是Post的方法,且满足path为/Apitesting/v1/test?type=ResponseTwo,才能得到200的response,并且返回相应的body。
关于一些其他的用法,官方文档已经将的很详细了,大家可以详见http://www.mbtest.org/。
当前Mountebank在我们项目中已经开始运用,并且已经集成到CI,但是现在对于分支策略还在进一步的讨论,我也会持续去更新本文。
希望再提到江湖郎中时,大家不仅仅想到的是某些伤心过往,”江湖郎中“在某些情况下还真的能够药到病除。