入門
什么是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 別忘了端口號呦~
該錯誤是正常的枷颊,因為我們返回的是內(nèi)容是two.json的文件戳杀,可是我們并沒有寫這個文件,下面我們只要在__files中創(chuàng)建這個json文件即可
{
"equalToJson" : "{ \"name\": \"new product\", \"creator\": \"tester\", \"createTime\": \"2015-09-07\" }",
"jsonCompareMode": "LENIENT"
}
__files 文件夾內(nèi)的改動不需要重啟服務(wù)夭苗,保存即可信卡,再次看看瀏覽器頁面~ 完工啦~
當(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ù)役首,在瀏覽器中打開
參數(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格式,來看下效果
成功拿到數(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"
}
}
}
運行一下看看效果
可以看到他提供的 $requestBody #if() #date #math()
等等方法都是可以直接用的疚俱,非常不錯。
這里要注意缩多, 這個擴展并不支持之前的$(xxx)
這種格式呆奕, 因為$(xxx)
這是body-transformer擴展中的方法。
下面只要同時加載這兩個擴展就能滿足我的需求衬吆。
--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ù)~
沒有問題~ 所禀, 至此功能需求基本滿足方面,WireMock 的搭建和運行測試也已完結(jié),這些功能應(yīng)該可以滿足大部分需求色徘, 比較只是本地測試服務(wù)恭金,小小的意思下就可以了。 好啦褂策。 本文完結(jié)~ 有問題的小伙伴歡迎留言討論~
附上本文所用Demo