首页 > 代码库 > 大开测试:性能- 如何下载并保存文件到本地(连载18)
大开测试:性能- 如何下载并保存文件到本地(连载18)
7.18 如何下载并保存文件到本地
1.问题提出
如何下载并保存文件到本地?
2.问题解答
一个人事管理系统项目一般都要实现能够上传和下载电子文件(如学位照、身份证、护照或者其他Word、Excel、Pdf等格式的电子文件),测试时为了模拟下载的场景,需要编写相关脚本。在HTTP中,没有任何一个方法或是动作能够标识“下载文件”这个动作,对HTTP来说,无论是下载文件或者请求页面,都只是发出一个GET请求,LoadRunner记录了客户端发出的对文件的请求,并能够收到文件内容。因此,完全可以通过关联的方法,从LoadRunner发出的请求的响应中获取到文件的内容,然后通过LoadRunner的文件操作方法,自行生成文件。只需要对需存储的文件响应部分内容进行关联,并将这部分信息存储于变量中。获得文件内容后,通过fopen、fwrite、fclose函数,就可以将需保存的内容保存成本地文件,这样就完成了文件下载操作。
下面以下载笔者在UML软件工程组织上做的一次关于性能测试公开课讲稿为示例,讲述如何完成一个文件的下载过程。因为有好多人不清楚为什么参数化时用这个取值,而不用别的参数。您可以通过借助FlashGet工具或者鼠标右键单击“性能测试实践及其展望”链接(参见http://www.cnblogs.com/tester2test/archive/2006/08/28/487989.html页面)查看需要下载文件属性等方式来了解脚本中相应参数的设置,从而完成下载操作。参见FlashGet和鼠标右键文件属性图示(如图7-30和图7-31所示),大家可以看到文件下载的地址为“http://www.cnblogs.com/Files/tester2test/xncssj.pdf”,引用地址为“http://www.cnblogs.com/ tester2test/archive/2006/08/28/487989.html”。
图7-30 FlashGet下载相关信息 图7-31 讲稿下载属性信息
相应脚本代码(DownloadFileScript)如下:
#include "web_api.h"
Action()
{
int iflen; //文件大小
long lfbody; //响应数据内容大小
web_url("487989.html",
"URL=http://www.cnblogs.com/tester2test/archive/2006/08/28/487989.html",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
EXTRARES,
"Url=http://www.vqq.com/vqq_inset.js?isMin=0&place=RB&Css=2&RoomName=
5rWL6K+V6ICF5a625Zut6K665Z2b&encode=1&isTime=0&width=350&height=
240&everypage=0", ENDITEM,
"Url=http://www.vqq.com/image/chat2.gif", ENDITEM,
LAST);
//设置最大长度
web_set_max_html_param_len("10000");
//将响应信息存放到fcontent变量
web_reg_save_param("fcontent", "LB=", "RB=", "SEARCH=BODY", LAST);
web_url("下载页面",
"URL=http://www.cnblogs.com/Files/tester2test/xncssj.pdf",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.cnblogs.com/tester2test/archive/2006/08/28/487989.html",
"Snapshot=t3.inf",
"Mode=HTML",
LAST);
//获取响应大小
iflen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
if(iflen > 0)
{
//以写方式打开文件
if((lfbody = fopen("c:\\性能测试实践及其展望.pdf", "wb")) == NULL)
{
lr_output_message("文件操作失败!");
return -1;
}
//写入文件内容
fwrite(lr_eval_string("{fcontent}"), iflen, 1, lfbody);
//关闭文件
fclose(lfbody);
}
return 0;
}
【脚本分析】
首先,代码中声明了两个变量:iflen和lfbody,分别存放被下载文件大小和响应数据内容大小,链接到存放笔者讲稿页面,相关脚本如下所示:
int iflen; //文件大小
long lfbody; //响应数据内容大小
web_url("487989.html",
"URL=http://www.cnblogs.com/tester2test/archive/2006/08/28/487989.html",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
EXTRARES,
"Url=http://www.vqq.com/vqq_inset.js?isMin=0&place=RB&Css=2&RoomName=
5rWL6K+V6ICF5a625Zut6K665Z2b&encode=1&isTime=0&width=350&height=
240&everypage=0", ENDITEM,
"Url=http://www.vqq.com/image/chat2.gif", ENDITEM,
LAST);
其次,根据设置被下载文件的大小,设置最大长度,通过关联函数将被下载文件http://www.cnblogs.com/Files/tester2test/xncssj.pdf内容存放在fcontent变量中,同时获得服务器响应文件下载数据信息大小,关于web_get_int_property函数的使用,可以参看LoadRunner函数帮助了解相关内容。
//设置最大长度
web_set_max_html_param_len("10000");
//将响应信息存放到fcontent变量
web_reg_save_param("fcontent", "LB=", "RB=", "SEARCH=BODY", LAST);
web_url("下载页面",
"URL=http://www.cnblogs.com/Files/tester2test/xncssj.pdf",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.cnblogs.com/tester2test/archive/2006/08/28/487989.html",
"Snapshot=t3.inf",
"Mode=HTML",
LAST);
//获取响应大小
iflen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
最后,将保存在变量的数据信息一一写入到指定命名的文件中,在这里我们依然保存在“c:\性能测试实践及其展望.pdf”文件。相关代码是这样的,如果响应数据信息大小为0个字节,则以写方式打开文件,如果出错则发出“文件操作失败!”提示信息,则将先前保存的下载数据信息写入该文件,这样就完成了一个下载操作的完整工程。
if(iflen > 0)
{
//以写方式打开文件
if((lfbody = fopen("c:\\性能测试实践及其展望.pdf", "wb")) == NULL)
{
lr_output_message("文件操作失败!");
return -1;
}
//写入文件内容
fwrite(lr_eval_string("{fcontent}"), iflen, 1, lfbody);
//关闭文件
fclose(lfbody);
}
【重点提示】
(1)如果不清楚如何确定要下载文件的原始链接,可以通过单击鼠标右键,在弹出的菜单中单击“属性”查看被下载文件的数据源链接地址。
(2)文件操作完成之后,必须要进行释放工作(fclose),否则将会造成内存泄露的情况。存在内存泄露时,在一两个用户操作程序时可能后果不是很明显,但在做并发性测试或者持久性测试的时候,内存泄露结果就会出现内存被逐渐耗尽,最终导致系统崩溃的严重后果,所以大家一定要注意内存泄露问题的发生。
更多信息请关注大开科技公众号或官方网站
www.dakaikeji.com.cn
大开测试:性能- 如何下载并保存文件到本地(连载18)