目标需求
- TWS层的Mock工具,需要结合monkey工具;
- 代码无关;
- Cookie使用服务器返回的cookie,body采用mockserver返回的数据;
- 需要新增mock模拟规则:
- 接口正常回包;
- 接口字段缺失模拟,随机字段模拟构造或者遍历模拟所有字段缺失
- 字段类型自动模拟,(如整形,字符串,浮点型,url):
空or null、超大、超长、非正确类型,特殊字符,随机一个不存在的数据;
-
- 非标准jsonp
方案
Rap-Fiddler调用流程图
RAP使用简介
- RAP是什么东东:
- 阿里开源的前端mock工具,适合前后端分离,提高前端开发效率;
- 对比fiddler:
- RAP有接口文档,按照规则进行mock;
- 除mock功能外,RAP可以进行接口字段检查;
- 一行代码即可引入到页面;
- 对比legos: legso强在发布,混淆等功能,重在持续集成;RAP有mock功能;
- RAP系统部署
- url:http://192.168.145.30:8888/org/index.do
- 服务器IP:192.168.145.30
- 安装包:RAP-0.14.0-SNAPSHOT.war
- 依赖:tomcat,mysql,redis
- 建库建表:
create database rap_db default charset utf8 COLLATE utf8_general_ci;
grant all on rap_db.* to 'rap'@'localhost' IDENTIFIED BY 'password';
flush privileges;
mysql -u rap -p rap_db < ROOT/WEB-INF/classes/database/initialize.sql
-
- 修改配置文件:ROOT/WEB-INF/classes/config.properties
jdbc.username=rap
jdbc.password=password
-
- redis配置为对应ip:port
- tomcat配置:略
-
基本使用教程: http://thx.github.io/RAP/study.html
如何在页面中使用RAP
1、 Fiddler中映射html,将RAP的插件js使用映射的方式进行引入;
2、 Js的路径:RAP系统项目下的配置中可以获取js路径;
- 修改fiddler脚本如何直接替换接口返回数据
Fiddler->CustomizeRules添加如下代码:
发起请求->fiddler持有source request->获取mockerserver response body -> 获取 source response headers -> mockerserver response body替换 source response body –> 返回给app
1 static function OnBeforeRequest(oSession: Session) { 2 Moker(oSession,"OnBeforeRequest"); 3 ..... 4 } 5 6 static function OnBeforeResponse(oSession: Session) { 7 Moker(oSession,"OnBeforeResponse"); 8 .... 9 } 10 11 static var mokerbody; 12 static var moekerdomain = "192.168.145.30:8888/mockjs/" 13 static var domainmap = { 14 "wqdeal2.jd.com" : moekerdomain + "1" 15 }; 16 static function Moker(oSession: Session, type: String){ 17 var key = ""; 18 for( key in domainmap){ 19 if( oSession.url.IndexOf(key) >= 0){ 20 switch(type){ 21 case "OnBeforeRequest": 22 FiddlerObject.log("get mocker server body"); 23 oSession.fullUrl = oSession.fullUrl.Replace(key,domainmap[key]); 24 //FiddlerObject.utilIssueRequest(oSession.RequestHeaders.HTTPMethod + " " + oSession.fullUrl.Replace(key,domainmap[key]) + " " + oSession.RequestHeaders.HTTPVersion + " " +oSession.RequestHeaders.ToString() + " " + oSession.GetRequestBodyAsString()); 25 var oSD = new System.Collections.Specialized.StringDictionary(); 26 var mockersession = FiddlerApplication.oProxy.SendRequestAndWait(oSession.RequestHeaders,oSession.requestBodyBytes,oSD,null); 27 mokerbody = mockersession.ResponseBody.Clone(); 28 oSession.fullUrl = oSession.fullUrl.Replace(domainmap[key],key); 29 FiddlerObject.log("request mocker server done : " + oSession.RequestHeaders.ToString()) 30 break; 31 32 case "OnBeforeResponse": 33 FiddlerObject.log("replace Responsebody"); 34 oSession.ResponseBody = mokerbody; 35 break; 36 default:{ 37 break; 38 } 39 } 40 41 42 }else{ 43 continue; 44 } 45 }}
- 返回mockjs模板或直接返回mock数据
例:192.168.145.30:8888/mockjsdata/1/orderinfo ---- >返回orderinfo的mock数据,而非模板
Mockjsdata : 返回接口录入时的值
Mockjs:在录入接口文档后,如果使用mock规则进行mock,则根据规则返回符合mock.js的模板json,之后由插件中的mock.js解释成对应的json数据;
- Mock规则写法 :见 http://mockjs.com/examples.html
例如:
变量名 备注
id|+1 @mock=1000
//id从1000开始每次请求+1;
Fiddler脚本编写简介
CustomizeRules 中handler对象常用方法的调用点
OnPeekAtRequestHeaders :This function is called immediately after a set of request headers has been read from the client
OnPeekAtResponseHeaders : session has response streaming enabled, then the OnBeforeResponse function is actually called AFTER the response was returned to the client.
OnExecAction : fiddler命令定义;
遇到的问题记录
错误一、没有考虑到原生的app无法映射html文件从而加载
错误二、只修改域名,没有考虑到cookie错误,app会报错;
错误三:
需要先拦截请求在发送,不然如果加载beforeresuqest/afterresponse之后会引起无限循环请求
错误四
Fiddler script 中 session的2个header(request/response)无法修改,只能修改body
错误五:
FiddlerObject.utilIssueRequest中的url必须要fullurl,而直接用session.oRequest对象,其url为shorturl(不包含域名),无法请求,需要自己拼接请求包;
错误六 做好的mock数据有些会成为js代码,初步估计用来生成序列数组使用,但由于直接请求所以显示为代码;有次类推,ali的js插件的所有功能我估计都有可能需要重新实现一遍(白名单:同域名下有些接口不需要映射可以通过加长函数名来区分)
错误七 rap在保存数据时,其属性未对值进行校验,输错保存正常;但请求时会引起报错;