测试工具Wiremock介绍

WireMock是一个开源的测试工具,支持HTTP响应存根、请求验证、代理/拦截、记录和回放。最直接的用法:?

为Web/移动应用构建Mock Service

快速创建Web API原型

模拟Web Service中错误返回

录制HTTP请求和回放

?一般开发项目都会把前端组和Service组分开,当进度不一致时,可以根据接口构建Mock Service对和模拟不同输入/数据/场景,这样不至于影响两组的开发进度。构建Mock Service方法很多,node.js大概五句代码,另一测试工具soapUI也可做到,同时还可以对Service进行功能/性能测试,功能齐全。Wiremock好在轻便,一个jar包基本够用了,当然,也可以把它引用写进测试代码里。

官网地址:http://wiremock.org/

Jar下载:https://repo1.maven.org/maven2/com/github/tomakehurst/wiremock-standalone/2.27.2/wiremock-standalone-2.27.2.jar

Mock Service

下载后,在命令行中运行:(需要java JDK环境)

java -jar wiremock-1.57-standalone.jar –port 9999 --verbose

(不指定端口默认为8080; 开启日志:--verbose。更多参数,请至:http://wiremock.org/running-standalone.html。 把命令放在bat文件中比较方便)

启动后在同目录下生成两个空的文件夹:__files和mappings。__files是放上传/下载/录制文件用的,mappings放你想要的Service返回数据和Url mapping.

在mappings文件夹下随便创建一个*.json文件:

(注意,添加修改mapping文件后,都需要重启服务才能生效)

{

? ? "request": {

? ? ? ? "method": "GET",

? ? ? ? "url": "/api/mytest"? ? },

? ? "response": {

? ? ? ? "status": 200,

? ? ? ? "body": "More content"? ?

????}

}

在Fiddler/浏览器/curl命令调用:?http://localhost:9999/api/mytest

这是一个HTTP GET的例子,还可以在response中自定义返回的头headers:

"response": { "status": 200, "body": "Hello world!", "headers": { "Content-Type": "text/plain" }}

?HTTP方法支持GET, POST, PUT, DELETE, HEAD, TRACE, OPTIONS等,自定义头、数据模板(bodyPatterns,如下例,如不符合,抛出404错误),URL Template,Query参数匹配,显示指定文件内容等。

如以下例子:

?POST: http://localhost:9999/api/products

{

? ? "request": {

? ? ? ? "method": "POST",

? ? ? ? "url": "/api/products",

? ? ? ? ? "bodyPatterns": [

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

? ? ? ? ]

? ? },

? ? "response": {

? ? ? ? "status": 201,

? ? ? ? "body": "Add successfully.",

? ? ? ? "headers":{

? ? ? ? ? ? ? ? ? "x-token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"? ? ? ? }

? ? }

}

PUT: http://localhost:9999/api/products/1

{

? ? "request": {

? ? ? ? "method": "PUT",

? ? ? ? "url": "/api/products/1",

? ? ? ? ? "bodyPatterns": [

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

? ? ? ? ]

? ? },

? ? "response": {

? ? ? ? "status": 200,

? ? ? ? "body": "Update successfully.",

? ? ? ? "headers":{

? ? ? ? ? ? ? ? ? "x-token":" xxxxxxxxxxxxxxxxxxxxxxxxxxxx"? ? ? ? }

? ? }

}

DELETE: http://localhost:9999/api/products/1

{

? ? "request": {

? ? ? ? "method": "DELETE",

? ? ? ? "url": "/api/products/1"

? ? },

? ? "response": {

? ? ? ? "status": 204,? ? ?

? ? ? ? "headers":{

? ? ? ? ? ? ? ? ? "x-token":" xxxxxxxxxxxxxxxxxxxxxxxxxxxx"? ? ? ? }

? ? }

}

URL Matching:?http://localhost:9999/api/products/1(2/3...)

{

? ? "request": {

? ? ? ? "method": "GET",

? ? ? ? "urlPattern": "/api/products/[0-9]+"? ? },

? ? "response": {

? ? ? ? "status": 200? ? }

}

Query参数匹配:http://localhost:9999/api/products?search=china

{

? ? "request": {

? ? ? ? "method": "GET",

? ? ? ? "urlPath": "/api/products",

? ? ? ? "queryParameters": {

? ? ? ? ? ? "search": {

? ? ? ? ? ? ? ? "contains": "chin"? ? ? ? ? ? }

? ? ? ? }

? ? },

? ? "response": {

? ? ? ? ? ? "status": 200,

? ? ? ? ? ? "headers":{ "Content-Type": "application/json"},

? ? ? ? ? ? ? "body": "{ \"id\": 7, \"name\": \"shan zai\", \"from\":\"China\" },{ \"id\": 7, \"name\": \"shan zai\", \"from\":\"China(RPC)\" }"? ? }

}

返回文件内容:http://localhost:9999/file/1

{

? ? "request": {

? ? ? ? "method": "GET",

? ? ? ? "url": "/file/1"? ? },

? ? "response": {

? ? ? ? "status": 200,

? ? ? ? "bodyFileName": "test.xml"(或:”xmlfiles/test.xml”)? ? }

}

(在__files文件夹下建好所调文件,路径为相对__files文件夹。)

?模拟错误

{

? "request" : {

? ? "url" : "/unknown.html",

? ? "method" : "GET"? },

? "response" : {

? ? "status" : 404,?

? ? "headers" : {? ?

? ? ? "Content-Type" : "text/html; charset=utf-8"? ?

? ? }

? }

}

{

? ? "request": {

? ? ? ? "method": "GET",

? ? ? ? "url": "/fault"? ? },

? ? "response": {

? ? ? ? "fault": "MALFORMED_RESPONSE_CHUNK"}}

录制HTTP请求及回放?

Wiremock的录制过程是启动一个代理服务,截取HTTP请求和响应,在mappings文件夹中创建一json文件记录下请求地址和响应概要,在__files文件夹下创建一文件包含响应内容;当重启Standalone进程时,那些记录下的请求响应就会作为Mock Service生成。?

启动录制服务:?

java -jar wiremock-1.57-standalone.jar --proxy-all="http://localhost:7777"--record-mappings –verbose

默认的代理服务端口是8080,即之后发向http://localhost:7777的请求,可以用http://localhst:8080/来代理。

代理前:

代理后:

录制记录:

?生成mapping文件和响应内容文件:


{

? "request" : {

? ? "url" : "/test.aspx",

? ? "method" : "GET"? },

? "response" : {

? ? "status" : 200,

? ? "bodyFileName" : "body-test.aspx-WK0fD.json",

? ? "headers" : {

? ? ? "Cache-Control" : "private",

? ? ? "Content-Type" : "text/html; charset=utf-8",

? ? ? "Server" : "Microsoft-IIS/7.5",

? ? ? "X-AspNet-Version" : "2.0.50727",

? ? ? "X-Powered-By" : "ASP.NET",

? ? ? "Date" : "Tue, 08 Sep 2015 03:14:36 GMT",

? ? ? "Content-Length" : "61"? ? }

? }

}


录制完重启服务,验证刚才录制的请求是否生效:

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • xdh精英班20160909课后作业: Node.js HTTP 介绍 本文根据xdh精英班20160909课后作...
    birdflying阅读 871评论 0 4
  • 英文文档,一开始我也是抗拒的,边翻译边看,也就花费了1个小时基本就阅读过了,我的英文基础其实很差。附上链接:链接:...
    lonecolonel阅读 9,886评论 3 1
  • Overview The ccxt library is a collection of available cr...
    郭蝈儿蝈儿阅读 3,679评论 0 1
  • 使用 HTTP 服务器或客户端功能必须调用require('http')。 Node 里的 HTTP 接口支持协议...
    保川阅读 1,382评论 0 1