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

    不会炒菜的非专业测试人员
  • 相关阅读:
    leetcode_24. 两两交换链表中的节点
    Mysql大数据量分页优化
    MySQL 默认排序是什么
    spring注入map,spring注入一个接口的多个实现类在map里
    eureka缓存细节以及生产环境的最佳配置
    MySQL 5.7性能调优
    安装后的十个MySQL性能调整设置(版本:5.1、5.5 和5.6)
    docker部署tomcat应用和MySQL数据库
    MySQL热备工具Xtrabackup
    MySQL数据库的冷备方式
  • 原文地址:https://www.cnblogs.com/carterzhang/p/6168978.html
Copyright © 2011-2022 走看看