上下求索

使用loadrunner下载二进制文件的一次实验

上一篇 / 下一篇  2009-09-17 17:17:26

在平时的测试中经常会使用loadrunner来测试系统接口,发送指定请求信令后需要查看服务返回信令。其中有一种情况就是返回的信令包含了推送包的二进制流,如何取出这个包文件并保存到本地呢,也就是用

loadrunner来实现下载功能。
我们先看下现在网上转载最多的一种下载实现方式:
Action()
{
 int flen;
 //设置参数的最大长度,注意该值必须大于文件的大小
 web_set_max_html_param_len("10000");
//获取响应中body部分的全部内容,作为文件内容保存
 web_reg_save_param("fcontent", "LB=", "RB=", "SEARCH=BODY", LAST);
//web_add_header可以实现对http头的自定义
 web_add_header("Content-Type","application/x-www-form-urlencoded");
 web_custom_request("web_custom_request",
  "URL=http://172.16.11.107:4009/UpdateProvision",
  "Method=POST",
  "Resource=0",
  "Referer=",
  "Mode=HTTP",
  "Body=hsman=skytest&hstype=m900&hswidth=240&hsheight=320...",
  LAST);
//获取响应内容的长度
 flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
 if(flen > 0)
 {
  //以写方式打开文件
  if((filedes = fopen("c:\\test.mrp", "wb")) == NULL)
  {
   lr_output_message("Open File Failed!");
   return -1;
  }
  //写入文件内容
  fwrite(lr_eval_string("{fcontent}"), flen, 1, filedes);
  //关闭文件
  fclose(filedes);
 }
 return 0;
}

执行该事务脚本,似乎一切正常,在制定目录中也确实发现了我们想要的下载文件,然而仔细观察却发现该文件大小与原来的包文件大小不同。
查看日志:web_custom_request("web_custom_request") was successful, 89010 body bytes, 129 header bytes 。
下载生成的文件大小89139字节,包括了89010字节的body和129字节的补零,其实真正的文件大小是89010字节,就是body部分。
此次我们要下载的是个二进制文件,如果使用strlen(lr_eval_string("{fcontent}"))方式去获取文件大小,同样会出错,因为strlen函数计算二进制文件长度时遇到'\0'就会停止计算,从而不能得到正确的文件长度。
没办法,这里只好采用了先去获取header长度再计算获得body长度的方式曲线救国,脚本如下:
Action()
{
 int flen;
 int hlen;
 int blen;
 long filedes;

 web_set_max_html_param_len("10000");
 web_reg_save_param("hcontent", "LB=", "RB=", "SEARCH=Headers", LAST);//获取响应消息头的内容
 web_reg_save_param("bcontent", "LB=", "RB=", "SEARCH=BODY", LAST);//响应消息体的内容
 web_add_header("Content-Type","application/x-www-form-urlencoded");
 web_custom_request("web_custom_request",
  "URL=http://172.16.11.107:4009/UpdateProvision",
  "Method=POST",
  "Resource=0",
  "Referer=",
  "Mode=HTTP",
  "Body=hsman=skytest&hstype=m900&hswidth=240&hsheight=320...",
  LAST);

 flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
 hlen =strlen(lr_eval_string("{hcontent}"));//http响应消息头部分是文本格式,可以使用strlen计算长度
 blen = flen-hlen;
 lr_output_message("flen is %d",flen);
 lr_output_message("hlen is %d",hlen);
 lr_output_message("blen is %d",blen);

 if(blen > 0) 
 {
  //以写方式打开文件
  if((filedes = fopen("c:\\test.mrp", "wb")) == NULL)
  {
   lr_output_message("Open File Failed!");
   return -1;
  }
  //写入文件内容
  fwrite(lr_eval_string("{bcontent}"), blen, 1, filedes);
  //关闭文件
  fclose(filedes);
 }

 return 0;
}

查看日志,Action.c(26): flen is 89139Action.c(27): hlen is 129Action.c(28): blen is 89010
blen就是我们说想要的body部分的长度了,指定目录已生成和我们源包一样的文件包test.mrp,搞定。只是实现的方式有些麻烦,而且对于Body部分还需要继续截取的状况仍然不能实现,以后再想想有没有更直观方便的实现方法。


TAG: 下载 LoadRunner loadrunner 二进制文件

一直没话的个人空间 引用 删除 yizhimeihua   /   2010-04-19 10:22:34
5
 

评分:0

我来说两句

我的栏目

日历

« 2024-05-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 127230
  • 日志数: 65
  • 建立时间: 2009-06-24
  • 更新时间: 2013-11-01

RSS订阅

Open Toolbar