Mock Server利器 - Moco

Moco介紹

在開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)使用到一些http網(wǎng)絡(luò)接口,而這部分功能通常是由第三方開(kāi)發(fā)團(tuán)隊(duì)或者是后端同事進(jìn)行開(kāi)發(fā)的,在我們開(kāi)發(fā)時(shí)不能給我們提供服務(wù),更有甚者,要集成的服務(wù)在開(kāi)發(fā)時(shí)還不存在。這為我們的聯(lián)調(diào)和測(cè)試造成了麻煩,常見(jiàn)的解決方案是搭建一個(gè)web server。

為什么要開(kāi)發(fā)Moco這個(gè)框架?

具體到模擬服務(wù)上,處理的手法也是各種各樣,因?yàn)榉?wù)以HTTP集成居多,無(wú)論是Web Service,還是REST,所以,一種典型的做法是,開(kāi)發(fā)一個(gè)模擬服務(wù),打成WAR包,部署到一個(gè)應(yīng)用服務(wù)器上。而我們知道,一旦牽扯到應(yīng)用服務(wù)器部署,就是非常耗時(shí)的,部署的時(shí)間量級(jí)通常是分鐘級(jí)的。而且,模擬服務(wù)器通常不是一次性的工作,我們需要在開(kāi)發(fā)過(guò)程中,反復(fù)調(diào)整,這就進(jìn)一步增加了維護(hù)一個(gè)模擬服務(wù)器的成本。有的應(yīng)用服務(wù)器是非常消耗資源的,要用專門(mén)的機(jī)器來(lái)部署它。更進(jìn)一步,如果機(jī)器資源有限,團(tuán)隊(duì)就只能共享一臺(tái)機(jī)器,這樣,即便我為測(cè)試自己的部分做一個(gè)小的改動(dòng),很有可能因?yàn)榈貌坏綑C(jī)器的使用權(quán),而要等上幾天時(shí)間

Moco就是針對(duì)這樣一個(gè)特定的場(chǎng)景而生的。Moco是一個(gè)簡(jiǎn)單搭建模擬服務(wù)器的程序庫(kù)/工具,這個(gè)基于 Java 開(kāi)發(fā)的開(kāi)源項(xiàng)目已經(jīng)在 Github 上獲得了不少的關(guān)注。該項(xiàng)目的簡(jiǎn)介是這樣描述自己的:Moco 是一個(gè)簡(jiǎn)單搭建 stub 的框架,主要用于測(cè)試和集成。

開(kāi)發(fā)團(tuán)隊(duì)只要根據(jù)自己的需要進(jìn)行相應(yīng)的配置,就會(huì)很方便得到一個(gè)模擬服務(wù)器。而且,由于 Moco 本身的靈活性,其用途已經(jīng)不再局限于最初的集成測(cè)試,比如,Moco 可以用于移動(dòng)開(kāi)發(fā),模擬尚未開(kāi)發(fā)的服務(wù);Moco 還可以用于前端開(kāi)發(fā),模擬一個(gè)完整的 Web 服務(wù)器等等。

Moco本身支持API和獨(dú)立運(yùn)行兩種方式。通過(guò)使用API,開(kāi)發(fā)人員可以在JUnit、JBehave等測(cè)試測(cè)試框架里使用Moco,極大程度地降低了集成點(diǎn)測(cè)試的復(fù)雜度

Moco可以提供以下服務(wù):

  • HTTP APIs
  • Socket APIs
  • REST API

Moco原理簡(jiǎn)介:Moco會(huì)根據(jù)一些配置,啟動(dòng)一個(gè)真正的HTTP服務(wù)(會(huì)監(jiān)聽(tīng)本地的某個(gè)端口)。當(dāng)發(fā)起請(qǐng)求滿足一個(gè)條件時(shí),它就給回復(fù)一個(gè)應(yīng)答。Moco的底層沒(méi)有依賴于像Servlet這樣的重型框架,而是基于一個(gè)叫Netty網(wǎng)絡(luò)應(yīng)用框架直接編寫(xiě)的,這樣一來(lái),繞過(guò)了復(fù)雜的應(yīng)用服務(wù)器,所以,它的速度是極快的

Moco已經(jīng)在github上開(kāi)源,可點(diǎn)擊連接:https://github.com/dreamhead/moco

Moco獨(dú)立運(yùn)行所需環(huán)境

Moco獨(dú)立運(yùn)行時(shí)所需準(zhǔn)備的有:

  • Java運(yùn)行環(huán)境
  • moco-runner-0.11.0-standalone.jar

如何運(yùn)行Moco

啟動(dòng)http服務(wù)

Moco的運(yùn)行非常簡(jiǎn)單,只需要一行命令即可
如在命令行中運(yùn)行:java -jar <path-to-moco-runner> http -p <monitor-port> -c < configuration -file>

  • <path-to-moco-runner>:moco-runner-0.11.0-standalone.jar包的路徑
  • <monitor-port>:http服務(wù)監(jiān)聽(tīng)的端口
  • <configuration -file>:配置文件路徑

這就在本地啟動(dòng)了一個(gè)http server,其中監(jiān)聽(tīng)端口為12345,配置文件是MocoApi.json。只要在本機(jī)發(fā)起一個(gè)請(qǐng)求,如:http://localhost:12345,該請(qǐng)求就會(huì)被這個(gè)web server handle

如果別的機(jī)子想訪問(wèn)這個(gè)服務(wù),只要把localhost替換成本機(jī)IP即可

啟動(dòng)https服務(wù)

啟動(dòng)https服務(wù),需要先生成證書(shū),并用如下命令啟動(dòng)服務(wù):地方多發(fā)呆發(fā)地方的地方的地方的發(fā)呆發(fā):java -jar <path-to-moco-runner> https -p <monitor-port> -c < configuration -file> --https <path-to-cert.jks > --cert mocohttps --keystore mocohttps

  • <path-to-moco-runner>:moco-runner-0.11.0-standalone.jar包的路徑
  • <monitor-port>:http服務(wù)監(jiān)聽(tīng)的端口
  • <configuration -file>:配置文件路徑
  • <path-to-cert.jks>:證書(shū)路徑

這就在本地啟動(dòng)了一個(gè)http server,其中監(jiān)聽(tīng)端口是12346,配置文件是MocoApi.json,證書(shū)文件是test.cer

Moco HTTP(s) API配置

啟動(dòng)服務(wù)之后,必然會(huì)根據(jù)需求stub出各種各樣接口反饋,我們會(huì)把這個(gè)配置放在一個(gè)json文件中,啟動(dòng)Moco的時(shí)候,需要指定使用的配置文件路徑,這樣配置就可以生效了。Moco服務(wù)可以檢測(cè)到配置文件的變更,假如你修改了配置文件,不需要重新啟動(dòng)Moco,服務(wù)照樣可以生效。更詳細(xì)的配置介紹請(qǐng)查看:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md

配置文件的工作原理大致如下:


如何在配置文件添加注釋

json不支持注釋,想要添加注釋的話,可以在description字段中加入描述

約定請(qǐng)求Body

約定接口的uri

約定請(qǐng)求參數(shù)

約定請(qǐng)求方法

約定HTTP版本

約定請(qǐng)求頭部

約定cookie

約定請(qǐng)求form

表單可以添加多項(xiàng),多項(xiàng)的時(shí)候,必須全部匹配,接口才算匹配成功

約定以指定xml作為請(qǐng)求body

用xpath對(duì)請(qǐng)求進(jìn)行匹配

約定以指定json作為請(qǐng)求body

用正則表達(dá)式對(duì)請(qǐng)求進(jìn)行匹配

匹配操作

設(shè)置Response content

設(shè)置Response 狀態(tài)碼

設(shè)置Response HTTP版本

設(shè)置Response 頭部

設(shè)置重定向

設(shè)置cookie

掛載文件

template的用法

Moco內(nèi)置了一些變量,在response中可以使用這些變量,讓反饋更智能,以下列舉了常用的變量

  • req.version
  • req.version
  • req.method
  • req.content
  • req.headers
  • req.queries
  • req.forms
  • req.cookies

使用舉例如下:


Moco在單元測(cè)試中使用

Moco除了可以單獨(dú)運(yùn)行外,還可以在單元測(cè)試中運(yùn)行,測(cè)試過(guò)程中,Moco會(huì)啟動(dòng)一個(gè)web server來(lái)處理我們的請(qǐng)求

運(yùn)行在單元測(cè)試中的moco server也可以選擇加載json配置文件


通過(guò)stub后臺(tái),便可對(duì)http請(qǐng)求進(jìn)行測(cè)試了

Moco的不足

Moco的使用很簡(jiǎn)單,配置也很方便,目前更是提供了http、rest、socket服務(wù)。但是也僅僅是能stub出接口,模擬出簡(jiǎn)單的場(chǎng)景。如果接收到請(qǐng)求后需要做一些處理,如需查詢數(shù)據(jù)庫(kù)、進(jìn)行運(yùn)算、或者一些復(fù)雜的操作,就無(wú)能為力了。所以是否選用Moco,就取決于開(kāi)發(fā)者是否只是需要一個(gè)簡(jiǎn)單的模擬服務(wù)器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容