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

         基于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;
flex

public class AMFDemo {url

    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$
spa

  若是以上链接测试成功以后,那么接下来的问题就好解决了,那就是模拟并发,对于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的通讯机制描述不免有误。但这里并不仅是记录如何实现一种压力测试,而是表达一种我的对于性能测试思想的理解,不少时候不要一味地去追求自动化工具的强大,而忽略了其性能测试自己的思想。但愿能经过不断总结,来逐步提升本身!
相关文章
相关标签/搜索