深入剖析Flex程序性能测试

在学习Flex的过程中,你可能会遇到Flex程序性能测试方面的问题,这里和大家分享一下,本文重点介绍性能测试中如何处理Flex的AMF消息。本文采用的测试工具是TheGrinder,开发语言是Jython和Java。

Flex程序性能测试

Adobe的Flex已经越来越流行,但是Flex程序的性能测试却还没有很好的工具。包括著名的性能测试工具LoadRunner都还没有对新版本Flex性能测试有很好的支持。笔者在实际工作的研究中,发现了一个好的测试Flex程序的方式。本文重点介绍性能测试中如何处理Flex的AMF消息。本文采用的测试工具是TheGrinder,开发语言是Jython和Java。
 
1.Flex程序性能测试的困惑

Flex默认使用的是AMF协议进行传输。AMF协议在浏览器与Server端的交互是通过HTTP协议进行传输,如图1-1。Client端发到Server端:首先是ActionScript的对象,包装进AMFMessage,AMFMessage对象再被序列化成二进制数组,存入HTTPPOST请求的Data域中,数据传到服务器后,反序列化成Java版AMFMessage对象,Server端Flex框架再把AMFMessage中的业务对象取出来发送到对应的服务器端Java对象。Server端到Client端是类同的。

图1-1FlexAMFMessage的传输

深入剖析Flex程序性能测试

当用脚本录制器把AMFMessage录制下来时,是一串人不可读的二进制数组。
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'),))

如果不需要对发出去的AMFMessage做任何参数化,直接回放脚本即可。但是如果想要看懂AMF消息里面的内容,或者需要依据实际情况修改AMF消息中的内容后再发出去,那么就要想办法把二进制的数组解析出来。如前面所诉,这个二进制的数组,其实是AMFMessage对象序列化后的数据。可惜的是,这个序列化算法是Adobe自定义的,普通的Java反序列化,并不能解析出来,并且解析成AMFMessage对象以后,还需要重新序列化成二进制,发送到服务器端。笔者曾经尝试过多种办法解析和编码AMFMessage对象,最后找到一个方法可以很好的编码和解析AMFMessage,并在实际测试中予以运用,这个方法同时适用于TheGrinder,和LoadRunner。

2.解析和编码FlexAMFMessage

首先在已部署的Flex应用程序中找到flex-messaging.jar、flex-messaging-common.jar两个包,通常在war/WEB-INF/lib目录下。
开启Eclipse创建一个JavaObject引用这两个包,创建一个类AMFTransformer,专门负责解析和编码AMFMessage。
载入以下对象:
importflex.messaging.io.SerializationContext;
importflex.messaging.io.amf.ActionContext;
importflex.messaging.io.amf.ActionMessage;
importflex.messaging.io.amf.AmfMessageDeserializer;
importflex.messaging.io.amf.AmfMessageSerializer;

解码,二进制到AMFMessage对象,利用AmfMessageDeserializer类:

深入剖析Flex程序性能测试

AMFMessage解析成Java对象后,可以根据实际需要做任意的修改。

深入剖析Flex程序性能测试

编码,AMFMessage对象到二进制数组,利用AmfMessageSerializer类:

深入剖析Flex程序性能测试

注:AmfMessageSerializer,AmfMessageDeserializer的构造函数在不同版本中略有差异,可能需要SerializationContext作为构造函数的参数。
AMFMessage解析成对象后,为了更加方便测试人员阅读和理解,可以利用开源包XStream把Java对象转储成XML。

3.Flex性能测试

能够把FlexAMFMessage消息解析和编码后,就可以利用传统的Web性能测试工具进行测试了。

4.后记

相关推荐