Flex程序性能测试
<P>简介:Adobe 的 Flex 已经越来越流行,但是 Flex 程序的性能测试却还没有很好的工具。包括著名的性能测试工具 LoadRunner 都还没有对新版本 Flex 性能测试有很好的支持。笔者在实际工作的研究中,发现了一个好的测试 Flex 程序的方式。本文重点介绍性能测试中如何处理 Flex 的 AMF 消息。 本文采用的测试工具是 The Grinder, 开发语言是 Jython 和 Java 。</P><P> 关键字:Flex 测试、 Flex 性能测试、 AMF Message 解码</P>
<P> <B> 1. Flex 程序性能测试的困惑</B></P>
<P> Flex 默认使用的是 AMF 协议进行传输。 AMF 协议在浏览器与 Server 端的交互是通过 HTTP 协议进行传输, 如图 1-1 。 Client 端发到 Server 端:首先是 Action Script 的对象,包装进 AMF Message , AMF Message 对象再被序列化成二进制数组,存入 HTTP POST 请求的 Data 域中, 数据传到<A class=nounderline title=服务器 href="http://server.it168.com/" target=_blank><FONT color=#0000ff>服务器</FONT></A>后,反序列化成 Java 版 AMF Message 对象, Server 端 Flex 框架再把 AMF Message 中的业务对象取出来发送到对应的<A class=nounderline title=服务器 href="http://product.it168.com/files/0402search.shtml" target=_blank><FONT color=#0000ff>服务器</FONT></A>端 Java 对象。 Server 端到 Client 端是类同的。<BR> </P>
<DIV id=div9033320 style="TEXT-ALIGN: center"><IMG id=img9033320 alt="" src="http://image4.it168.com/2009/7/7/e65bf396-944b-4cff-8e70-f3a7fc84f3a9.jpg" border=0></DIV>
<P> 图 1-1 Flex AMF Message 的传输</P>
<P> 当用脚本录制器把 AMF Message 录制下来时, 是一串人不可读的二进制数组。</P>
<P> result = request1201.POST( '/home/messagebroker/amfsecure' +</P>
<P> '?RND' ,</P>
<P> ( 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x04 ,</P>
<P> 0x6E , 0x75 , 0x6C , 0x6C , 0x00 , 0x02 , 0x2F , 0x31 ,</P>
<P> 0x00 , 0x00 , 0x00 , 0xCB , 0x0A , 0x00 , 0x00 , 0x00 ,</P>
<P> 0x01 , 0x11 , 0x0A , 0x81 , 0x13 , 0x4D , 0x66 , 0x6C ,</P>
<P> 0x31 , 0x30 , 0x37 , 0x37 , 0x34 , 0x32 , 0x45 , 0x31 ,</P>
<P> ... ,</P>
<P> 0x07 , 0x6E , 0x69 , 0x6C , 0x01 , 0x04 , 0x00 , ),</P>
<P> ( NVPair( 'Content-Type' , 'application/x-amf' ), ))</P>
<P> 如果不需要对发出去的 AMF Message 做任何参数化,直接回放脚本即可。 但是如果想要看懂 AMF 消息里面的内容,或者需要依据实际情况修改 AMF 消息中的内容后再发出去,那么就要想办法把二进制的数组解析出来。如前面所诉,这个二进制的数组,其实是 AMF Message 对象序列化后的数据。可惜的是,这个序列化算法是 Adobe 自定义的,普通的 Java 反序列化,并不能解析出来, 并且解析成 AMF Message 对象以后,还需要重新序列化成二进制,发送到服务器端。笔者曾经尝试过多种办法解析和编码 AMF Message 对象,最后找到一个方法可以很好的编码和解析 AMF Message ,并在实际测试中予以运用, 这个方法同时适用于 The Grinder, 和 LoadRunner 。</P>
<P> <B>2. 解析和编码 Flex AMF Message</B></P>
<P> 首先在已部署的 Flex 应用程序中找到 flex-messaging.jar 、 flex-messaging-common.jar 两个包, 通常在 war/WEB-INF/lib 目录下。</P>
<P> 开启 Eclipse 创建一个 Java Object 引用这两个包,创建一个类 AMFTransformer ,专门负责解析和编码 AMF Message 。</P>
<DIV class=w643 id=rcomment>
<P>载入以下对象:</P>
<P> import flex.messaging.io.SerializationContext;</P>
<P> import flex.messaging.io.amf.ActionContext;</P>
<P> import flex.messaging.io.amf.ActionMessage;</P>
<P> import flex.messaging.io.amf.AmfMessageDeserializer;</P>
<P> import flex.messaging.io.amf.AmfMessageSerializer;</P>
<P> 解码 , 二进制到 AMF Message 对象, 利用 AmfMessageDeserializer 类:</P>
<DIV id=div8940677 style="TEXT-ALIGN: center"><IMG id=img8940677 alt="" src="http://image4.it168.com/2009/7/7/1856d7d8-6963-4669-8e82-48e07224b0c8.jpg" border=0></DIV>
<P> AMF Message 解析成 Java 对象后,可以根据实际需要做任意的修改。</P>
<DIV id=div1666720 style="TEXT-ALIGN: center"><IMG id=img1666720 alt="" src="http://image4.it168.com/2009/7/7/01dc8cd7-41ad-4d11-8c41-4aeec5ce7451.jpg" border=0></DIV>
<P> 编码 , AMF Message 对象,到二进制数组, 利用 AmfMessageSerializer 类:</P>
<DIV id=div2995522 style="TEXT-ALIGN: center"><IMG id=img2995522 alt="" src="http://image4.it168.com/2009/7/7/1c3abc51-51e5-461c-92af-0bf9bccf9d5d.jpg" border=0></DIV>
<P> 注: AmfMessageSerializer , AmfMessageDeserializer 的构造函数在不同版本中略有差异,可能需要 SerializationContext 作为构造函数的参数。</P>
<P> AMF Message 解析成对象后,为了更加方便测试人员阅读和理解,可以利用开源包 XStream 把 Java 对象转储成 XML 。</P>
<P> <B> 3. Flex 性能测试</B></P>
<P> 能够把 Flex AMF Message 消息解析和编码后,就可以利用传统的 Web 性能测试工具进行测试了。</P>
<P> <B>4. 后记</B></P>
<P> 本文书写仓储,不可避免有遗漏错误之处,如有不对,还往不吝赐教。</P>
<P> 免责申明:</P>
<P> 本文纯属技术探讨,不对使用本方法是否侵犯他人版权负责。 请读者自行斟酌,或咨询 Adobe 公司确认该方法合法。</P>
<P> </P>
<P>转载自IT168</P><A href="http://tech.it168.com/a2009/0707/601/000000601835.shtml#comment"></A></DIV> 问下,,Grinder支持flex3开发的app么?
页:
[1]