技术帖摘抄——Loadrunner脚本编程(一)

1 VuGen脚本基本信息
1.1  VuGen脚本文件的开发过程
 
1.定义测试项目的目标,环境,脚本,测试数据,硬件等。脚本应该符合编码规范或编码习惯。
 
2.创建一个版本文件夹来保存被测应用程序相关的各种不同资源,例如截获的.png/.gif图形文件,录制过程保存的html文件,录制中的所有html源文件和VuGen的录制日志。
 
3.列出(在表里)每一个手动操作业务过程需要的实际步骤
 1)截取每一个屏幕图像(screen image )。
 2)为每一个屏幕(screen)分配一个唯一的事务名称。
3)为处理的每一个步骤使用的技术组件(URL或者方法和函数)做注释。
 
4.创建一个版本文件夹。
 
注:我不喜欢使用默认位置,我喜欢把所有脚本相关的文件放到一个相同的文件夹中。不幸的是,这意味着如果我在不同的测试间互相交换录制,那我每次都得记住修改默认的设置。
 
注:当录制一个新的脚本时,我喜欢选择多协议而不是单个协议。。。
 
5.根据你的业务处理列表上指定的用户使用步骤和screen的顺序来使用VuGen录制程序,产生一系列脚本代码。在“开始录制”对话框中
  * 使用COM/DCOM 协议时,选择“Win32应用程序“
 * 使用Web(HTTP/HTML)时,选择“Internet Application“
 
6.根据改进脚本方法和脚本语言规则来修改脚本。
改进脚本的方法:
1)为每一个GUI的screen添加事务语句来获得事务时间。
2)添加显示数据来帮助调试。
3)添加验证点来验证是否期望的文本或者图片在每个脚本执行后显示。
4)通过插入新参数和动态获得整个文件的方式对硬编码的URL,用户id,用户密码和其他的变量数据进行参数化。这样脚本中的参数就可以被动态的替换,以此来模拟运行时不同数据的使用。
5)添加重试逻辑(retry logic)来处理不可见的错误。
6)添加随机函数发生器变化脚本来模拟真实的负载。
7)添加if/else逻辑来检查结果,或者来进行合适的操作,或者来在合适的时候退出脚本。
8)在一个screen中添加语句来捕获需要在其他命令中使用的数据。当使用Microsoft .NET的web form技术的时候,需要避免习惯性的“脚本超时“错误。
9)添加语句来调用外部库函数,以便保存和检索在内存Virtual Table Server中的数据。
10)处理XML.
11)添加语句来模仿客户端的Javascrīpt问题。
 12)添加语句来管理超时。
 13)从事务计时器中计算和减去无效的时间。
 14)输出日志。
 15)添加集合点。
 16)添加时间(Timing)。
脚本语言规则:
    把cookie代码标注出来(因为脚本运行的时候他们被再次执行)。
 
7.通过在VuGen中运行来调试和调整脚本(单个用户),同时运行时设置的日志能够显示如下信息:
辨别和解决脚本编辑错误。
决定timing.
设置初始运行设置的场景。
 
8.在控制器中使用full test Runtime Settings来运行脚本。
脚本录制和产生:
建立一个新脚本的第一步是选择一个单协议或多协议。
 * 一些协议可能在多协议模式下不能用。 
 * 只有在多协议的GUI下你才能重新排列action
 在使用Java协议之前,确保你在环境变量的路径下有JDK,否则你可能会遇到这个错误:
   Error: Failed to find javac.exe Java Compiler in Path and JDK installation folder   in registry. [MsgId: MERR-22981]
   Error: Failed to get JRE version. Check that your PATH environment variable contains\bin directory. [MsgId: MERR-22986]
 当选择Java协议的时候:
 * 只有选择了“RMI Java”才能录制。
  * 如果选择“Java user”,“开始录制”图标或菜单是灰色的。
当你打开一个新的脚本时,默认的脚本名称为“noname1”。下一个新的脚本名称为“noname2”,以此类推。
 
注:有顺序的录制多个动作(而不是录制一个动作,然后停止开始另一个动作)。这样能使你识别出在你脚本中需要关联的序列码(在例如PeopleSoft的程序中)。
 
注:每次修改脚本后,脚本都需要重新编译。
 
Java:略
 
脚本文件的调用: 
    VuGen是默认在你双击.usr后缀文件的时候被调用。
在这个文件里,Javascrīpt被指定为“Type=General-Js”。
为了避免重新编译,我使用命令行的变量和值得组合这样的批处理文件来调用控制器。例如:
 REM LoadRun from LoadRunner 8.0 default installation location:
SET LR80=C:\Program Files\Mercury Interactive\Mercury LoadRunner\bin
cd %LR80%
wlrun.exe -TestRun c:\Temp\Scenario1.lrs-port 8080
 
 
1.2  函数介绍
一:通用函数
LoadRunner的通用函数以lr为前缀,可以在任何协议中使用。可以如下分类:
 
信息相关的函数:
lr_error_message lr_output_message
 
事务函数:
 
lr_start_transaction   lr_end_transaction
运行时函数:
 
lr_think_time        lr_exit
参数相关的函数:
lr_save_datetime lr_advance_param lr_eval_string lr_save_string lr_get_attrib_string
一些函数的详细解释:
1.lr_error_message
往VuGen的回放日志和Controller的输出窗口发送错误信息,例子:
 
lr_error_message("string");
 
2.lr_abort()
中止脚本的执行。如果在Action中使用,就会中止Action的执行,而去执行vuser_end.
 
3.lr_exit
退出脚本,action或者迭代。
lr_exit(intcontinuation_option, intexit_status);
 
4.lr_save_string
 
保存指定的非空字符串到一个参数。
lr_save_string(const char *param_value, const char *param_name);
5.lr_save_date_time
保存日期和时间到参数中。
 
lr_save_datetime(const char *format,intoffset,const char *name);
在lr_save_datetime中使用偏移量
 
lr_save_datetime(“Tomorrow is %B %d %Y", DATE_NOW+ONE_DAY, “nextDate");
 
DATE_NOW+ONE_DAY:当前日期的偏移量
 
如果现在的时间是:2008年二月27
nextDate中保存的时间为:Tomorrow is二月28 2008
 
6.lr_advance_param
lr_advance_param (const char *param);
其中参数用双引号,但不用括号。
7.lr_eval_string
 
lr_eval_string("{parameter_name}");
返回指定参数的当前字符串值。
 
检索参数值,可以使用来下面的函数打印该输出到输出信息中。
lr_output_message或者lr_error_message
 
8.lr_get_attrib_string
 
lr_get_attrib_string (const char *argument);
 
二.特定协议的函数
这类函数跟录制的协议类型有关系。
 
Web协议:以web为前缀
 
lrd是数据库相关的函数,lrs是window socket协议的函数。
 
web_reg_save_param(const char *ParamName,LB,RB,ORD,SaveLen,SaveOffset, LAST);
例子:
web_reg_save_param("flight_name", "LB=Select your departure ", "RB="", LAST);
web_reg_find:
web_reg_find(“Text=Welcome”, SaveCount, LAST);
 
 
1.3  关联函数的通用学习
Loadrunner脚本中进行关联的时候,用到了一些函数,作用是把字符串保存到参数中,并且在需要的时候检索出来.C Vusers中用到的函数有:
lr_eval_string  所有出现参数的地方用它的当前值来代替.
lr_save_string   把null-terminated字符串保存到参数中.其中,null-terminated的意思,我从网上查了下是:"以空字符为结束标志的字符串",也就是以"\0"结束的字符串,其中的0是ASCII码的0,是不能用显示字符表示出来的,只有用转义字符表示了.
lr_save_var 把变长字符串保存到参数中.
下面再来看下每个函数的具体解释(参考帮助):
 
lr_eval_string:
C Language
char *lr_eval_string (const char *instring);
返回内嵌参数赋值后的字符串。
instring:需要赋值的字符串。
lr_eval_string函数返回任何内嵌参数赋值后的输入字符串。如果字符串变量只包含一个参数,函数返回参数的当前值。内嵌参数必须在括号中。
 
注:lr_eval_string是内部地分配内存。在每一次迭代之后会释放。如果你在循环中给参数赋值,不要使用lr_eval_string保存内存。你需要使用lr_eval_string_ext,并且在每个循环迭代中使用lr_eval_string_ext_free释放内存。
这里我再补充一下:lr_eval_string_ext在关联的数据是二进制数据,例如,数据包含嵌入的NULL字符时是非常有用的。
 
例子:下面的例子使用lr_eval_string来代替参数row_cnt的当前值。使用lr_output_message把这个值输出到输出窗口。
lrd_stmt(Csr1, "select count(*) from employee", -1, 1 /*Deferred*/, 2 /*Ora V7*/, 0);
lrd_bind_col(Csr1, 1, &COUNT_D1, 0, 0);
lrd_exec(Csr1, 0, 0, 0, 0, 0);
lrd_save_col(Csr1, 1, 1, 0, "row_cnt");
lrd_fetch(Csr1, 1, 1, 0, PrintRow2, 0);
lr_output_message("value : %s",
 lr_eval_string("The row count is: {row_cnt}"));
 
lr_save_string:
C Language
intlr_save_string (const char *param_value, const char *param_name);
param_value:给参数赋值的值,参数值
param_name:参数名称
lr_save_string函数把指定的以空结束的字符串赋值给参数。这个函数在关联查询的时候非常有用。需要使用lr_eval_string来确定参数的值。
例子:
在下面的例子中,lr_save_string给参数emp_id赋值为777。然后这个参数被用在另一个查询中。
lrd_stmt(Csr1, "select id from employees where name='John'", ...);
lrd_bind_col(Csr1,1,&ID_D1,...);
lrd_exec(Csr1, ...);
lrd_fetch(Csr1, 1, ...);

 

 

 

 

ID_D1

0

777

 
 
lr_save_string("777", "emp_id");
lrd_stmt(Csr1,"select salary from payment where id ='{emp_id}'",...);
lrd_exec(Csr1, 0, 0, 0, 0, 0);
lr_save_var
C Language
 
intlr_save_var (const char *param_value, unsigned long constvalue_len, unsigned long constoptions, const char *param_name);
param_value:参数值
value_len:值的字节长度
options:参数选项,一般为0。
param_name:参数名称。
lr_save_var函数把指定的变长字符串赋值给参数。这个函数在关联查询的时候非常有用。需要使用lr_eval_string来确定参数的值。
例子:
在下面的例子中,lr_save_var 用来限制参数的长度。
 Action()
{
   #define MAX_NAME_LEN 4
// 创建参数, InName
       lr_save_string("Fitzwilliam", "InName");
// 把 "InName"的前四个字节保存到 "ShortName"
lr_save_var( lr_eval_string("{InName}"),
        MAX_NAME_LEN, 0, "ShortName");
 return 0;
}
 Output:
 
Action.c(8): Notify: Saving Parameter "InName = Fitzwilliam"
Action.c(10): Notify: Saving Parameter "ShortName = Fitz"



……待续 
posted @ 2013-03-27 09:04  AllanHao  阅读(975)  评论(0编辑  收藏  举报