Flex 程序性能测试
作者:叶晖俊 yehuijun2001@163.com
2008年4月11日
注: Flex程序的性能测试, 作者叶晖俊。 本文版权归属作者所有,可以自由转载,但是必须注明出处和作者,否则将追究法律责任。
简介:Adobe的Flex 已经越来越流行,但是Flex程序的性能测试却还没有很好的工具。包括著名的性能测试工具LoadRunner都还没有对新版本Flex性能测试有很好的支持。笔者在实际工作的研究中,发现了一个好的测试Flex程序的方式。 本文重点介绍性能测试中如何处理Flex的AMF消息。 本文采用的测试工具是The Grinder, 开发语言是Jython和Java。
关键字:Flex 测试、 Flex性能测试、 AMF Message 解码
1. Flex 程序性能测试的困惑
Flex默认使用的是AMF协议进行传输。 AMF协议在浏览器与Server端的交互是通过HTTP协议进行传输, 如图1-1 。Client端发到Server端:首先是Action Script 的对象,包装进AMF Message, AMF Message 对象再被序列化成二进制数组,存入HTTP POST请求的Data 域中, 数据传到服务器后,反序列化成Java版AMF Message对象, Server 端Flex框架再把AMF Message中的业务对象取出来发送到对应的服务器端Java对象。Server端到Client端是类同的。
图1-1 Flex AMF Message的传输
当用脚本录制器把AMF Message录制下来时, 是一串人不可读的二进制数组。
result = request1201.POST('/home/messagebroker/amfsecure' +
'?RND',
( 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04,
0x6E, 0x75, 0x6C, 0x6C, 0x00, 0x02, 0x2F, 0x31,
0x00, 0x00, 0x00, 0xCB, 0x0A, 0x00, 0x00, 0x00,
0x01, 0x11, 0x0A, 0x81, 0x13, 0x4D, 0x66, 0x6C,
0x31, 0x30, 0x37, 0x37, 0x34, 0x32, 0x45, 0x31,
...,
0x07, 0x6E, 0x69, 0x6C, 0x01, 0x04, 0x00, ),
( NVPair('Content-Type', 'application/x-amf'), ))
如果不需要对发出去的AMF Message做任何参数化,直接回放脚本即可。 但是如果想要看懂AMF消息里面的内容,或者需要依据实际情况修改AMF消息中的内容后再发出去, 那么就要想办法把二进制的数组解析出来。如前面所诉,这个二进制的数组,其实是AMF Message对象序列化后的数据。 可惜的是,这个序列化算法是Adobe自定义的,普通的Java反序列化,并不能解析出来, 并且解析成AMF Message对象以后,还需要重新序列化成二进制,发送到服务器端。笔者曾经尝试过多种办法解析和编码AMF Message对象, 最后找到一个方法可以很好的编码和解析AMF Message,并在实际测试中予以运用, 这个方法同时适用于The Grinder, 和LoadRunner。
2. 解析和编码Flex AMF Message
首先在已部署的Flex应用程序中找到 flex-messaging.jar、 flex-messaging-common.jar 两个包, 通常在 war/WEB-INF/lib目录下。
开启Eclipse 创建一个Java Object 引用这两个包,创建一个类 AMFTransformer,专门负责解析和编码AMF Message。
载入以下对象:
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.ActionContext;
import flex.messaging.io.amf.ActionMessage;
import flex.messaging.io.amf.AmfMessageDeserializer;
import flex.messaging.io.amf.AmfMessageSerializer;
解码, 二进制到AMF Message对象,利用AmfMessageDeserializer类:
AMF Message 解析成Java对象后,可以根据实际需要做任意的修改。
注: message 对象为ActionMessage类的一个实例
编码, AMF Message对象,到二进制数组, 利用AmfMessageSerializer类:
注:AmfMessageSerializer,AmfMessageDeserializer 的构造函数在不同版本中略有差异,可能需要SerializationContext 作为构造函数的参数。
AMF Message解析成对象后,为了更加方便测试人员阅读和理解,可以利用开源包XStream把 Java 对象转储成XML。
3. Flex 性能测试
能够把Flex AMF Message消息解析和编码后,就可以利用传统的Web性能测试工具进行测试了。 关于传统Web程序的性能测试,请参见笔者另外一篇文章《电子商务系统的性能测试》。
4. 后记
本文书写仓储,不可避免有遗漏错误之处,如有不对,还往不吝赐教。 另外本人还提供电子商务系统的性能咨询服务。如有需要,请在本人博客上留言,或EMAIL给我。
免责申明:
本文纯属技术探讨,不对使用本方法是否侵犯他人版权负责。 请读者自行斟酌,或咨询Adobe公司确认该方法合法。
注: 《Flex程序性能测试》, 作者叶晖俊, yehuijun2001@163.com。 本文版权归属作者所有,可以自由转载,但是必须注明出处和作者,否则将追究法律责任。