前言:
说到mock,大家会想到单测中的mock,测试同学会想到httpmock服务等。
mock的作用:程序运行过程中,设定过滤规则及返回值,来满足固定的数据解析,解决不容易构造或者获取的数据对象。
mock有哪些工具:
前端js端拦截mock.js
web端的mock工具apiary、swagger、alibaba-rap等
Java阵营中主要的Mock测试工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微软的.Net阵营中主要是Nmock,.NetMock
WEB应用MOCK:
web端的mock相对成熟,以http请求拦截为主,进行请求的数据的返回,从上面可以看到有2种方式本地拦截和proxy拦截
单一方式缺点:
1、本地拦截,无法模拟请求时延等特殊场景,本地数据维护复杂
2、proxy拦截,所有测试case环境需要做host处理,域名切换问题
组合方式优势:
1、使用者不需要host指定
2、可以模拟复杂场景(数据返回,时延,超时等)
3、模拟数据入口统一复用性高
组合的方式缺点:
1、controll层返回页面时,mock页面,业务改动即需变更,无法验证到真正生成页面逻辑,这种mock对测试没有价值
2、返回数据格式多样时,mock多种数据格式,服务接口复杂,使用成本较高,不利于业务快速迭代
web端的mock能解决80%的业务场景,但是真正的数据交互过程不能得到验证。
所以在web之外能不能做深度的mock服务,来满足自动化测试过程中业务逻辑的验证,减少web端mock服务的复杂性。
RPC服务的mock
RPC服务自动mock,如何帮助测试或开发同学快速mock一个scf服务?
首先,通过mock我们可以解决两大类问题:
一、第3方服务依赖:
1、一些服务写场景的覆盖(测试回归阶段,如被测服务调用写操作会产生脏数据的问题,mock掉依赖的imc写接口,返回已有信息,同时完成被测服务的整个逻辑验证)
2、服务深度依赖的问题(被测试服务A,A依赖B,B依赖CD,mock掉B解决了深度依赖的问题)
二、外部服务复杂,MOCK自身部分接口:
3、数据流转状态的模拟 (如担保支付调用微信返回状态)
stp帮你一键生成mock服务
stp工具提供:
1、界面操作创建mock服务
2、接口操作批量创建mock服务
3、服务接口数据在线维护,实时生效
4、mock服务提供下载,根据环境情况进行部署
具体流程如下:
接口使用方式:
接口定义:
createScfMock
updateScfMock
参数内容:
{"implClass":"","intfCalss":"","methods":[{"methodName":"","returnRes":"","stat":0}],"pom":"","realServerIp":"","realServerPort":"","serviceName":""}
参数描述:
类型 |
参数 |
描述 |
String |
pom |
pom.xml字符串 |
String |
serviceName |
部署服务名 |
String |
implClass |
接口实现类 |
String |
intfCalss; |
接口类例如:com.ITest |
String |
realServerIp |
真实服务ip |
String |
realServerPort |
真实服务端口 |
String |
methodName |
方法名称 |
String |
returnRes |
返回值 |
int |
stat |
mock状态 0关闭,1打开 |
创建接口返回结果:
{"errorCode":"0","ip":"","port":"","serviceName":""}
类型 |
参数 |
描述 |
String |
errorCode |
0成功,1失败,2服务被占用 |
String |
serviceName |
服务名称 |
String |
ip |
服务ip |
String |
port |
服务端口 |
更新接口返回
[{"stat":true,"info":""}]
类型 |
参数 |
描述 |
String |
stat |
true/false |
String |
info |
失败方法信息 |
例子:
创建
请求如下:
http://stp.corp.com/createMock?jsonData=[{"serviceName":"test","realServerName":"phone","creater":"hhh","implClass":"PhoneRecordService","intfCalss":"com.phone.IPhoneRecord","methods":[{"methodName":"getRec","returnRes":"11","stat":0}],"pom":"
返回结果:
[{"errorCode":2,"info":"","ip":"192.168.183.14","port":"19999","serviceName":"hhtest"}]
更新
请求如下:
http://stp.corp.com/updateMock?jsonData=[{"serviceName":"hhbtest","realServerName":"wphone","creater":"name","implClass":"WPhoneRecord","intfCalss":"com.s.IPhoneRecord","methods":[{"methodName":"getRecordList","returnRes":"11","stat":0}],"pom":"
返回结果:
[{"stat":true,"info":""}] 通过无方法信息,失败会返回方法名称
后记:
一点点实践,希望对大家有所启发!