基於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支持更方便。使用工具的目的其實爲了採樣壓力測試的數據方便分析,而真正實現壓力測試,其實不論是工具仍是腳本,其實都是經過模擬底層的交互方式來達到一樣的目的。