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ù)器。