阿里RAP+fiddler实现app原生应用的cgi数据mock----- (一)RAP+fiddler工具主流程部署调试

目标需求

  • 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在保存数据时,其属性未对值进行校验,输错保存正常;但请求时会引起报错;

不会炒菜的非专业测试人员
原文地址:https://www.cnblogs.com/carterzhang/p/6168978.html