Loadrunner学习脚本编写系列 1.docx
- 文档编号:8346544
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:22
- 大小:62.25KB
Loadrunner学习脚本编写系列 1.docx
《Loadrunner学习脚本编写系列 1.docx》由会员分享,可在线阅读,更多相关《Loadrunner学习脚本编写系列 1.docx(22页珍藏版)》请在冰豆网上搜索。
Loadrunner学习脚本编写系列1
Loadrunner学习---脚本编写
(1)
(O_G5I"^4|_D_Bt7A144971 下面这个网页的文章原来也是看过的,但发现没几天就忘记了,为了加深学习的印象,特把它翻译出来。
上是关于脚本编写的介绍.
下面是第一部分,脚本的开发.$\d_o1Ut,j3{)e14
&@_F4X_H_]$b
~)x6f__144971VuGen脚本文件的开发过程51Testing软件测试网#U$W_n_G_O7MTQ
1。
定义测试项目的目标,环境,脚本,测试数据,硬件等。
脚本应该符合编码规范或编码习惯。
2。
创建一个版本文件夹来保存被测应用程序相关的各种不同资源,例如截获的.png/.gif图形文件,录制过程保存的html文件,录制中的所有html源文件和VuGen的录制日志。
3。
列出(在表里)每一个手动操作业务过程需要的实际步骤51Testing软件测试网$[_m_Q"x3D)R0H
1)截取每一个屏幕图像(screenimage)。
51Testing软件测试网4F_c3w_c!
q.@E
2)为每一个屏幕(screen)分配一个唯一的事务名称。
3)为处理的每一个步骤使用的技术组件(URL或者方法和函数)做注释。
51Testing软件测试网4y)B_U_T1J_n_[_R
4。
创建一个版本文件夹。
51Testing软件测试网&]6}_M_C!
O#|_R51Testing软件测试网_~E*c7ei5y]_@_
注:
我不喜欢使用默认位置,我喜欢把所有脚本相关的文件放到一个相同的文件夹中。
不幸的是,这意味着如果我在不同的测试间互相交换录制,那我每次都得记住修改默认的设置。
$bgR_x2Q_QK"E144971注:
当录制一个新的脚本时,我喜欢选择多协议而不是单个协议。
。
。
51Testing软件测试网"M_i*i_@Q%t9p
(W6u_k_H_k_B_S/l1449715。
根据你的业务处理列表上指定的用户使用步骤和screen的顺序来使用VuGen录制程序,产生一系列脚本代码。
在“开始录制”对话框中
*使用COM/DCOM协议时,选择“Win32应用程序“_y4d_|_m.m+I_t_f1449
_y"scti_A_w#wD144971 *使用Web(HTTP/HTML)时,选择“InternetApplication“
6。
根据改进脚本方法和脚本语言规则来修改脚本。
51Testing软件测试网.A5C
D9?
!
~-Y%g7Y#Z
改进脚本的方法:
1)为每一个GUI的screen添加事务语句来获得事务时间。
51Testing软件测试网u_a0`
E5m-Ep5O_`_a
_h
@_E_Xh%Q_H_S144971 2)添加显示数据来帮助调试。
Q)V_t)J+[_X/Y;U144971
3)添加验证点来验证是否期望的文本或者图片在每个脚本执行后显示。
51Testing软件测试网_|$oh_^'_'WQI
)dF+|rP0^144971 4)通过插入新参数和动态获得整个文件的方式对硬编码的URL,用户id,用户密码和其他的变量数据进行参数化。
这样脚本中的参数就可以被动态的替换,以此来模拟运行时不同数据的使用。
51Testing软件测试网7F,Y2g7z_~/B+E_s
9G_r2[Mo__f_Q144971 5)添加重试逻辑(retrylogic)来处理不可见的错误。
51Testing软件测试网6W"c&b_c_S_t(h
"~L_h)e_W.M%c_r+x144971 6)添加随机函数发生器变化脚本来模拟真实的负载。
z_W_v
I5},J_l_M144971
7)添加if/else逻辑来检查结果,或者进行合适的操作,或者在合适的时候退出脚本。
51Testing软件测试网_w.L_@[x_X_T
+ko_{"HW_s144971 8)在一个screen中添加语句来捕获需要在其他命令中使用的数据。
当使用Microsoft.NET的webform技术的时候,需要避免习惯性的“脚本超时“错误。
_R6F,|.w'w_N,g144971 9)添加语句来调用外部库函数,以便保存和检索在内存VirtualTableServer中的数据。
%u4iR_i2I_Y@(__A144971 10)处理XML.
_Q_E_T!
L9`_{"c-D_K"s144971 11)添加语句来模仿客户端的Javascrīpt问题。
_S_VI+^_j_V_X8v;B_w0q)r144971 12)添加语句来管理超时。
13)从事务计时器中计算和减去无效的时间。
51Testing软件测试网
s)?
!
B){_J)M9B
D4u_Fr
14)输出日志。
15)添加集合点。
51Testing软件测试网_?
5jqd_M_`9]#g
_q_O!
\4k0e.R_x_O_K_[144971 16)添加时间(Timing)。
_e_E3}_o_H14497151Testing软件测试网_B
m!
Y4s_K_o_s_t1@
脚本语言规则:
把cookie代码标注出来(因为脚本运行的时候他们被再次执行)。
*[&Dx+j7[3c_l14497151Testing软件测试网1|_g_Y,q8[_J(g
7。
通过在VuGen中运行来调试和调整脚本(单个用户),同时运行时设置的日志能够显示如下信息:
9H0q+i
G*r,d_L_{1449
_G_WE,p_Q_144971 辨别和解决脚本编辑错误。
51Testing软件测试网_P+q6h_|s0@_W6M1L
决定timing.L_T:
nE_K_O_X;^;Le1449
A$a3B@_m%d_tG1g4]_S144971 设置初始运行设置的场景。
51Testing软件测试网Zw_z_Ev6}9c_l
8。
在控制器中使用fulltestRuntimeSettings来运行脚本。
脚本录制和产生:
51Testing软件测试网;b_DQ
[.a5_-Q9v
_u/w_u_d#O*Il_N'R9k144971建立一个新脚本的第一步是选择一个单协议或多协议。
51Testing软件测试网_ctr
O&S+`$M_S_R.g_A
*一些协议可能在多协议模式下不能用。
*只有在多协议的GUI下你才能重新排列action
在使用Java协议之前,确保你在环境变量的路径下有JDK,否则你可能会遇到这个错误:
51Testing软件测试网v/x_L_k_{_p__4C
Error:
Failedtofindjavac.exeJavaCompilerinPathandJDKinstallationfolder inregistry.[MsgId:
MERR-22981]51Testing软件测试网'R0bX7R_d1n$r_g"F
Error:
FailedtogetJREversion.CheckthatyourPATHenvironmentvariablecontains\bindirectory.[MsgId:
MERR-22986]51Testing软件测试网H_w.C_y)}C4L*i$z
Dk#v_\1R"O7J_@7i144971当选择Java协议的时候:
*只有选择了“RMIJava”才能录制。
51Testing软件测试网,F0c0{_r_u_X.W
7m!
j$w_f*V4|I_C)B144971 *如果选择“Javauser”,“开始录制”图标或菜单是灰色的。
51Testing软件测试网_`8p_Z-B"n_C&zZ
_P_{"jr_x_E144971当你打开一个新的脚本时,默认的脚本名称为“noname1”。
下一个新的脚本名称为“noname2”,以此类推。
X"__@_K_]\_~144971注:
有顺序的录制多个动作(而不是录制一个动作,然后停止开始另一个动作)。
这样能使你识别出在你脚本中需要关联的序列码(在例如PeopleSoft的程序中)。
51Testing软件测试网v$q+{Z*S.m6h'm_}3t
注:
每次修改脚本后,脚本都需要重新编译。
_y_l_c,O:
lh144971脚本文件的调用:
_w_V6M_z_|_P.k_i_}0a144971 VuGen是默认在你双击.usr后缀文件的时候被调用。
在这个文件里,Javascrīpt被指定为“Type=General-Js”。
(DQ;N_a_L_E_S7{*C*d144971为了避免重新编译,我使用命令行的变量和值得组合这样的批处理文件来调用控制器。
例如:
_Y6n
L_]
X_}W14497
REMLoadRunfromLoadRunner8.0defaultinstallationlocation:
.o_t-|7I_J144971SETLR80=C:
\ProgramFiles\MercuryInteractive\MercuryLoadRunner\bin51Testing软件测试网_^'k_x6S.a_Q
cd%LR80%51Testing软件测试网2l_x_R_b_l_ju-P_n
wlrun.exe-TestRunc:
\Temp\Scenario1.lrs-port8080
脚本文件Action51Testing软件测试网.q_P0Y!
S7D_[3K%Z_x
主机上的代理发送的到服务器的请求是由虚拟用户生成器创建的(VuGen.exe)action的回放实现的。
51Testing软件测试网&l_qr_zmF_k4T
6x
i_b'}_x4U_g144971 Loadrunner创建的脚本有三部分:
51Testing软件测试网1LB_a6F_H)L@2I-n
*vuser_init 来初始化Vuser。
执行在这部分的虚拟用户的状态是"Init"51Testing软件测试网_b_ZL_o_?
+wJ:
D.[C
*Action用来重复多次迭代 执行到这部分的虚拟用户的状态是"Running"_a_z_s2b5A0x144971
#m7X_m:
F/]144971 *vuser_end 退出虚拟用户。
执行到这部分的虚拟用户的状态是"Exiting"
`,R_D2f'c/X_k144971如果你的脚本只需要执行一次,你仍然需要把这些脚本写到Action部分,因为在其他部分(vuser_init和vuser_end)有些命令是不合法的或者会忽略掉。
51Testing软件测试网t;o_S$n;|d&J;e$y_t
_WQ{_G_QB!
G#D144971VuGen允许脚本包含多个action。
所以我为每一个screen创建一个新的action。
_u$n_T2R_S!
a_X;c_[_f_s14497
_f_x_d%S__"@7[_?
(O144971注:
如果你想使用不同的用户登录,就不要把登录操作放到vuser_init中,而是放到action部分。
3v3F4L_D"x2u14497151Testing软件测试网l_O3C1g9c"N_\F
VuGen根据选择脚本协议的不同来添加不用的引用到“.h”头文件。
C的.h头文件
对于Web(HTTP/HTML)协议,51Testing软件测试网+OC7M_a_s
创建globals.h,包含内容:
#ifndef_GLOBALS_H
#define_GLOBALS_H
//--------------------------
//IncludeFiles
#include"lrun.h"
#include"web_api.h"
#include"lrw_custom_body.h"
//recordedforweb_custom_requestfunctions.
//--------------------------
//GlobalVariables
#endif//_GLOBALS_H
__Q_~_g!
Y144971对于COM/DCOM协议:
略51Testing软件测试网_g!
U5^_t_L
_p_t1S_k;}144971C脚本语言的格式:
LoadRunner使用的没有进行微软扩展的ANSIC语法。
任意最小的action代码块如下:
_M_L&K8u_N2H+I_k144971
#includeas_web.h//fromLoadRunner'sincludefolder.
Action1()
{
/*commentblock
*/
//commentline
return0;
}51Testing软件测试网_k$W3P-O_qVr,
C脚本编译/类库
当VuGen编译脚本时,产生一个"pre_cci.ci"文件,这个文件包含了所有action的代码和包含文件。
这就是为什么会有语法错误“notwritingpre_cci.ci”的原因。
51Testing软件测试网2b-cN)p}
#E%a#Y_b1]!
~p144971控制器编译这些.ci文件为机器目标码。
51Testing软件测试网_K_W_Z,Y(z_M)~^_F
_Gpg_~_n144971VuGen在每一个脚本文件中自动创建一个lib文件夹,这个文件夹中包含了combined_lib.c文件。
该文件包含了所有引用文件。
#include"lrun.h" 来定义 UNIX或者Windows的函数。
51Testing软件测试网"b_c_}_Yf2e_}#L_Z
#include"globals.h" LoadRunner'的模版文件夹的其中一个。
51Testing软件测试网_X"G*?
2F_p_P0b_S_r}
^_~;lP%B2[14497#include"vuser_init.c"51Testing软件测试网2?
&d!
@_z_FZ#z
#include"Action.c"51Testing软件测试网n's
b_Ur_u^_o_{_J"P/yK
#include"vuser_end.c"51Testing软件测试网_c
f.H_z_w
+o3J_k_^(LL_F_k[_e144971 警告:
当你使用类库中的函数却没有正确包含该类库的时候,你会收到一条错误信息:
Error--Unresolvedsymbol
_E(F_k1I_C_|_G_y144971C类库
LoadRunner 使用
1994GNUCPre-Processoroptions 和
1995LCC-win32RetargetableCCompiler/LinkerfromtheFreeSoftwareFoundationviaChrisFraserofAT&TandDaveHansonofPrinceton.51Testing软件测试网_C}!
Q-]_/rD
附加的函数定义在
ANSIClibrary中。
51Testing软件测试网#m5G!
\2c;h_RQSd
_cG_f_h:
Z"o_o-l144971外部的没有返回整型数的C函数需要在脚本的开头进行显式声明。
例如,string函数中的stringtokenizer:
_T___d.t_H_q*gw144971externchar*strtok(char*token,constchar*delimiter);
A(kf4t)UJ144971Java语法:
略w_L_u0M!
T14497151Testing软件测试网_`__9H4|9
OK,先到这里,休息一下,下期接着翻译LR脚本相关知识.
loadrunner学习系列---脚本编写
(2)
8I_n,AA
Si_S%_144971 今天接着翻译
Ov_d_t3Z7_:
w,s/j144971VUser_Init部分
这里是Vuser_init部分的一些例子:
3l;f&J_k)a_o)tHoE_b14497151Testing软件测试网3e7l;~_^1
操作系统的UserID51Testing软件测试网4c.S*V2@_[_{_|_~
下面显示了使用advapi32.dll的GetUserNameA函数获得的操作系统的用户ID51Testing软件测试网_[_J_T$g1p`
charsUserID[1024];//MaximumpossibleUserIDlength.
longlUserIDSize=sizeof(sUserID)-1;
intrc;
rc=lr_load_dll("advapi32.dll");
if(rc!
=0){
lr_error_message("lr_load_dllofadvapi32.dllfailed.Abortedforrc=%d",rc);
lr_abort();
}else{
GetUserNameA(sUserID,&lUserIDSize);
lr_message("UserID='%s'",sUserID);
}
所有的变量声明需要一块放到最上方。
在vuser_init部分创建的本地C变量(如int或char)对其他部分的脚本是不可见的。
所以使用lr_save_string函数来创建对所有脚本可用的全局参数。
例子:
char*itoa(intvalue,char*str,intradix);
vuser_init(){
intx=10;
charbuffer[10];
lr_save_string(itoa(x,buffer,10),"pX");
lr_message("intx=%s",lr_eval_string("{pX}"));
return0;
}
运行时设置的附加属性(AdditionalAttribute)
8.0版本引进了一个非常有价值的特性:
在运行时设置中指定属性,这个属性可以对不同的虚拟用户组设置不同的值。
下面的代码是从运行时设置的附加属性中读取名为“usertype”的参数。
然后使用参数值来对应的设置全局的"thinktime1"变量。
intthinktime1=0;51Testing软件测试网_o5L2|C_A_F!
@0P#p2x_U
vuser_init()
C_J2T"O"]g/G
u5@_t144971{
LPCSTRstrUsertype;//Define*str.51Testing软件测试网_~u.J^1g7p"e_~I
strUsertype=lr_get_attrib_string("usertype");
x4T5k_\
K*E_K144971if(strUsertype==NULL){
lr_output_message("###Run-timeSettingsAdditionalAttributeusertypenotspecified.Cannotcontinue.");51Testing软件测试网1@8M-y:
U/Y_l
X_[_o$q4C
lr_abort();
}else{
(z"~_m#T!
L4u#u_A144971
lr_message("###Run-timeSettingsAdditionalAttributeusertype=\"%s\"",strUsertype);
4j_N;k+Y+h_u_X"B#k_\2~144971if(strcmp(strUsertype,"advanced")==0){thinktime1=2;}51Testing软件测试网_N*e
M(u*F2t_\1h
Else
2E%{
C
^$}F_pH-ji144971if(strcmp(strUsertype,"intermediate")==0){thinktime1=4;}
_TRo1P1P_]_v+g_r_d_`144971else3~_L__
x3B_]
?
~_Z;~144971if(strcmp(strUsertype,"basic")==0){thinktime1=8;}51Testing软件测试网7\-a_|4H_h1E
P
else{51Testing软件测试网_s_O_z/d_D,v_X&~
lr_error_message("###ERROR:
Valuenotrecognized.Abortingrun.");51Testing软件测试网_T_|_}f1n;}
lr_abort();
}
}
_U_G8y&v
o
D)n_~-h#Y(B144971return0;
}
TimeStructureFix(不知道怎么翻译,呵呵,“时间结构的解决“?
)
根据知识库34195的文章,默认当前时间戳的毫秒部分不被更新,除非ftime使用的时间结构被重新定义:
typedeflongtime_t;
struct_timeb{
time_ttime;unsignedshortmillitm;shorttimezone;
shortdstflag;
};
struct_timebt;
_tzset();\\使用ftime设置变量
_ftime(&t);
lr_message("Plusmilliseconds:
%u",t.millitm);
控制信息的显示:
在运行时,当脚本的事务失败后继续,你怎么知道哪个用户失败了?
在每个失败的事务之后,发出一个能够唯一确定该用户的信息。
Loadrunner提供了一些函数来在运行时显示信息:
//往输出日志上发送消息,这个消息前边会带有action的名称和行数
W*d_M_LS
V)W7U#X144971lr_output_message("anoutputmessage");#V
S_}d0e_t(U144971
_b:
|*u2Dq)F*`6O144971例子:
51Testing软件测试网_A5]-z'y$a!
d,Z*M
Actions.c(4):
anoutputmessage&l-Z$K-e_q14497151Testing软件测试网_m
V9O'F_}__
//往输出日志和虚拟用户日志上发消息:
51Testing软件测试网_p
c_y_|$y,g
lr_message("***amessage"+"\r"+"Anewline.");
把");"放到另一行,这样可以容易的在命令上添加或者删除代码项。
51Testing软件测试网(z_T_Q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Loadrunner学习脚本编写系列 Loadrunner 学习 脚本 编写 系列