Loadrunner11测试Flex网站

注:

       这篇文档很早之前,应该是13、14年的样子就有发到这儿,之后很久很久没再继续写博客了,这次重新开始,发现已经没了,太久了过期了吧。


    最近要测试的一个网站,页面包含大量Flex控件,如果按一般的网站那样,在录制Loadrunner脚本的时候只选Web(HTTP/HTML)协议,也能回放,但amf请求及响应由于报文内容被afm协议封装成二进制格式,在Loadrunner的HTTP View中显示的是乱码,如下图所示:

Loadrunner11测试Flex网站

图1 只选用Web(HTTP/HTML)协议时amf请求

Loadrunner11测试Flex网站

图2 只选用Web(HTTP/HTML)协议时amf响应

 

因此无法获取到需要关联的字段值,比如对查询结果作进一步操作的时候,需要先获取到查询结果中的ID等字段。

 

    经多次尝试,我们很好地解决了这个问题,以下是我们认为在录制这类脚本的时候需要注意的几个方面:

  

1.      协议选择

1)     打开VUG

    打开Loadrunner的Virtual User Generator,比如在我的机器上是在开始菜单àHP LoaderunneràApplicationàVirtual User Generator;

 2)     创建新的脚本

    点击FileàNew,弹出New Virtual User对话框

 

3)     选择协议

    A.      在新建虚拟用户(New Virtual User)对话框的左边选择脚多协议脚本类型(New Multiple Protocol Script);

    B.       在可用协议(Available Protocols)中选中Action Message Format(AMF)和Web(HTTP/HTML);

    C.       点击中间的à按钮将这两个协议放至已选协议(Selected Protocols)中;

    D.      点击底下的Create按钮确认创建脚本

                                    Loadrunner11测试Flex网站

图3在新建虚拟用户对话框中选择AMF和Web两个协议

  

2.      添加jar包及class文件

    在上一节最后点击Create按钮后即跳转到脚本窗口,同时弹出开始录制(StartRecording)对话框。但这时候我们还不能录制脚本,因为将要录制的脚本中将会用到一些jar包和class文件需先添加进来,不然的话,录制完后产生脚本的时候会报错找不到类。

Loadrunner11测试Flex网站

图4 未添加网站jar包及class文件录制脚本报错信息

      

并且脚本中不会以正确的发送amf请求的amf_call()函数发送请求,而是用如web_custom_request()等其他函数,请参考图7和图8。

 

    1)     取网站服务器上对应应用WEB-INFO目录下的lib和classes文件夹,放到脚本所在机器上的固定路径下,路径最好不要包含中文;

    2)     打开脚本文件夹下的default.cfg文件,在[FLEX]节的FlexJarFiles属性中添加所有jar包和class文件的绝对路径+文件名,例如我将lib放在D根目录下,则添加其下面的common.jar则应为“D: \lib\common.jar”,每个文件名之后加上分号,包括最后一个文件名。

 

需要说明的一点是:在Loadrunner中如果创建的是Flex协议脚本,则可以在图形界面上直接添加jar包和class文件,方法是:点击Tools/Recording Options菜单项,打开录制选项对话框,在Flex/ExternalizableObjects页面,"Serializeobjects using"选择"Custom Java Classes",然后点击 Loadrunner11测试Flex网站按钮添加jar包,或点击Loadrunner11测试Flex网站 按钮添加class文件。

Loadrunner11测试Flex网站

图5 Flex协议脚本可以在图形界面上直接添加jar包和class文件

 

但是,选择AMF协议的脚本,在录制选项对话框中是没有AMF/Externalizable Objects页面来添加jar包和class文件的,因此我们用上面的方法来添加这些文件。同时我们还发现如果先创建了一个Flex协议脚本,后续再创建Flex或AMF协议脚本,会默认添加之前那个Flex脚本中添加的jar包和class文件。

  

3.      录制

在下图所示对话框的URL Address文本框中填入要测试网站的URL

Loadrunner11测试Flex网站

图6开始录制对话框中填入要测试的网站URL

 

点OK按钮即开始录制脚本。录制脚本和录制其他单Web协议的脚本一样,在此不再赘述。

 

对比一下选用Web单协议和选用AMF/Web双协议录制出来的脚本,可以发现

    1)     在Web单协议时,发送amf请求用的是web_custom_request()函数,而在AMF/Web双协议时用的是amf_call()函数,当然前提是有正确添加所有解析afm报文的jar包和class文件,请参考第2部分;

Loadrunner11测试Flex网站

图7 Web单协议录制的脚本中afm请求

 

Loadrunner11测试Flex网站

图8 AMF/Web双协议录制的脚本中afm请求

 

    2)     在Web单协议时,报文内容为乱码无法解析,如图1和图2所示,而在在AMF/Web双协议时报文内容可以解析成XML的格式

Loadrunner11测试Flex网站

图9 AMF/Web双协议录制的脚本报文内容可以解析成XML格式

 

4.      关联

    AMF脚本最关键的是要关联DSID,DSID是AMF协议的会话ID,是一个格式为“8位16进制数字+中划线+4位16进制数字+中划线+4位16进制数字+中划线+4位16进制数字+中划线+12位16进制数字”,共36个字符组成的字符串,如“44DEE526-C71A-5FAB-B08E-A167DB437874”。在每个会话的第一个AMF请求的响应中服务器返回给客户端,从这以后的每个AMF请求都必须带上这个DSID值。 

    由此可见,如果不关联DSID,脚本回放的时候可能不会有问题,但多用户并发的场景中,如果所有的会话都用一个DSID,服务端就会返回重复会话ID错误。 

    关联DSID的方法如下:

    1)     保存amf响应到变量

    在第一个amf请求的"Snapshot=t51.inf"和MESSAGE之间添加"ResponseParameter=变量名",在此变量名为respDSID,这样该请求的响应字符串(xml格式)就会保存到该变量中

Loadrunner11测试Flex网站

图10 保存amf响应到变量respDSID

 

    2)     解析amf响应

    在第一个amf请求之后,用lr_xml_get_values()函数解析保存到变量中的amf响应xml字符串,并将得到的DSID保存到另一个变量中

Loadrunner11测试Flex网站

图11 解析amf响应respDSID保存DSID到变量dsid

 

需要说明一下lr_xml_get_values()的参数:

    A.      第一个参数是amf响应字符串,格式为"XML={保存amf响应的变量名}",在我们这个例子里面就是respDSID;

  B.    第二个参数是想要得到的标签值在amf响应XML中的路径,格式为"Query=路径",路径可以通过查看TreeàRecoding,Response,XML来得到;

    C.      第三个参数是获取到的标签值保存的参数,格式为"ValueParam=变量名",此为dsid,需要注意的是,如果相同的路径下有多个值的话,那么这个变量实际上相当于一个数组,使用的时候可以在变量名后加“_N”来取第N个量

Loadrunner11测试Flex网站

图12 关于amf响应XML中同路径下值的解析

 例如对于上图中的情形,我们需要获取的是第二个string标签值,则为dsid_2。

 

    3)     替换amf请求中的DSID值

    从第二个amf请求开始,替换所有这些请求中的DSID值

Loadrunner11测试Flex网站

图13 自第二个amf请求起用变量dsid替换DSID值

 

    至此,测试Flex网站的Loadrunner脚本基本上完成,其他一些关联可以根据需要,和DSID的关联类似操作即可。