WireMock 搭建本地測試服務(wù)及使用案例

入門

什么是WireMock, 我的理解是模擬后端服務(wù)。由于前端開發(fā)一般先于后端咧虎,所以為了能夠模擬比較真實的后端借口服務(wù)妻献,就需要搭建Mock Service晚碾,這種模擬跟寫假數(shù)據(jù)是有區(qū)別的糯耍,雖然數(shù)據(jù)都是假的扔字,但是Mock Service可以擁有真實的網(wǎng)絡(luò)請求環(huán)境,也可以動態(tài)的修改獲取數(shù)據(jù)温技。(這是我的理解~ 我是小白哈革为,歡迎指正~)

研究了一天,基本了解使用后覺得WireMock還是挺簡單的舵鳞,運行一下jar包就可以搭建服務(wù)器了篷角。下面我就整理下小白學(xué)習(xí)流程??~

Mac想要運行jar文件需要配置java環(huán)境,jdk下載地址系任,安裝好后就可以運行jar文件啦~ (如果遇到j(luò)ava路徑問題可能是環(huán)境變量沒配好,上網(wǎng)查查~)

回到WireMock , WireMock Jar 包在這里下載虐块,這里我們下載的是wiremock-standalone俩滥,記住這個standalone單詞 ,也就是一種可以獨立運行的“模式”贺奠,下載完成后用終端cd到目錄下運行

// 請注意你下載的版本號和名稱霜旧,不要盲目復(fù)制運行
java -jar wiremock-standalone-2.1.10.jar -port 7777

-port 是選擇運行端口,默認是:8080,如果8080端口被暫用了還是用其他的吧~
如果啟動成功了會出現(xiàn)WireMock的圖案:


啟動成功圖

這時候該文件目錄下會出現(xiàn)兩個文件夾
mappings:可以理解成專門定義request請求的地方挂据,你需要把你需要請求的所有request請求先在這里先定義以清。每一次改動都需要重啟WireMock服務(wù)!F樘印掷倔!(如果服務(wù)已經(jīng)啟動了,先:control + c 停止服務(wù)个绍,再重新運行上面的代碼運行jar文件并且出現(xiàn)成功圖案即可)勒葱,如果發(fā)現(xiàn)沒有成功的圖,可能是mappings下的某個request文件出錯了巴柿,重新檢查下~
__files:可以理解成存放response請求body的地方凛虽,在request中設(shè)置響應(yīng)體文件名稱,服務(wù)會對應(yīng)找到__files下的這個文件作為response返回~

舉個??:
mappings 文件夾下我創(chuàng)建一個abc.json格式的請求(名稱隨意起)广恢,內(nèi)容如下:
請求方式GET凯旋,路徑是/api,對應(yīng)的response是個文件钉迷,文件名為two.json至非,類型為json,

{
  "request": {
      "method": "GET",
      "urlPath": "/api"
  },
  "response": {
      "status": 200,
      "bodyFileName": "two.json",
      "headers": {
          "Content-Type": "application/json"
      }
  }
}

保存后篷牌,重啟WireMock服務(wù)睡蟋,成功后在瀏覽器中打開地址,http://localhost:7777/api 別忘了端口號呦~

image.png

該錯誤是正常的枷颊,因為我們返回的是內(nèi)容是two.json的文件戳杀,可是我們并沒有寫這個文件,下面我們只要在__files中創(chuàng)建這個json文件即可

{
    "equalToJson" : "{ \"name\": \"new product\", \"creator\": \"tester\", \"createTime\": \"2015-09-07\" }", 
    "jsonCompareMode": "LENIENT"
}

__files 文件夾內(nèi)的改動不需要重啟服務(wù)夭苗,保存即可信卡,再次看看瀏覽器頁面~ 完工啦~


image.png

當(dāng)然,你也可以不用創(chuàng)建這個文件题造,直接在request中將bodyFileName改成直接body寫出這個json也是可以的

{
 {
  "request": {
      "method": "GET",
      "urlPath": "/api"
  },
  "response": {
      "status": 200,
      "body": "{ \"id\": 1, \"name\": \"new product\", \"creator\": \"tester\", \"createTime\": \"2015-09-07\" }",
      "headers": {
          "Content-Type": "application/json"
      }
  }
}

是不是很簡單方便傍菇,當(dāng)然,POST請求也是可以的界赔, XML格式請求也是可以的~

進階一:

以上是一種非常簡單的形式丢习,數(shù)據(jù)都是寫死的,那么如果想要加入參數(shù)怎么辦呢淮悼?
參數(shù)的傳遞需要對WireMock進行擴展咐低,也就是需要另一種jar包支持:wiremock-body-transformer,開發(fā)者描述中找到standalone模式對應(yīng)的地方可以看到它的使用介紹:
首先下載擴展包 [Download the body transformer extension jar file here.]
如果還沒有WireMock的“基礎(chǔ)包” 點擊這里下載 wiremock-standalone-2.1.10.jar 袜腥,有的話就不用下了见擦。
然后將兩個jar包放在一個文件夾下運行

// 請注意你下載的這兩個jar包的版本號和名稱,不要盲目復(fù)制運行
java -cp "wiremock-body-transformer-1.1.6.jar:wiremock-standalone-2.3.1.jar" com.github.tomakehurst.wiremock.standalone.WireMockServerRunner --verbose --extensions com.opentable.extension.BodyTransformer -port 7777

運行成功后就可以寫借口了。先創(chuàng)建一個GET請求的request鲤屡,格式是json损痰,文件名隨意,內(nèi)容如下:

{
    "request": {
        "method": "GET",
        "urlPath": "/transform"
    },
    "response": {
        "status": 200,
        "body": "{\"responseName\": \"$(name)\"}",
        "headers": {
            "Content-Type": "application/json"
        },
        "transformers": ["body-transformer"]
    }
}

可以看到其中有個特別的字段是$(name)酒来,這個就是GET請求中的參數(shù)名稱卢未,用$()包裹,保存后重啟服務(wù)役首,在瀏覽器中打開

image.png

參數(shù)獲取成功~

下面我們試下XML格式尝丐,和POST請求的效果:
依然是先創(chuàng)建request,格式是json衡奥,文件名隨意爹袁,內(nèi)容如下:

{
    "request": {
        "method": "POST",
        "urlPath": "/transform/post"
    },
    "response": {
        "status": 200,
        "body": "<node><to>$(body.node.to)</to><from>$(body.node.from)</from><heading><order><orderNo>$(body.node.heading.order.orderNo)</orderNo><orderNo2>$(body.node.heading.order.orderNo2)</orderNo2></order></heading></node>",
        "headers": {
            "Content-Type": "text/xml"
        },
        "transformers": ["body-transformer"]
    }
}

可以看到在返回內(nèi)容的body中,我們返回的是xml格式的內(nèi)容矮固,而且$()中是支持點語法的失息,這樣我們就可以訪問的請求體中的內(nèi)容了,接下來我們需要發(fā)送這個post請求档址,需要用到Postman 來模擬post請求:

因為模擬xml格式的請求盹兢, 所以我們設(shè)置post請求體中也為xml格式,來看下效果

image.png

成功拿到數(shù)據(jù)守伸,可以理解$(body)是能夠拿到response下的body內(nèi)容的绎秒,既然支持點語法,就可以很輕松訪問其他節(jié)點~

如果覺得在response中將body以字符串的形式表達很不直觀的話尼摹,我們可以用文件的形式去寫~
依然是先創(chuàng)建request见芹,格式是json,文件名隨意蠢涝,內(nèi)容如下:

{
    "request": {
        "method": "POST",
        "urlPath": "/transform/post/file"
    },
    "response": {
        "status": 200,
        "bodyFileName": "test-post-file-body.vm",
        "headers": {
            "Content-Type": "text/xml"
        },
        "transformers": ["body-transformer"]
    }
}

我將原先寫在response中的body內(nèi)容替換為bodyFileName玄呛,并且指明文件名,在 __files 文件夾中創(chuàng)建 test-post-file-body.vm這個文件和二,內(nèi)容就是之前response中body中的內(nèi)容:

<node>
    <to>$(body.node.to)</to>
    <from>$(body.node.from)</from>
    <heading>
        <order>
            <orderNo>$(body.node.heading.order.orderNo)</orderNo>
            <orderNo2>$(body.node.heading.order.orderNo2)</orderNo2>
        </order>
    </heading>
</node>

這樣寫是很可觀的徘铝,一目了然~
重啟運行后的效果當(dāng)然結(jié)果跟之前也是一樣的,這里就不展示了惯吕。

至此惕它,參數(shù)獲取完結(jié)~ 怎么樣?還是蠻簡單的吧

進階二

再想想废登, 以上所掌握的方法依然不滿足現(xiàn)實所需怠缸,能不能寫一些判斷語句在里面呢,類似這種

<orderNo>$(body.orderNo > 0 ? body.orderNo : 暫無數(shù)據(jù))</orderNo>

嘗試許久~發(fā)現(xiàn)這種表達式是不支持

那么如果需要判斷參數(shù)以返回不同內(nèi)容 钳宪,我們該怎么辦呢?
發(fā)現(xiàn)了這個擴展:wiremock-velocity-transformer,我看到它給的Demo中是這樣寫的:

{
    "requestAbsoluteUrl" : "$requestAbsoluteUrl",
    "requestBody" : "$requestBody",
    "requestMethod" : "$requestMethod",
    "requestHeaderHost" : "$requestHeaderHost",
    "requestHeaderUserAgent" : "$requestHeaderUserAgent",
    "requestHeaderAcceptAccept" : "$requestHeaderAccept",
    "requestHeaderAcceptLanguage" : "$requestHeaderAcceptLanguage",
    "requestHeaderAcceptEncoding" : "$requestHeaderAcceptEncoding",
    "requestHeaderConnection" : "$requestHeaderConnection",
    "date" : "$date",
    "math": "$math.round(22.2)",
    #if($requestAbsoluteUrl == 'http://localhost:8089/my/resource')
    "customProp" : "customValue",
    "customProp2" : "customValue2",
    #else
    "customProp" : "customValue",
    #end
    "date" : "$date.getMonth()",
    "math" : "$math.floor(2.5)"
}

我發(fā)現(xiàn)了 #if()表達式吏颖,我需要這個~ 于是運行一下看看效果
GitHub中它也提供了Standalone的運行方法搔体,跟之前body-transformer類似,名稱不一樣而已~

// 請注意你下載的這兩個jar包的版本號和名稱半醉,不要盲目復(fù)制運行
java -cp "wiremock-standalone-2.1.12.jar:wiremock-velocity-transformer-standalone-1.4.jar" com.github.tomakehurst.wiremock.standalone.WireMockServerRunner --verbose --extensions com.github.adamyork.wiremock.transformer.VelocityResponseTransformer

它提供的request 內(nèi)容:

{
    "request": {
        "urlPattern": "/resource",
        "method": "GET"
    },
    "response": {
        "status": 200,
        "bodyFileName": "response-test-body.vm",
        "headers": {
            "Content-Type": "application/json"
        }
    }
}

運行一下看看效果


image.png

可以看到他提供的 $requestBody #if() #date #math() 等等方法都是可以直接用的疚俱,非常不錯。
這里要注意缩多, 這個擴展并不支持之前的$(xxx)這種格式呆奕, 因為$(xxx)這是body-transformer擴展中的方法。
下面只要同時加載這兩個擴展就能滿足我的需求衬吆。

官方文檔 Standalone部分中這樣說明

--extensions: Extension class names e.g. 
com.mycorp.HeaderTransformer,com.mycorp.BodyTransformer. See extending-wiremock.

Transformer之間以“ , ”分割梁钾, 完美~

還有之前設(shè)置 -port 的解釋說明呦,有問題可以在這里找找~

--port: Set the HTTP port number e.g. --port 9999

最終逊抡,我們講所用到的所有jar包(wiremock-standalone-2.3.1.jar 姆泻,wiremock-body-transformer-1.1.6.jar,wiremock-velocity-transformer-standalone-1.4.jar)
放在同一目錄下冒嫡,運行~

// 請注意你下載的jar包的版本號和名稱拇勃,不要盲目復(fù)制運行
java -cp "wiremock-standalone-2.3.1.jar:wiremock-body-transformer-1.1.6.jar:wiremock-velocity-transformer-standalone-1.4.jar" com.github.tomakehurst.wiremock.standalone.WireMockServerRunner --verbose --extensions com.github.adamyork.wiremock.transformer.VelocityResponseTransformer,com.opentable.extension.BodyTransformer  -port 7777

測試一下效果~

依然是先創(chuàng)建request,格式是json孝凌,文件名隨意方咆,內(nèi)容如下:

{
    "request": {
        "method": "POST",
        "urlPath": "/transform/post/double"
    },
    "response": {
        "status": 200,
        "bodyFileName": "response-doubel-body.vm",
        "headers": {
            "Content-Type": "text/xml"
        },
        "transformers": ["body-transformer"]
    }
}


在 __files 文件夾中創(chuàng)建 response-doubel-body.vm這個文件,內(nèi)容如下:

<?xmlversion='1.0'encoding='UTF-8'?>
<node>
    <to>$(body.node.to)</to>
    <from>$(body.node.from)</from>
    <heading>
        <order>
            <orderNo>$(body.node.heading.order.orderNo)</orderNo>
            #if($requestBody.contains('from'))
            <orderNo2>$(body.node.heading.order.orderNo2)</orderNo2>
            #else
            <orderNo2>no from node</orderNo2>
            #end
        </order>
    </heading>
</node>

解釋:
這里用到了Java的contains方法蟀架,意思判斷requestBody中是否包含'from'標(biāo)簽瓣赂,從而顯示不同的內(nèi)容,在這里我就理解成from標(biāo)簽了辜窑,當(dāng)然如果任意標(biāo)簽中存在"from"字符串也是可以匹配到的钩述,由于擴展提供方法有限,只能這樣意思下穆碎,暫時還不知道有什么方法可以完美的篩選標(biāo)簽或者內(nèi)容牙勘, 這里不必要在意細節(jié), 畢竟是測試嘛~
運行下看看效果:更改mappings記得重啟服務(wù)~

有from標(biāo)簽

無from標(biāo)簽

沒有問題~ 所禀, 至此功能需求基本滿足方面,WireMock 的搭建和運行測試也已完結(jié),這些功能應(yīng)該可以滿足大部分需求色徘, 比較只是本地測試服務(wù)恭金,小小的意思下就可以了。 好啦褂策。 本文完結(jié)~ 有問題的小伙伴歡迎留言討論~
附上本文所用Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末横腿,一起剝皮案震驚了整個濱河市颓屑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耿焊,老刑警劉巖揪惦,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罗侯,居然都是意外死亡器腋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門钩杰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纫塌,“玉大人,你說我怎么就攤上這事讲弄〈胱螅” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵垂睬,是天一觀的道長媳荒。 經(jīng)常有香客問我,道長驹饺,這世上最難降的妖魔是什么钳枕? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赏壹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昔瞧。我一直安慰自己菩佑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布酬荞。 她就那樣靜靜地躺著混巧,像睡著了一般勤揩。 火紅的嫁衣襯著肌膚如雪陨亡。 梳的紋絲不亂的頭發(fā)上深员,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音箱残,去河邊找鬼止吁。 笑死敬惦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宏怔。 我是一名探鬼主播畴椰,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼抓艳,長吁一口氣:“原來是場噩夢啊……” “哼玷或!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偏友,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤位他,失蹤者是張志新(化名)和其女友劉穎棱诱,沒想到半個月后涝动,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醋粟,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年鼻吮,在試婚紗的時候發(fā)現(xiàn)自己被綠了较鼓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博烂。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡禽篱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玛界,到底是詐尸還是另有隱情慎框,我是刑警寧澤舆绎,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站猎醇,受9級特大地震影響努溃,放射性物質(zhì)發(fā)生泄漏梧税。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凳谦。 院中可真熱鬧,春花似錦家凯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橄镜。三九已至,卻和暖如春晒夹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喷好。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工梗搅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留无切,地道東北人丐枉。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓籍嘹,卻偏偏與公主長得像弯院,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颂碘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理凭涂,服務(wù)發(fā)現(xiàn),斷路器蝙斜,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法孕荠,類相關(guān)的語法稚伍,內(nèi)部類的語法个曙,繼承相關(guān)的語法受楼,異常的語法艳汽,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,916評論 6 13
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,805評論 0 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評論 25 707