基于Wiremock创建Mock Service平台(转)
本文链接:https://blog.csdn.net/liuchunming033/article/details/52399397 1、Wiremock工具介绍
一般开发项目都会分模块进行,比如都会把前端和后端分开,在前端和后端里面也通常是分模块开发的。当开发进度不一致时,可以对依赖接口构建Mock Service,模拟不同输入/数据/场景,这样不至于影响本模块的开发进度。构建Mock Service方法很多,今天介绍Wiremock,Wiremock非常轻便易用,甚至不用编程,一个jar包基本够用了,当然,也可以把它引用写进测试代码里。
官网地址:http://wiremock.org/
Jar包下载:http://repo1.maven.org/maven2/com/github/tomakehurst/wiremock-standalone/2.1.10/wiremock-standalone-2.1.10.jar
2、Wiremock工作原理
启动wiremock
java -jar wiremock-2.1.10-standalone.jar –port 9999 —verbose1
(–port设定端口为9999; –verbose开启日志。更多参数需要参考: http://wiremock.org/docs/running-standalone/ 启动后在同目录下生成两个空的文件夹:__files和mappings。__files是放上传/下载/录制文件的,mappings放response和request url的映射的。 在mappings文件夹下随便创建一个*.json文件,比如长下面这样:
"request": { "method": "GET", "url": "/api/testdetail" }, "response": { "status": 200, "bodyFileName": "testdetail.json”, "headers": { "Content-Type": "application/json", "Cache-Control": "max-age=86400" } } }12345678910111213
bodyFileName还可以是html、xml等文档。 在浏览器或者使用curl命令,调用http://localhost:9999/api/testdetail,就能返回testdetail.json的内容了。testdetail.json就是需要我们在__files里面建立的响应文件。wiremock也支持直接在response结构体中返回响应内容,比如在mapping文件中,将response写成下面这样:
"response": { "status": 200, "body": “Hello world ", "headers": { "Content-Type": "application/json", "Cache-Control": "max-age=86400" }1234567
当发送请求时候,将直接返回“Hello world”。
3、Wiremock支持的HTTP方法
HTTP方法支持GET, POST, PUT, DELETE, HEAD, TRACE, OPTIONS等,自定义头、数据模板(bodyPatterns,如不符合,抛出404错误),URL Template,Query参数匹配,显示指定文件内容等。下面将介绍如何使用wiremock实现这些。
3.1 POST
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" } }
}123456789101112131415161718
3.2 PUT
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" } } }1234567891011121314151617
3.3 DELETE
DELETE: http://localhost:9999/api/products/1
{ "request": { "method": "DELETE", "url": "/api/products/1" }, "response": { "status": 204, "headers":{ "x-token":" xxxxxxxxxxxxxxxxxxxxxxxxxxxx" } } }12345678910111213
3.4 URL Matching
URL Matching: http://localhost:9999/api/products/1(2/3…)
{ "request": { "method": "GET", "urlPattern": "/api/products/[0-9]+" }, "response": { "status": 200 } }123456789
3.5 Query参数匹配
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)\" }" } }123456789101112131415161718
3.6 模拟错误
模拟404错误
{ "request": { "url": "/unknown.html", "method": "GET" }, "response": { "status": 404, "headers": { "Content-Type": "text/html; charset=utf-8" } } }12345678910111213
3.7 设置响应延迟
{ "request": { "method": "GET", "url": "/delayed" }, "response": { "status": 200, "bodyFileName": "mytest.json", "headers": { "Content-Type": "application/json", "Cache-Control": "max-age=86400" }, "fixedDelayMilliseconds": 2000 } }123456789101112131415
4、Mock Service平台化
使用WireMock通过mappings和__files文件夹可以有效管理映射和返回内容文件。而这两个文件目前是手动编辑,如果可以做成平台化管理,所有接口通过创建完成,文件命名规则全部由系统进行管理,将节省的时间更多投入业务关注和及早进行自测,这样子的收益将会更大。
那怎么样的平台才算能够满足当前需求呢?
基于HTTP协议 支持Url、UrlPattern匹配、Query参数 支持数据存储 API接口规范化管理 提交表单即可生成mapping和__files所需文件 不同项目接口有不同的前缀 能够返回指定格式(json、xml、html等)内容 能够设定响应延迟 设置cookies 设置headers 支持用户验证
根据需求设计总体架构如下: 包括前台和后台。前台负责接受用户的Mock设置,后台负责将用户的设置转换为WireMock所需要的mapping和__file文件,并提供查询功能。 MockServer架构图 根据架构图,做了总体设计如下: 页面分为Mock项目管理和Mock API管理。Mock项目管理可以创建、修改、删除Mock项目,Mock PAI管理可以创建、修改、删除Mock的API。后台管理负责生成mapping和file文件、对wiremock进行重启等。
4.1 技术选型
由于大家对python都比较熟悉,也有过使用python的Flask框架进行开发经验,这次依然采用Flask+Mysql的方案。从界面录入到mapping、_files文件生成处理采用Python,后台工具使用WireMock的standalone模式,通过shell脚本进行一键启停管理,以及实时刷新url、mapping映射。
4.2 Mock项目管理页
4.2.1 添加项目
配置协议、进行mock服务器的重启、重新加载(有新的mapping、file文件生成系统会自动reset即可,当然手工reset也可以,即时加载无须重启服务等待)。
4.2.2 显示项目
4.2.3 修改项目
4.2.4 删除项目
4.3 Mock API管理页
4.3.1 添加API
选择方法、URL类型,填写URL(如果选择URL类型为UrlPattern,则填写正则表达式),填写状态码、返回接口,以及返回头,就可以完成一个mock接口的创建。这些信息要存储到Mysql。 1)手工输入 适合响应体比较短小的情况 2)通过url获取 返回体比较大,目标Mock接口已经存在,可以直接抓取生成文件; 3)上传文件的方式 返回体比较大、目标Mock接口还未开发完成,手工上传返回内容的文件即可。 以上三种灵活的保存返回内容方式,最终保存的接口会按照以下格式生成mapping和__files所需文件。
4.3.2 显示API
展示列表,列出相关URL、方法、是否正则、返回码、返回类型。
4.3.2 修改API
4.3.3 删除API
4.4 MockServer后台
使用Java-WireMock进行后台服务,在项目配置页通过按钮:重启、重新加载,调用后台脚本:wiremock_controller.sh,脚本内容参考:
#!/bin/bash if [ "$#" = 0 ];then echo "Usage: $0 (start|stop|restart|reset)" exit 1 fi
dirWiremock=`pwd` getCount=`ps -ef | grep "wiremock-1.53-standalone" | grep -v "grep" |wc -l` wiremock_jar=${dirWiremock}/wiremock-1.53-standalone.jar port=9999 wiremock_url=http://localhost:${port}
stop(){ count=${getCount} if [ 1==${count} ];then curl -d log=aaa ${wiremock_url}/__admin/shutdown echo "Stop success!......" else echo "Already stop" fi }
start(){ count=${getCount} if [ 0==${count} ];then nohup java -jar ${wiremock_jar} --verbose=true --port=${port} & echo "Start success!......" else echo "Already start" fi }
if [ "$1" = "restart" ];then count=${getCount} if [ 1==${count} ];then echo "Wiremock is running,wait for restarting! ...." stop echo "Start wiremock......" start else start fi
elif [ "$1" = "start" ];then echo "Start wiremock......" start
elif [ "$1" = "stop" ];then echo "Stop wiremock......" stop
elif [ "$1" = "reset" ];then count=${getCount} if [ 0==${count} ];then echo "Wiremock must be running before reset,wait for starting! ...." start fi curl -d log=aaa ${wiremock_url}/__admin/mappings/reset echo "Reset success!......" fi123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
其中: “nohup java -jar wiremock j ar−−verbose=true−−port= wiremockjar−−verbose=true−−port={wiremock_jar} --verbose=true --port={port} &”:在linux系统后台运行WireMock; “curl -d log=aaa ${wiremock_url}/__admin/mappings/reset”:是通过发送POST请求,重新加载新生成的配置文件。
5、总结
Mock API接口是非常必要的,因为不同研发组的系统之间的数据交互往往是通过接口来实现,当不同组接口开发不同步时,接口测试无法及早参与,对接调试比较困难。这样势必导致软件开发迭代变慢,没有时间对质量进行充分验证。 可以借鉴《自动化单元测试实践之路》在单元测试中,使用Mockito对依赖进行Mock,那同样道理,使用Mock技术也可以对HTTP API进行Mock,按照这个思路探索下去,看看有没有开源解决方案,是否能够解决当前问题,如果可以就不用重复写一套解决方案;如果不行,那能否基于开源的做二次开发呢?
6、参考文档
http://wiremock.org/docs/ http://www.infoq.com/cn/articles/evolution-of-httpservermock-from-hand-to-platform/ ———————————————— 版权声明:本文为CSDN博主「liuchunming033」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/liuchunming033/article/details/52399397
基于Wiremock创建Mock Service平台(转)的更多相关文章
- 基于Wiremock创建Mock Service平台
转载:http://blog.csdn.net/liuchunming033/article/details/52399397 1.Wiremock工具介绍 一般开发项目都会分模块进行,比如都会把前端 ...
- 用C#基于WCF创建TCP的Service供Client端调用
本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...
- Govern Service 基于 Redis 的服务治理平台
Govern Service 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Govern Service 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK,通过 ...
- 基于SQL Server 2008 Service Broker构建企业级消息系统
注:这篇文章是为InfoQ 中文站而写,文章的地址是:http://www.infoq.com/cn/articles/enterprisemessage-sqlserver-servicebroke ...
- 如何使用新浪微博账户进行应用登录验证(基于Windows Azure Mobile Service 集成登录验证)
使用三方账号登录应用应该对大家来说已经不是什么新鲜事儿了,但是今天为什么还要在这里跟大家聊这个话题呢,原因很简单 Windows Azure Mobiles Service Authenticatio ...
- 【转】基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)
转载:http://www.cnblogs.com/windwithlife/archive/2013/03/03/2942157.html 一,选择一个合适的,Web开发环境: 我选择的是Eclip ...
- 基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)
https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自 ...
- Web Service平台概述
Web Service平台主要涉及的技术有SOAP(Simple Object Access Protocal,简单对象访问协议), WSDL(Web Service Descriptio ...
- 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice
一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...
随机推荐
- Linux 文件监控之谁动了我的奶酪
有时候配置文件会被莫名其妙的修改,但是找不到修改他的进程,从而无法抓住罪魁祸首,这时候就诞生了摄像头.呃呃,应该是audit 比如我要监控一个文件test.txt [root@hsun /]# aud ...
- 51nod 2500 后面第一个大于
小b有一个长度为n的序列t,现在她对于每个i,求最小的正数j满足i+j≤ni+j≤n且ti+j>titi+j>ti,输出j,如果不存在这样的j,则输出0. 样例解释: 对于i=1,t2&g ...
- NumPy的Linalg线性代数库探究
1.矩阵的行列式 from numpy import * A=mat([[1,2,4,5,7],[9,12,11,8,2],[6,4,3,2,1],[9,1,3,4,5],[0,2,3,4,1]]) ...
- 1、Python简介与Python安装
一.Python简介: Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的创始人为吉多·范罗苏姆(Guido van Rossum)少数几个不秃头的语言创始 ...
- Spring源码窥探之:扩展原理BeanFactoryPostProcessor
BeanPostPorcessor是在bean创建对象初始化前后进行拦截工作,而BeanFactoryPostProcessor是Bean工厂的后置处理器,在Bean定义加载完成之后,Bean实例初始 ...
- git基本操作及设置
$ git config --global user.name "wstmljf" $ git config --global user.email "wstmljf@1 ...
- K-Nearest Neighbors Algorithm
K近邻算法. KNN算法非常简单,非常有效.KNN算法适合样本较少典型性较好的样本集. KNN的模型表示是整个训练数据集.也可以说是:KNN的特点是完全跟着数据走,没有数学模型可言. 对一个新的数据点 ...
- MySQL 开启慢查询日志与普通日志
一.开启满查询日志 1.查看慢查询日志 SHOW VARIABLES LIKE '%slow%'; 2.开启慢查询日志 set GLOBAL slow_query_log =on; 3.设置慢查询日志 ...
- 《OKR工作法》——打造一支专一的团队
<OKR工作法>在最开始讲了这样一个故事,阿塔兰忒是斯巴达跑的最快的人,她的父亲为了将她嫁出去举办了一场跑步比赛并许诺冠军可以娶自己的女儿,阿塔兰忒为了不结婚决定参加比赛自己拿冠军.然而在 ...
- 2019-8-26 LinkedHashMap 转 List [java.util.LinkedHashMap cannot be cast to com.zq.dataservice.bean.Index]
java.util.LinkedHashMap cannot be cast to com.zq.dataservice.bean.Index 上述错误是在做一个趋势投资demo时遇到的. 说的是链式 ...