大开测试:性能- 如何下载并保存文件到本地(连载18)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大开测试:性能- 如何下载并保存文件到本地(连载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)的主要内容,如果未能解决你的问题,请参考以下文章

大开测试:性能—如何添加并运用附加变量(连载6)

大开测试:性能- 如何解决负载均衡将压力作用到一台机器(连载15)

大开测试:性能- 如何在脚本中加入DOS命令(连载17)

大开测试:性能-如何解决由于设置引起的运行失败问题(连载22)

大开测试:性能—如何解决数据库查询结果过大导致录制失败(连载3)

大开测试:性能—如何调整经常用到的相关协议脚本模板(连载4)