• 基于AMF协议的Flex应用程序的性能测试


    接触过Flex应用的,基本上对于其表现层的视觉效果都是非常赞赏的,也正是由于其华丽的外表掩盖了其诸多内在的缺陷,比如说响应速度、内存泄漏等等性能问题,对于大部分的Flex开发程序员或者是测试人员都是非常头痛的事情。本人最近就碰到基于Flex应用程序的性能测试,由于它本身的特殊性,通信组建、协议基本上都是Adobe自己开发的,所以基本上通用的测试工具对他支持都是不太理想的。通过一系列的摸索,最终还是得把注意力转移到Flex本身上来,全面去解析AMF协议,其实AMF协议还是走HTTP协议的,但从执行效率上来说,我们不能单纯通过HTTP协议来模拟其执行过程,因为中间必须要走AMF协议,虽然LoadRunner也有支持AMF协议,但AMF本身是需要Flash Player来支持,录制得到的脚本,不易于理解和分析,我们无法很好分析其执行过程,而且它封包和解包都是二进制格式,如果以这种方案去执行,我们就需要解析它每一次封包和解包过程,相当于要去深入到AMF协议包解析过程,这样就把简单的问题复杂化。本身对于C/S应用程序的性能测试,最大的问题就是数据包解析,通过LoadRunner去压测,就可能要面临丢包的情况。所以通常情况下,我们为了保证协议数据包传输的完整性,尽量去避开直接去与协议数据包打交道,而且是通过上层的封装方式进行请求,而不去干预内在的复杂过程,这样就既能保证数据传输的完整性,同时也保证与业务逻辑实现方式的一致性,达到真实环境的压测方案。

      下面我们将具体了解哈AMF协议,并通过模拟Client与Server实现AMF协议通信的连接方式来完成大并发的压力测试。

      AMF是Adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,从而为Flash 播放器与Flash Remoting网关通信提供了一种轻量级的、高效能的通信方式。

      模拟AMF请求与Server端建立通信,Adobe官方提供了一个Server端的通信服务就是BlazeDS,Flex将数据通过AMF协议转换成二进制格式进行传输给Server端的BlazeDS服务,然后BlazeDS再将数据解析成Java需要的格式,完成Flex客户端与Server端的通信过程。因此通过进一步分析发现,我们的目的就是要模拟AMF与BlazeDS建立连接,就解决了问题了。这里,就是利用Java来模拟AMF请求,通过AMFConnection连接Blazeds接口,具体Demo代码如下:

    package org.test.service.TestLogin;

    import flex.messaging.io.amf.client.AMFConnection;
    import flex.messaging.io.amf.client.exceptions.ClientStatusException;
    import flex.messaging.io.amf.client.exceptions.ServerStatusException;

    public class AMFDemo {

        public static void main(String[] args) {
            // 创建AMF连接
            AMFConnection amfCon = new AMFConnection();
          
            //连接 remote URL
            String url = http://localhost:8080/TestLogin/messagebroker/amf ;
             try{
                amfCon.connect(url);
            }catch(ClientStatusException cse){
                System.out.println(cse);
                return ;
            }
          
            TestLogin result ;  
            try{
                result = (TestLogin)amfCon.call("TestLogin.login","username","passwd");//传输对象的参数,登录用户、密码
            }catch(ClientStatusException ce){
                System.out.println(ce);
            }catch(ServerStatusException se){
                System.out.println(se);
            }
            amfCon.close();      
            System.out.println("Sucessfull!!!");
        }
    }
     $new_page$

      如果以上连接测试成功之后,那么接下来的问题就好解决了,那就是模拟并发,对于Java来说,那就是多线程的事儿了,通过多线程来控制实现并发用户量,完成BlaseDS接口的压力测试。多线程代码实现如下:

    package org.test.service.TestLogin;

    import flex.messaging.io.amf.client.AMFConnection;
    import flex.messaging.io.amf.client.exceptions.ClientStatusException;
    import flex.messaging.io.amf.client.exceptions.ServerStatusException;

    public class AMFDemo implements Runnable{

            public void run(){
            // 创建AMF连接
            AMFConnection amfCon = new AMFConnection();
           
            //连接 remote URL
            String url = http://localhost:8080/TestLogin/messagebroker/amf ;
            try{
                amfCon.connect(url);
            }catch(ClientStatusException cse){
                System.out.println(cse);
                return ;
            }
            //循环100次
            for(int i=0; i<100; i++){
                TestLogin result ;   
                try{
                    Thread.sleep(1000L);
                    long TestStart = System.currentTimeMillis();
                    result = (TestLogin)amfCon.call("TestLogin.login","username","passwd");//传输对象的参数,登录用户、密码
                    System.out.println("login:" + (System.currentTimeMillis() - TestStart));//打印出登录的响应时间
                }catch(ClientStatusException ce){
                    System.out.println(ce);
                }catch(ServerStatusException se){
                    System.out.println(se);
                }catch (final InterruptedException e) {
                    e.printStackTrace();
                }
            }
            amfCon.close();       
            System.out.println("Sucessfull!!!");
        }
    }   
       
    public class AMFDemoTest {
        //创建100个线程
        public static void main(String[] args) throws Exception {
            for (int i = 0; i < 100; i++) {
                Runnable runnable = new AMFDemo();
                new Thread(runnable).start();
            }
        }

    }
     
      通过Java模拟AMF请求与BlazeDS建立通信连接,完成基于AMF协议的Flex应用程序的压力测试,抛弃传统的工具压测方式,从而寻找最适合FLex本身的性能测试方案。当然,这个只是一种纯代码方式来实现,我们也可以借助通用工具来完成,至少在完成以上的代码实现过程,之后可以通过LoadRunner或者是JMeter来调用Java代码完成,不过似乎JMeter对于Java支持更方便。使用工具的目的其实为了采样压力测试的数据方便分析,而真正实现压力测试,其实不管是工具还是脚本,其实都是通过模拟底层的交互方式来达到同样的目的。

      作为一名测试人员,对于Java与Flex的通信方式的理解远不如开发人员,所以可能以上对于BlazeDS的通信机制描述难免有误。但这里并不只是记录如何实现一种压力测试,而是表达一种个人对于性能测试思想的理解,很多时候不要一味地去追求自动化工具的强大,而忽略了其性能测试本身的思想。希望能通过不断总结,来逐步提高自己!
     
    -------------------------------------
     
    路径地址:找到安装程序自带的lrunnerChsprerequisitesvc2005_sp1_redist,双击运行vcredist_x86.exe,再重新安装LoadRunner即可成功。
  • 相关阅读:
    编程算法
    JDBC连接MySQL数据库及演示样例
    CKEditor&ckfindtor
    从零開始开发Android版2048 (五) 撤销的实现
    TCP/IP之分层
    poj2239 Selecting Courses --- 二分图最大匹配
    英尺到米的换算
    概率dp ZOJ 3640
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!
  • 原文地址:https://www.cnblogs.com/gmeihe17/p/11283707.html
Copyright © 2020-2023  润新知