基于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!!!"); } }
复制代码

如果以上连接测试成功之后,那么接下来的问题就好解决了,那就是模拟并发,对于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的通信机制描述难免有误。但这里并不只是记录如何实现一种压力测试,而是表达一种个人对于性能测试思想的理解,很多时候不要一味地去追求自动化工具的强大,而忽略了其性能测试本身的思想。希望能通过不断总结,来逐步提高自己!













本文转自一米一阳光博客园博客,原文链接:http://www.cnblogs.com/candle806/archive/2012/05/09/2492009.html    ,如需转载请自行联系原作者

相关文章
|
5月前
|
监控 安全 Shell
管道符在渗透测试与网络安全中的全面应用指南
管道符是渗透测试与网络安全中的关键工具,既可用于高效系统管理,也可能被攻击者利用实施命令注入、权限提升、数据外泄等攻击。本文全面解析管道符的基础原理、实战应用与防御策略,涵盖Windows与Linux系统差异、攻击技术示例及检测手段,帮助安全人员掌握其利用方式与防护措施,提升系统安全性。
246 6
|
安全 JavaScript 前端开发
AppSpider 7.5.020 发布 - Web 应用程序安全测试
AppSpider 7.5.020 for Windows - Web 应用程序安全测试
126 0
|
4月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
662 11
|
4月前
|
消息中间件 运维 应用服务中间件
“企业微信iPad协议”凌晨断链:当最后一台测试机决定集体沉默
凌晨1:12,三连报警突响:“实例心跳超时”“消息队列堆积”“老板提刀赶来”。问题源于企业微信iPad协议迁移私有化后,因新旧CA根证书不兼容,触发TLS握手失败,导致全量会话中断。苹果严苛的证书校验机制将请求判定为中间人攻击,直接断连。排查抓包定位:客户端内置证书Pin仅认旧根。解决方案简单却关键:F5重导旧根证书,Nginx配置`ssl_trusted_certificate`指向旧链并reload。2:58,系统恢复,演练数据零丢失。教训深刻:文档未提CA白名单,真实逻辑藏于客户端二进制。部署前务必比对证书指纹,否则警报先于用户消息抵达。
224 1
|
4月前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
151 4
|
5月前
|
搜索推荐 Devops 测试技术
避免无效回归!基于MCP协议的精准测试影响分析实践
本文揭示传统测试的"孤岛困境",提出MCP(Model Context Protocol)测试新范式,通过模型抽象业务、上下文感知环境和协议规范协作,实现从机械执行到智能测试的转变。剖析MCP如何颠覆测试流程,展示典型应用场景,并提供团队落地实践路径,助力测试工程师把握质量效率革命的新机遇。
|
8月前
|
监控 安全 测试技术
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
235 14
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
|
5月前
|
机器学习/深度学习 存储 分布式计算
Java 大视界 --Java 大数据机器学习模型在金融风险压力测试中的应用与验证(211)
本文探讨了Java大数据与机器学习模型在金融风险压力测试中的创新应用。通过多源数据采集、模型构建与优化,结合随机森林、LSTM等算法,实现信用风险动态评估、市场极端场景模拟与操作风险预警。案例分析展示了花旗银行与蚂蚁集团的智能风控实践,验证了技术在提升风险识别效率与降低金融风险损失方面的显著成效。
|
5月前
|
人工智能 IDE 测试技术
Browser-Use在UI自动化测试中的应用
Browser-Use是一款浏览器自动化工具,具备视觉与HTML解析、多标签管理、操作记录与复现、自定义操作、自我纠正及并行执行等功能,助力AI智能体高效完成网页任务。
590 0
|
8月前
|
安全 测试技术 Linux
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
289 2
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件