Mock Server的一个实现:Moco

jopen 10年前

Moco其实就是Mock Server的一个实现。在日常的开发及测试过程中,我们不难发现不同模块之间的测试、协作和集成有时候是一件很困难的事情,往往因为某个模块开发进度落下了,或是某个模块没有配置正确,使得其他模块的测试和开发进度受到限制。通常这被称为短板效应。

先来看一下Moco作者(郑晔)对该工具的定义:

Moco是一个可以轻松搭建测试服务器的框架/工具/程序库。

产生缘由

集成,尤其是基于HTTP协议的集成——web service,REST等,在我们的项目开发中被广泛应用。

以前,我们每次都要往Jetty或Tomcat等应用服务器上部署一个新的WAR。大家都知道,开发部署一个WAR的过程是很枯燥的,即使在嵌入式服务器上也是如此。而且,每次我们做一点改动,整个WAR都要重新组装。

使用场景

我是一个企业级软件开发人员,每次面对集成就是我头疼开始的时候,漫长集成拉锯战拖延了我们的进度。幸好有了Moco,几行配置就可以模拟一个服务,我再也不需要看集成服务团队的脸色了。
我是一个移动开发人员,老板催得紧,可服务器端开发进度慢,我空有一个漂亮的iphone应用,发挥不出作用。幸好有了Moco,很快就可以搭建出一个模拟服务,我再也不用把生命浪费在无效的等待上了。
我是一个前端开发人员,做Inception的时候,客户总想看到一个完整的应用演示,可哪有时间开发后端服务啊!幸好有了Moco,几下就可以弄出一个模拟服务,我做的页面一下就有了生命力。
使用Moco

Moco目前支持多种使用方式,最基本的方式是两种:API和独立运行。

如果你编写的是个Java应用(或是以其它JVM上的语言编写的应用),你可以采用直接调用API;我们也可以独立运行的方式,在配置文件中,配置一个属于自己的服务器。

Moco其实就是Mock Server的一个实现。在日常的开发及测试过程中,我们不难发现不同模块之间的测试、协作和集成有时候是一件很困难的事情,往往因为某个模块开发进度落下了,或是某个模块没有配置正确,使得其他模块的测试和开发进度受到限制。通常这被称为短板效应。
在笔者的工作经历中也经常碰见此类现象,由于负责的模块依赖其他底层模块,在进行性能测试时必须先将其他底层模块全部部署调试通顺,才能进行下一阶段的性能作业。而其他模块如若尚未开发完毕,亦或开发完较难搭建,在部署调试过程中往往就会花费大量时间和精力。当笔者尝到Mock Sever这种技术带来的方便后,也想要将其分享给大家。(以下示例均为超级简化版,仅仅演示Moco框架的基本使用)

示例一

背景:Web服务A已开发完毕,A的登录功能依赖第三方OAuth。
任务:对A的登录功能进测试。
难点:不可能到第三方服务注册大量用于测试的账户。不可能自己实现一套OAuth系统。性能测试时不可能直接使用第三方服务。
上代码:

public class MocoTest {        private Runner runner;      private static final int PORT = 80;      private static final String URL= "http://localhost/login?userName=*$#";      private static final String RESPONSE = "{\"code\":400}";        @Before      public void setup() {          HttpServer server = httpserver(PORT);          server.response(RESPONSE);          runner = runner(server);          runner.start();      }        @After      public void tearDown() {          runner.stop();      }        @Test      public void test() throws IOException {          // do something          Content content = Request.Get(URL).execute().returnContent();          // do something          assertThat(content.asString(), is(RESPONSE));      }  }

直接在测试代码中模拟第三方服务。

示例二

背景:Web服务A已开发完毕,Web服务B尚处于开发过程,B是A的基础服务。
任务:对A进行测试。
难点:B还没开发完成,A根本无法测试。
上代码:

login.json  {    "request" :      {        "uri" : "/login"      },    "response" :      {        "text" : "{\"code\":200}"      }  }    java -jar moco-runner-<version>-standalone.jar start -p 80 -c login.json

简单两步,就运行起了简化版的B模块的模拟服务。
So easy。有木有很心动?Moco项目地址