2018-06-28 MockServer 增加開(kāi)發(fā)效率

MockServer

簡(jiǎn)單介紹:
這個(gè)MockServer 提供了一些API镇饺,根據(jù)定義的Request定義和指定Response規(guī)則,生成一條Expectation稚晚,那么在請(qǐng)求該Request指定的地址的時(shí)候,會(huì)將Response指定的數(shù)據(jù)返回,用來(lái)模擬API永毅。

目前用的人應(yīng)該不多,能找到的中文介紹比較少人弓。沼死。

特性

該MockServer主要有兩個(gè)概念,分別為 MockServer和MockClients

MockServer顧名思義就是服務(wù)端應(yīng)用程序崔赌,
MockClients就是通過(guò)API 與MockServer服務(wù)端交互的程序意蛀。

MockServer 還支持Proxy,為應(yīng)用設(shè)置代理端口和代理地址健芭,并轉(zhuǎn)發(fā)到遠(yuǎn)程地址的指定端口县钥。用來(lái)分析應(yīng)用程序十分方便。

  • 支持Node.js客戶端
  • 支持Java客戶端
  • 支持Javascript客戶端
  • 支持ruby客戶端

十分強(qiáng)大
服務(wù)端是用Netty寫的慈迈,支持HTTP協(xié)議若贮,支持Websocket。

下面是官方的一些圖

Expectation
Forward

https://github.com/jamesdbloom/mockserver
http://mock-server.com/

實(shí)戰(zhàn)

從github上clone該項(xiàng)目,然后checkout 5.4.1(目前最新版本)谴麦。
官方文檔非常詳細(xì)蠢沿,可惜提供的 NodeClients 和文檔 的最新版本是5.3.0。

啟動(dòng)

5.3.0 版本

java -jar ./mockserver-jetty-jar-with-dependencies.jar -serverPort 1080 -proxyPort 1090 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com

serverPort表示 MockServer的主要端口匾效,通過(guò)該端口提供的API可以創(chuàng)建規(guī)則搏予。
proxyPort表示MockServer提供的Proxy端口,通過(guò)該端口可以轉(zhuǎn)發(fā)到 proxyRemoteHost對(duì)應(yīng)的端口 proxyRemotePort弧轧。

5.4.1 版本

通過(guò)查看源碼發(fā)現(xiàn)雪侥,作者似乎將 proxyPort和主要serverPort合并成一個(gè),并且不識(shí)別ProxyPort

java -jar ./mockserver-jetty-jar-with-dependencies.jar -serverPort 1080 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com

serverPort表示 MockServer的主要端口精绎,通過(guò)該端口提供的API可以創(chuàng)建規(guī)則速缨。
同時(shí)也是Proxy端口,通過(guò)該端口可以轉(zhuǎn)發(fā)到 proxyRemoteHost對(duì)應(yīng)的端口 proxyRemotePort代乃。

創(chuàng)建Expectation

根據(jù)文檔是可以創(chuàng)建一些簡(jiǎn)易的請(qǐng)求和返回規(guī)則的旬牲。
下面以nodeClient為例子:

新建run.js

var mockServerClient = require('mockserver-client').mockServerClient;
var instance = mockServerClient("localhost", 1080);

instance.reset();

instance.mockAnyResponse({
    "httpRequest": {
      "method": "GET",
      "path": "/view/cart",
      "queryStringParameters": {
        "cartId": ["055CA455-1DF7-45BB-8535-4F83E7266092"]
      },
      "cookies": {
      }
    },
    "httpResponse": {
      "body": "some_response_body"
    }
  })
  .then(
    function () {
      console.log("expectation created");
    },
    function (error) {
      console.log(error);
    }
  );

確保系統(tǒng)已經(jīng)安裝node.js 和npm.
通過(guò)下面的命令安裝 MockServer Node客戶端

npm install mockserver-node --save-dev

然后執(zhí)行 node run.js

可以看到輸出

expectation created

通過(guò)請(qǐng)求MockServer
127.0.0.1:1080/view/cart?cartId=055CA455-1DF7-45BB-8535-4F83E7266092
即可看到返回?cái)?shù)據(jù):
some_response_body

創(chuàng)建帶Callback的Expectation

var mockServerClient = require('mockserver-client').mockServerClient;
var instance = mockServerClient("localhost", 1080);
var callback = function (request) {
  if (request.method === 'POST') {
      console.log("Callback received BY POST")
  } else {
      console.log("Callback received NOT BY POST");
  }
};

instance.mockWithCallback(
    {
        "path":"/callback"
    },
    callback
  ).then(
          function () {
            console.log('expectation sent');
          },
          function (error) {
            console.log(error);
            process.exit();
          }
);

這里當(dāng)創(chuàng)建這個(gè)Expectation之后,訪問(wèn)
127.0.0.1:1080/callback 可以看到
輸出Callback received NOT BY POST搁吓。

這里非常令人驚嘆原茅,作者是把這個(gè)js function 作為一個(gè)client,把clientId 告訴服務(wù)端堕仔,服務(wù)端收到請(qǐng)求之后擂橘,node.js 是通過(guò)websocket 和服務(wù)端通信的,這時(shí)候摩骨,會(huì)通知客戶端通贞,客戶端收到通知之后,調(diào)用這個(gè)callback恼五。

這個(gè)callback function 在官網(wǎng)文檔 return 了一個(gè) response定義昌罩。這個(gè)似乎可以進(jìn)一步在客戶端處理,然后再次告訴服務(wù)端灾馒,來(lái)返回期望的定義茎用。不過(guò)我沒(méi)有成功實(shí)現(xiàn),會(huì)一直報(bào)錯(cuò)睬罗。

奈何技術(shù)水平有限轨功,不知道怎么才能成功調(diào)用定義的Callback來(lái)返回指定的數(shù)據(jù),不知道是文檔還是官方提供的NodeModule哪里寫的不對(duì)傅物。

通過(guò)REST API創(chuàng)建一般Expectation

通過(guò)POSTMAN 發(fā)起請(qǐng)求:
PUT 127.0.0.1:1080/expectation

{
  "httpRequest": {
    "path": "/somePath",
    "method": "POST"
  },
  "httpResponse": {
    "statusCode": 404,
    "headers": [{
      "name": "Content-Type",
      "values": ["application/json"]
    }, {
      "name": "Cache-Control",
      "values": ["no-cache, no-store"]
    }],
    "body": {
      "type":"JSON",
      "json":"{\"httpRequest\":{\"path\":\"/somePath\",\"method\":\"POST\"},\"httpResponse\":{\"statusCode\":201,\"headers\":[{\"name\":\"Content-Type\",\"values\":[\"application/json\"]},{\"name\":\"Cache-Control\",\"values\":[\"no-cache, no-store\"]}],\"body\":{\"type\":\"JSON\",\"json\":\"\"}}}"
    }
  }
}

這里故意把請(qǐng)求本身當(dāng)作Reponse定義夯辖,并故意返回404。
當(dāng)發(fā)起somePath請(qǐng)求時(shí)董饰,會(huì)接受到對(duì)應(yīng)的JSON蒿褂。

POST 127.0.0.1:1080/somePath

{
  "httpRequest": {
    "path": "/somePath",
    "method": "POST"
  },
  "httpResponse": {
    "statusCode": 404,
    "headers": [{
      "name": "Content-Type",
      "values": ["application/json"]
    }, {
      "name": "Cache-Control",
      "values": ["no-cache, no-store"]
    }],
    "body": {
      "type":"JSON",
      "json":""
    }
  }
}

但愿作者能把5.4.1的文檔補(bǔ)全圆米。

如果你也喜歡這個(gè)工具,直接私信我啄栓,可以和我一起研究娄帖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昙楚,隨后出現(xiàn)的幾起案子近速,更是在濱河造成了極大的恐慌,老刑警劉巖堪旧,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削葱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淳梦,警方通過(guò)查閱死者的電腦和手機(jī)析砸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爆袍,“玉大人首繁,你說(shuō)我怎么就攤上這事≡赡遥” “怎么了弦疮?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜘醋。 經(jīng)常有香客問(wèn)我胁塞,道長(zhǎng),這世上最難降的妖魔是什么堂湖? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任闲先,我火速辦了婚禮,結(jié)果婚禮上无蜂,老公的妹妹穿的比我還像新娘。我一直安慰自己蒙谓,他們只是感情好斥季,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著累驮,像睡著了一般酣倾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谤专,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天躁锡,我揣著相機(jī)與錄音,去河邊找鬼置侍。 笑死映之,一個(gè)胖子當(dāng)著我的面吹牛拦焚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杠输,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赎败,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蠢甲?” 一聲冷哼從身側(cè)響起僵刮,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹦牛,沒(méi)想到半個(gè)月后搞糕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曼追,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年寞宫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拉鹃。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辈赋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膏燕,到底是詐尸還是另有隱情钥屈,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布坝辫,位于F島的核電站篷就,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏近忙。R本人自食惡果不足惜竭业,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望及舍。 院中可真熱鬧未辆,春花似錦、人聲如沸锯玛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攘残。三九已至拙友,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歼郭,已是汗流浹背遗契。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留病曾,地道東北人牍蜂。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓漾根,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捷兰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子立叛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容