不管是RPT,还是LR,做
性能测试开发脚本时使用的都是同样的模式。对在性 能测试规
划时指定的典型业务逻辑场景进行录制,形成基本的脚本骨架。录制 脚本后需要对脚本进行
编辑,以满足性能测试需求,编辑脚本需要掌握参数化 、关联动态数据、增加逻辑控制等技
术。如果不能处理好脚本的录制和编辑, 就不可能有效和成功的继续进行性能测试。
51Testing软件测试网~;[7u9T)weUW wR 什么是参数化数据和动态数据呢?这些数据都会做为http请求数据的一部分发送到
web服
务器,但二者肯定是有区别的。录制业务逻辑脚本时,生成的脚本包含的是录制期间实际用到
的值。不做参数化这个脚本仍可以重放,不做关联动态数据,重放脚本就会出现问题。在给系
统施加压力的时候,同一个脚本会被很多虚拟用户调用执行,应用系统现在都采用各种各样的
缓存机制设计,不能使用同样的数据,这和应用系统的实际使用环境不一致,这会导致性能测
试结果不可信。为解决这样的问题我们做参数化,使用参数替换已录制的值。参数化数据也有
不同的种类,比如登录用户和密码,这些数据必须是系统支持的注册用户,需要从
数据库表中
读取。另一些表单的文本输入框,就可能允许随意输入数据。需要关联的数据是从服务器响应
中获取的,在以后的请求中发送到服务器的数据。可以通过web_reg_save_parm()这个LR API从
服务器响应中获取保存动态数据。动态数据通常在删除一些数据或审核后记录进入以后的流程
环节等情况下出现。
本篇文档会结合实例对动态数据数组和自定义HTTP请求进行介绍。演示使用的性能测试
工具是LR8.0,使用的web应用是工具自带的MercuryTours Web系统,版本不一致,可能导致本
文档中的脚本不能正确运行。
Mercury Tours系统功能很简单,提供了航班订票(Flight菜单)
和取消预订航班(Itinerary菜单)两个功能。需要自己注册,登录系统以使用这些功能。其中,
取消预订航班的操作步骤为:登录系统-点击Itinerary菜单-选择一条预订的航班记录-点击按钮
"cancel checked reservations"以取消该航班。如图1:
51Testing软件测试网9r4z-_/aB0LO$Yv
现在系统中有五条航班预订记录,按上述操作步骤,录制LR脚本取消一条预订记录,如图2:
}\
`.aO1H7R0
}?7xw X!tm0 在试图重放该脚本的时候出现会出现问题,如图3:
我需要对动态数据进行关联。录制脚本的时候取消了一次航班预订,现在有四条记录,
继续录制一次脚本,并比较两次脚本的action.c文件如图4:
&W*p Vdq.[0
'tq4s\3~%AD*F6@0 从图中,可以看出,loadrunner函数web_submit_form()的参数数目竟然是不一样的。其中,
Ss0B&jriDD;]N9m9W0"Name=1"表示是第几条航班预订记录,"Value=on"表示向服务器发送请求取消对应的航班记录。51Testing软件测试网 Y$Xn3P0~8zY ab
试着删除:"Name=4", "Value=<OFF>", ENDITEM, 回放脚本这样是成功的。但我们不能每次人51Testing软件测试网%KkaA1y
B
工干预脚本以使脚本回放成功啊。怎么办?我们只能对LR API函数的参数做参数化或者关联动态
数据,而在参数数目发生变化的情况下,可以使用HTTP自定义请求函数web_custom_request()
来替代函数web_submit_form()。这个演示系统是使用
Perl开发的,原来没见过这种情况。却也能
很好的演示web_custom_request()。51Testing软件测试网E@E qm[U{
简单介绍一下web_custom_request()的参数TODO。。。。。。
ss _x Y7k0 下面看一下,向服务器发送的请求的Body部分,如图5:
5NAL2}4e
B7G@"^05pps'Y[n0 对应的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"
%pR3TG6x!s7V.q
rs0"ightID=1494-3873-kz&.cgifields=1&.cgifields=2&.cgifields=3&.cgifields=4&.cgifields=5&removeFli"51Testing软件测试网!~?9I*ww:f-I4r*RK
"ghts.x=122&removeFlights.y=11"
0r6O#KBI
t A0 其中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:
lf
GT u)`0 int i,ii,k;
5u"ayu4myY0 char tmp[32],tmpp[32];51Testing软件测试网u
frd2ku(T+e
char str[1024],strr[1024];
n2p*X v @,peh-H0 web_reg_save_param("flight_name",51Testing软件测试网Y4{9nt/vg%G'N
"LB/IC=<INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"",
z!YLM.{SC
vOz!B0 "RB=\">",51Testing软件测试网rh9?Gl9h!a
"Ord=ALL",51Testing软件测试网,eD-W(a*R:HeSw-N
LAST);51Testing软件测试网\~)z7uz0n@@
web_reg_save_param("cgi_field",51Testing软件测试网*~"P {.UD;d}A]
"LB/IC=<INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"",
/VM,w({6i6p~{7G0 "RB=\">",51Testing软件测试网@ J%Q$KKDt5Sg
B
W
"Ord=ALL",51Testing软件测试网7JP(oqX0[
LAST);51Testing软件测试网*r{#z&c%K.AH
//added by the Tester manually.end!
V tn$d*`8C0 其中 "Ord=ALL"表示会把所有的复合左右边界的数据保存在数组里面。51Testing软件测试网%xE$w"fs;^
SUf
下面对保存的动态数据进行解析,封装成http请求的body部分:
(L9l%s#Va&Ym`0 51Testing软件测试网:w;j+m
Do k]U)W
i = atoi(lr_eval_string("{flight_name_count}"));
c!fA}It,rd%gg0 ii=atoi(lr_eval_string("{cgi_field_count}"));
-d|y7dr\0//lr_error_message("fff %d",ii);51Testing软件测试网X4Up"gN W1sB5~
strcpy(str,"body=1=on&flightID=");
*zh|q4qP,e\0//lr_error_message("str : %s",str);
:z#i'W7e;|.f:`#[0 for (k=1;k<=i;k++)
MK@6v3yo$|k0 {
%Op7|
m8co0 sprintf(tmp,"{flight_name_%d}",k);
d/y3GBv qx0 sprintf(tmpp,"{cgi_field_%d}",k);51Testing软件测试网T#b6r)VqYQZ'X
a
//lr_error_message("str tmp : %s,%s",tmp,lr_eval_string(tmp));
i'j2oIl0n8R/R0//lr_save_string(lr_eval_string(tmp),tmpp);51Testing软件测试网!GBhdR|
//lr_error_message("str tmpp : %s",tmpp);
strcat(str, lr_eval_string(tmp));
2aV/M)^T0 strcat(str,"&flightID=");
o_hn6J\Ic0 strcat(strr,"&.cgifields=");51Testing软件测试网~L6KY0jn
strcat(strr, lr_eval_string(tmpp));51Testing软件测试网8i*fRJ*H|#p:p
//lr_error_message("str 2 : %s",str);51Testing软件测试网0w*C.ps$I
//lr_error_message("str 22 : %s",strr);
!rfx-j ?4[0 }51Testing软件测试网Kh~_6D6D5I-MS8J
strcat(str,strr);51Testing软件测试网7{/vH7z0j| \GM"j
strcat(str,"&removeFlights.x=122&removeFlights.y=11");
e*so4Z;pM0//lr_error_message("str 2 : %s",str);51Testing软件测试网bGsFrG5w
lr_output_message(str);51Testing软件测试网{!W;pv
J&B/l"o*Y
//return 0;
Twr)dh0我们需要自定义http请求函数为:51Testing软件测试网y7h3R;W0X
web_custom_request("itinerary.pl",
-c)o4M A([(K0 "Method=POST",51Testing软件测试网 pp*zW({o0`m
"URL=http://192.168.1.101:1080/MercuryWebTours/itinerary.pl",51Testing软件测试网)N4D#zm3y G'@J
"RecContentType=text/xml",51Testing软件测试网+a3b-k[PA
"Snapshot=t4.inf",
:X!@*_9U'W#opNV0 str,
];k'L]1{0 LAST);51Testing软件测试网|G.T8zg4omd
51Testing软件测试网'x(Mn-l%O/z4\$A
现在我们再进行回放该脚本就不会出现问题了。脚本回放成功,我们的文字也51Testing软件测试网Qq+J6P!c%o.v
到此就结束了,我们不再对该脚本进行场景调度,已经分析性能测试运行的结果。我们的51Testing软件测试网yY5R rx
目的只是演示动态数据数组的保存、使用及http自定义请求函数web_custom_request()。