基於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的通訊機制描述不免有誤。但這裏並不僅是記錄如何實現一種壓力測試,而是表達一種我的對於性能測試思想的理解,不少時候不要一味地去追求自動化工具的強大,而忽略了其性能測試自己的思想。但願能經過不斷總結,來逐步提升本身!
相關文章
相關標籤/搜索