自动化测试框架爱好者,非培训机构、非托、非盈利,纯个人!软件自动化测试交流 请加我QQ 459864689!更多自动化测试的信息请访问我的个人小站www.zhushangyuan.cn,专门研究selenium自动化测试框架的分享站点。

LoadRunner之自定义HTTP请求

上一篇 / 下一篇  2009-05-06 16:18:33 / 个人分类:性能测试

不管是RPT,还是LR,做性能测试开发脚本时使用的都是同样的模式。对在性 能测试规
划时指定的典型业务逻辑场景进行录制,形成基本的脚本骨架。录制 脚本后需要对脚本进行
编辑,以满足性能测试需求,编辑脚本需要掌握参数化 、关联动态数据、增加逻辑控制等技
术。如果不能处理好脚本的录制和编辑, 就不可能有效和成功的继续进行性能测试。51Testing软件测试网{ufQ_G
       什么是参数化数据和动态数据呢?这些数据都会做为http请求数据的一部分发送到web
务器,但二者肯定是有区别的。录制业务逻辑脚本时,生成的脚本包含的是录制期间实际用到
的值。不做参数化这个脚本仍可以重放,不做关联动态数据,重放脚本就会出现问题。在给系
统施加压力的时候,同一个脚本会被很多虚拟用户调用执行,应用系统现在都采用各种各样的
缓存机制设计,不能使用同样的数据,这和应用系统的实际使用环境不一致,这会导致性能测
试结果不可信。为解决这样的问题我们做参数化,使用参数替换已录制的值。参数化数据也有
不同的种类,比如登录用户和密码,这些数据必须是系统支持的注册用户,需要从数据库表中
读取。另一些表单的文本输入框,就可能允许随意输入数据。需要关联的数据是从服务器响应
中获取的,在以后的请求中发送到服务器的数据。可以通过web_reg_save_parm()这个LR API从
服务器响应中获取保存动态数据。动态数据通常在删除一些数据或审核后记录进入以后的流程
环节等情况下出现。
         本篇文档会结合实例对动态数据数组和自定义HTTP请求进行介绍。演示使用的性能测试
工具是LR8.0,使用的web应用是工具自带的MercuryTours Web系统,版本不一致,可能导致本
文档中的脚本不能正确运行。Mercury Tours系统功能很简单,提供了航班订票(Flight菜单)
和取消预订航班(Itinerary菜单)两个功能。需要自己注册,登录系统以使用这些功能。其中,
取消预订航班的操作步骤为:登录系统-点击Itinerary菜单-选择一条预订的航班记录-点击按钮
"cancel checked reservations"以取消该航班。如图1:
51Testing软件测试网iN#Zz9e$nB
 
         现在系统中有五条航班预订记录,按上述操作步骤,录制LR脚本取消一条预订记录,如图2:
 
51Testing软件测试网:_6D2_P6\ t{

^F t.A7P"j0         在试图重放该脚本的时候出现会出现问题,如图3:
 
 
                 我需要对动态数据进行关联。录制脚本的时候取消了一次航班预订,现在有四条记录,
继续录制一次脚本,并比较两次脚本的action.c文件如图4:
F xLCQZO0
51Testing软件测试网Is$ns%ZY
       从图中,可以看出,loadrunner函数web_submit_form()的参数数目竟然是不一样的。其中,
?){i&t'd uG0"Name=1"表示是第几条航班预订记录,"Value=on"表示向服务器发送请求取消对应的航班记录。51Testing软件测试网o_Y!Kjnk
试着删除:"Name=4", "Value=<OFF>", ENDITEM, 回放脚本这样是成功的。但我们不能每次人51Testing软件测试网)R+g-l1{0G9k,W aY
工干预脚本以使脚本回放成功啊。怎么办?我们只能对LR API函数的参数做参数化或者关联动态
数据,而在参数数目发生变化的情况下,可以使用HTTP自定义请求函数web_custom_request()
来替代函数web_submit_form()。这个演示系统是使用Perl开发的,原来没见过这种情况。却也能
很好的演示web_custom_request()。51Testing软件测试网;{n*]-ZHbNQ
       简单介绍一下web_custom_request()的参数TODO。。。。。。
hA d0NXJ0       下面看一下,向服务器发送的请求的Body部分,如图5:
51Testing软件测试网sqs{d \R

9a @+@X+PW;k!S W0          
         对应的RecordingLog.txt部分为:
*** [tid=1a8 Action 33] Sending request to host 192.168.1.101:1080 ( 6/5/2009 00:45:15 )
"1=on&flightID=1494-796-kz&flightID=1494-1565-kz&flightID=1494-2334-kz&flightID=1494-3103-kz&fl"51Testing软件测试网` w#mtG!EN
"ightID=1494-3873-kz&.cgifields=1&.cgifields=2&.cgifields=3&.cgifields=4&.cgifields=5&removeFli"51Testing软件测试网!il_*eqZ_
"ghts.x=122&removeFlights.y=11"
51Testing软件测试网.U){ _/nWNtJb r
       其中1=on表示向服务器发送请求取消对应的航班记录,removeFlights.x=122&removeFlights.y=11
记录的是按钮cancel的位置,这个不影响。flightID和.cgifields来自于服务器响应,我们会把这些信息保
存在一个数组里面,如何判断和操作web_reg_save_parm()参考其他资料,不再叙述。在 web_url("welcome.pl",
前添加:
 //added by the Tester manually.start:
7SwXxt V0    int i,ii,k;
)Vs0R oL8m0    char tmp[32],tmpp[32];51Testing软件测试网9xJS(cA
    char str[1024],strr[1024];
8vEm5l'sAn;BM0 web_reg_save_param("flight_name",
2L.j'~ sY ]/s4o0  "LB/IC=<INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"",51Testing软件测试网"FT-m7g"QP+`
  "RB=\">",51Testing软件测试网E9]*S0S-uw
  "Ord=ALL",51Testing软件测试网N.NPrwPV:M4f
  LAST);
&h5}] `W Ghs:QxVs0 web_reg_save_param("cgi_field",
1N8y/tmh0  "LB/IC=<INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"",51Testing软件测试网]l"O@t
  "RB=\">",51Testing软件测试网!K+JM:J u:i!D
  "Ord=ALL",51Testing软件测试网/{+_yJPu
  LAST);
Y#R+}V [VWEySn2V0    //added by the Tester manually.end!
51Testing软件测试网4zvfl9T'cX/G%W)l
    其中 "Ord=ALL"表示会把所有的复合左右边界的数据保存在数组里面。51Testing软件测试网9o0Z"S/V+E l
    下面对保存的动态数据进行解析,封装成http请求的body部分:51Testing软件测试网O^@$Kw x
   51Testing软件测试网c%g'th^.LiZ
        i = atoi(lr_eval_string("{flight_name_count}"));51Testing软件测试网1CD~'T)iw
    ii=atoi(lr_eval_string("{cgi_field_count}"));
7DY9B9wH\7I0//lr_error_message("fff  %d",ii);
0kt/X2Nrq0    strcpy(str,"body=1=on&flightID=");
R!| Hp%P%h c6@s0//lr_error_message("str          : %s",str);
1L.f2_v$`ZGe0    for (k=1;k<=i;k++)51Testing软件测试网 ]9m7B,Ve
    {
7Rg[t8Yx[0      sprintf(tmp,"{flight_name_%d}",k);
O!h.II7cK0      sprintf(tmpp,"{cgi_field_%d}",k);51Testing软件测试网+gmr9Y9Qz|+YI L
//lr_error_message("str tmp          : %s,%s",tmp,lr_eval_string(tmp));51Testing软件测试网 O"c} pzUI T6gC
//lr_save_string(lr_eval_string(tmp),tmpp);
.XQuX-T0//lr_error_message("str tmpp          : %s",tmpp);
      strcat(str, lr_eval_string(tmp));
ru8m;cP0@/K4D0      strcat(str,"&flightID=");51Testing软件测试网F Q:Dp?a {
      strcat(strr,"&.cgifields=");51Testing软件测试网-O^JYmh
      strcat(strr, lr_eval_string(tmpp));
I0o*Y2J k9J X0//lr_error_message("str  2        : %s",str);
6aS%w)r{T6V0//lr_error_message("str  22        : %s",strr);51Testing软件测试网VVV%v Z;lX"]U A
    }51Testing软件测试网(y-|w2M*X9t:l
       strcat(str,strr);51Testing软件测试网B.Bhe#S `$R6S6S
       strcat(str,"&removeFlights.x=122&removeFlights.y=11");
&g"p)t{%u,J)Rt!y0//lr_error_message("str  2        : %s",str);
.WK0Wo}/e[m0    lr_output_message(str);51Testing软件测试网mjK.\f0Q$v'O8\(_2H*[
//return 0;

.cyq)_[0我们需要自定义http请求函数为:51Testing软件测试网y8LK,?B2xL
    web_custom_request("itinerary.pl",
uR H |\4{0        "Method=POST",
DjX.j;i0        "URL=http://192.168.1.101:1080/MercuryWebTours/itinerary.pl",51Testing软件测试网d,z%wKN F
        "RecContentType=text/xml",
+h6K!gO%}a#n_0        "Snapshot=t4.inf",51Testing软件测试网WqGG Q_{ b
         str,      51Testing软件测试网$Fg u,@n#Q*a3r
        LAST);
j:~[w)N8_0       

%q k4`;~ {EO Y0        现在我们再进行回放该脚本就不会出现问题了。脚本回放成功,我们的文字也
:G%MwO-UfT i$i0到此就结束了,我们不再对该脚本进行场景调度,已经分析性能测试运行的结果。我们的
l8psf0m+uY0目的只是演示动态数据数组的保存、使用及http自定义请求函数web_custom_request()。
 

TAG:

 

评分:0

我来说两句

Open Toolbar