Mock Server的一個實現:Moco

jopen 11年前發布 | 104K 次閱讀 Moco 單元測試

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項目地址

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!