我只是一个喜欢开发的测试,喜欢测试的开发,喜欢每天都知道得更多一些,更深入一些的感觉。。。。。
分类: Windows平台
2014-05-15 21:16:07
Loadrunner测试Flex网站
最近要测试的一个网站,页面包含大量Flex控件,如果按一般的网站那样,在录制Loadrunner脚本的时候只选Web(HTTP/HTML)协议,也能回放,但amf请求及响应由于报文内容被afm协议封装成二进制格式,在Loadrunner的HTTP View中显示的是乱码,如下图所示:
图1 只选用Web(HTTP/HTML)协议时amf请求
图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按钮确认创建脚本
图3在新建虚拟用户对话框中选择AMF和Web两个协议
2. 添加jar包及class文件
在上一节最后点击Create按钮后即跳转到脚本窗口,同时弹出开始录制(Start Recording)对话框。但这时候我们还不能录制脚本,因为将要录制的脚本中将会用到一些jar包和class文件需先添加进来,不然的话,录制完后保存脚本的时候会报错找不到类。
图4 未添加网站jar包及class文件录制脚本报错信息
并且脚本中不会以正确的发送amf请求的amf_call()函数发送请求,而是用如web_custom_request()等其他函数,请参考图7和图8。
1) 取网站服务器上对应应用WEB-INFO目录下的lib和class文件夹,放到脚本所在机器上的固定路径下,路径最好不要包含中文;
2) 打开脚本文件夹下的default.cfg文件,在[FLEX]节的FlexJarFiles属性中添加所有jar包和class文件的绝对路径+文件名,例如我将lib放在D根目录下,则添加其下面的common.jar则应为“D: \lib\common.jar”,每个文件名之后加上分号,包括最后一个文件名。
需要说明的一点是:在Loadrunner中如果创建的是Flex协议脚本,则可以在 图形界面上直接添加jar包和class文件,方法是:点击Tools/Recording Options菜单项,打开录制选项对话框,在Flex/Externalizable Objects页面,"Serialize objects using"选择"Custom Java Classes",然后点击按钮添加jar包,或点击按钮添加class文件。
图5 Flex协议脚本可以在图形界面上直接添加jar包和class文件
但是,选择AMF协议的脚本,在录制选项对话框中是没有AMF/Externalizable Objects页面来添加jar包和class文件的,因此我们用上面的方法来添加这些文件。同时我们还发现如果先创建了一个Flex协议脚本,后续再创建Flex或AMF协议脚本,会默认添加之前那个Flex脚本中添加的jar包和class文件。
3. 录制
在下图所示对话框的URL Address文本框中填入要测试网站的URL
图6 开始录制对话框中填入要测试的网站URL
点OK按钮即开始录制脚本。录制脚本和录制其他单Web协议的脚本一样,在此不再赘述。
对比一下选用Web单协议和选用AMF/Web双协议录制出来的脚本,可以发现
1) 在Web单协议时,发送amf请求用的是web_custom_request()函数,而在AMF/Web双协议时用的是amf_call()函数,当然前提是有正确添加所有解析afm报文的jar包和class文件,请参考第2部分;
图7 Web单协议录制的脚本中afm请求
图8 AMF/Web双协议录制的脚本中afm请求
2) 在Web单协议时,报文内容为乱码无法解析,如图1和图2所示,而在在AMF/Web双协议时报文内容可以解析成XML的格式
图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格式)就会保存到该变量中
图10 保存amf响应到变量respDSID
2) 解析amf响应
在第一个amf请求之后,用lr_xml_get_values()函数解析保存到变量中的amf响应xml字符串,并将得到的DSID保存到另一个变量中
图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个量
图12 关于amf响应XML中同路径下值的解析
例如对于上图中的情形,我们需要获取的是第二个string标签值,则为dsid_2。
3) 替换amf请求中的DSID值
从第二个amf请求开始,替换所有这些请求中的DSID值
图13 自第二个amf请求起用变量dsid替换DSID值
至此,测试Flex网站的Loadrunner脚本基本上完成,其他一些关联可以根据需要,和DSID的关联类似操作即可。