如何对下载附件或图片操作进行脚本开发?
我们将一个.rar的压缩包作为附件放在一个帖子中,录制访问下载该附件的脚本。
//首页访问,登录等代码略… web_url("测试下载附件的脚本", "URL=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", "TargetFrame=_blank", "Resource=0", "RecContentType=text/html", "Referer=http://localhost:8000/phpwind85/thread.php?fid=2&page=14", "Snapshot=t62.inf", "Mode=HTML", EXTRARES, "Url=images/bbsradio.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/pwicon/add_mes.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/wind85/reply.png?101129", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/pwicon/add_fol.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/pwicon/shareAll.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/wind85/read/yin.gif", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/pwicon/add_home.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/pwicon/add_fri.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/pwicon/add_pro.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/wind85/read/userOper.gif", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/button.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=js/breeze/editor/style/B_ico.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, LAST); web_url("job.php", "URL=http://localhost:8000/phpwind85/job.php?action=download&aid=1&check=1&nowtime=1316500425560&verify=1083974f", "TargetFrame=", "Resource=0", "RecContentType=text/xml", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", "Snapshot=t63.inf", "Mode=HTML", EXTRARES, "Url=u/images/pre.cur", "Referer=http://localhost:8000/phpwind85/read. php?tid=4&fpage=14", ENDITEM, "Url=images/blank.gif", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=u/images/next.cur", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/search/pImg_close.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=images/search/pImg.png", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, "Url=job.php?action=download&aid=1&mt=", "Referer=http://localhost:8000/phpwind85/read.php?tid=4&fpage=14", ENDITEM, LAST); |
当代码列出后,我们会发现好像在整个代码中并没有下载的请求,更没有弹出下载对话框的函数,也没有保存位置设置对应的代码,岂不是下载没有被录制到?
在进一步分析以后会发现下载的操作是由job.php?action=download&aid=1&mt=这个请求完成的,但这个请求并没有单独被录制出来。这是因为VuGen认为这个操作是在当前页面产生的,并没有跳转页面,所以被认为是请求中的一个附属请求,于是该请求被算在EXTRARES内了。在脚本回放的时候其实该附件是被下载的,可以通过回放日志中的请求总大小来区分。这种做法在以后的响应时间分析时会带来一些影响,所以最好把这个请求从主请求中分离出来单独处理,这个时候Non-Resource设置就能派上用场了。
通过对请求格式的分析可以发现点击一个RAR格式的附件下载,HTTP数据包中的格式为application/zip,我们在Non-Resource中设置这个格式,如图A.32所示。
图A.32 将application/zip设置为Non Resources
然后我们再次录制点击附件下载的操作,就会发现代码变为:
web_url("测试下载附件的脚本", "URL=http://172.168.1.200:8000/phpwind85/read.php?tid=4&page=e", "TargetFrame=", "Resource=0", "RecContentType=text/html", "Referer=http://172.168.1.200:8000/phpwind85/index.php", "Snapshot=t54.inf", "Mode=HTML", EXTRARES, "Url=images/wind85/post.png?101129", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/wind85/reply.png?101129", "Referer=http://172.168.1.200: 8000/phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/wind85/breadEm.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/bbsradio.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/pwicon/add_adm.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/pwicon/add_home.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/pwicon/add_fri.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/pwicon/add_pro.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/pwicon/shareAll.png", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/wind85/read/yin.gif", "Referer=http://172.168.1.200:8000/ phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=images/wind85/read/userOper.gif", "Referer=http://172.168.1.200: 8000/phpwind85/read.php?tid=4&page=e", ENDITEM, "Url=js/breeze/editor/style/B_ico.png", "Referer=http://172.168.1.200: 8000/phpwind85/read.php?tid=4&page=e", ENDITEM, LAST); web_url("job.php", "URL=http://172.168.1.200:8000/phpwind85/job.php?action=download&aid=1&check=1&nowtime=1315988949256&verify=60cc839c", "TargetFrame=", "Resource=0", "RecContentType=text/xml", "Referer=http://172.168.1.200:8000/phpwind85/read.php?tid=4&page=e", "Snapshot=t55.inf", "Mode=HTML", LAST); web_url("job.php_2", "URL=http://172.168.1.200:8000/phpwind85/job.php?action=download&aid=1&mt=", "TargetFrame=", "Resource=0", "RecContentType=application/zip", "Referer=http://172.168.1.200:8000/phpwind85/read.php?tid=4&page=e", "Snapshot=t57.inf", "Mode=HTML", LAST); |
在重新录制的代码中会发现下载的操作被单独录制成了一个web_url()函数,如果对该代码回放,会在Test Result中看到下载框的弹出,如图A.33所示。
图A.33 在Test Result中验证下载操作的请求
LoadRunner回放脚本的时候会把下载的内容修改文件名,原来的下载文件变成了t5.UNK。该文件存放在脚本目录下的result1\Iteration1回放记录目录中,修改扩展名后会发现与下载的文件是同一个文件。
通过这种策略我们可以把一些特殊的数据类型请求从系统请求中分离出来,便于后期的分析处理。
Correlation:是否打开脚本录制时的自动关联选项,如图A.34所示。
图A.34 边录制边进行关联设置
在LoadRunner 11中该功能默认不启动,这样避免了很多可能在录制过程中由于VuGen错误自动关联,导致脚本回放直接失败的情况。
Data Format Extension:这是LoadRunner 11的新功能。该功能的主要作用是将一些常见的编码格式进行转换,进而便于我们后期处理。这里支持5种常见的数据格式,如图A.35所示。
图A.35 DFE支持的5种数据格式转换
通过DFE功能可以大大简化编码转化中的代价。例如,服务器返回的编码为Base 64时,我们可以为其定义一个Base64转text的规则,这样就可以直接对转码后的内容进行关联。
使用DFE功能时我们首先要新建一个Chain,然后为Chain新建附属的规则项。在Chains中选择新建一个json2xml名的Chain项,然后在右侧为这个Chain添加一个将JSON格式转化为XML格式的规则,如图A.36所示。将Continue Processing设置为True,可以让该规则在任何情况对所有的JSON进行转化尝试。
图A.36 为DFE功能新建Chain
什么是JSON?
JavaScript Object Notation是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。JSON数据格式解析与XML一样,JSON也是基于纯文本的数据格式。
常见的JSON数据格式为:
{"name":"Tom","age":18,"hobby":"basketball"}
接着需要设置录制时启动DFE功能,并且针对Code and snapshots代码及快照均使用下面的chain转码功能。
可以针对Body、Headers、Cookies、Query String四种数据段进行转码,这里我们选择为Body设置一个默认的转码过程为前面设置的JSON,如图A.37所示。当请求中的Body使用JSON格式时,LoadRunner会自动转化为xml格式。如果需要取消Chain设置,可以选中策略后单击上方的刷新按钮。
图A.37 启用DFE功能为Body设置对应的Chain
接着我们编写一个声称JSON数据包的代码。新建一个Json.php文件,在该文件中编写如下代码:
<?php
$array=array('name'=>'Tom','age'=>18,'hobby'=>'basketball');
echo json_encode($array);
?>
将该文件保存在phpwind 85安装根目录下。接着我们尝试使用和不使用DFE功能进行脚本录制,了解一下DFE的特性。
关闭DFE功能,录制phpwind 85目录下的json.php。录制完成脚本后,我们切换到Tree模式可以看到如图A.38所示的界面。
图A.38 关闭DFE功能录制后的JSON返回视图
我们可以看到这个录制出来的效果与普通效果是一样的,但是当我们把DFE打开对JSON返回数据格式做XML转化的时候,会发现界面有变化了。打开DFE,对这个地址再次进行录制,我们会看到焕然一新的视图,如图A.39所示。
图A.39 打开DFE功能录制后的JSON返回视图
我们会发现现在看Response Body就不是前面那种冷冰冰的文本格式了,而是转化成了一个XML的格式,LoadRunner会自动在这个数据结构前增加一个XML根节点,叫作<HP_EXTENSION name="JsonXml"></HP_EXTENSION>,这个节点其实就是前面说的5种格式中我们使用的Json to Xml类型转换策略的Tag名。
除了显示方式的转变外,右侧还会多一个新的XMLTreeEditor标签,通过这个标签我们可以图形化地对XML格式数据包进行节点数据获取,如图A.40所示。
图A.40 XMLTreeEditor视图中的扩展处理功能
DFE总的来说是一个很不错的新功能,它为我们处理一些特殊的数据格式提供了内置转化的功能,无须自行开发C语言函数或者调用别的扩展库来进行格式处理。但是对于普通的HTML页面来说,这个功能略微有些"鸡肋",其实对于XML或者JSON格式,我们不需要转化也可以很简单地通过标准关联、参数化技术进行处理。
本文选自《性能测试进阶指南—LoadRunner 11实战(第二版)》,本站经作者的授权。
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
相关网站: