1.概述
2.一个规范的性能测试脚本就像一段规范的程序代码一样,需要基本的说明信息:
在下面要介绍的脚本中,我把这些信息以注释的形式放在vuser_init最前面:
3.通常情况下,任何业务必须在登陆成功后才能做,所以有必要对登陆成功与否进行判断:
下面我从脚本中取出相关部分进行简单介绍:
vuser_init()
{
int status; //定义变量用于判断登陆是否成功
web_reg_find("Text=山东移动BOSS",
LAST);
…….
…….
web_submit_data("reguserAction.do", //登陆提交数据Action。
"Action=http://{BOSSURL}/boss/reguserAction.do",
"Method=POST",
"RecContentType=text/html",
"Referer=http://{BOSSURL}/boss/index.jsp",
"Snapshot=t12.inf",
"Mode=HTTP",
ITEMDATA,
"Name=logname", "Value={LogName}", ENDITEM,
"Name=password", "Value=", ENDITEM,
LAST);
status = web_submit_data("reguserAction.do", // 取成功与否标志
"Action=http://{BOSSURL}/boss/reguserAction.do",
"Method=POST",
"RecContentType=text/html",
"Referer=http://{BOSSURL}/boss/index.jsp",
"Snapshot=t12.inf",
"Mode=HTTP",
ITEMDATA,
"Name=logname", "Value={LogName}", ENDITEM,
"Name=password", "Value=", ENDITEM,
LAST);
if (status == LR_FAIL) //一旦登陆失败,脚本给出提示报错信息。
{
lr_error_message("错误信息: %s", "不能正常登陆!");
return -1;
}
}
4.事务的定义,很简单,也很有必要,尽量是每个定义的事物符合逻辑和小。
在下面的脚本中,在异地缴费这一业务中定义了两个Transaction:准备异地缴费数据和提交异地缴费,见如下脚本代码:
lr_start_transaction("准备异地缴费数据");
web_set_max_html_param_len("4096");
……….
web_submit_data("chargeacc.do",
"Action=http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=queryaccount",
"Method=POST",
"RecContentType=text/html",
"Referer=http://{BOSSURL}/boss/charge/commonbusiness/acccharge/acccharge.jsp?act=first",
"Snapshot=t74.inf",
"Mode=HTTP",
ITEMDATA,
"Name=isconfirm", "Value=no", ENDITEM,
"Name=chargetype", "Value=telnumber", ENDITEM,
"Name=telnumber", "Value={PhoneNum}", ENDITEM,
"Name=nowfee", "Value=0.0", ENDITEM,
"Name=factfee", "Value=", ENDITEM,
"Name=totalfee", "Value=0.0", ENDITEM,
LAST);
lr_end_transaction("准备异地缴费数据", LR_AUTO);
5.增强脚本,对脚本进行简单的编程。
增强脚本,对脚本进行简单的编程,为性能或压力测试提供方便,这也是写
本文的宗旨,下面对此做简单的介绍:
但是大家可能会问,字符串"操作业务数据成功!"从何处而来,可以肯定的不能凭空想象,成功标志可从两三种方式来取得:
第一种:也是最简单的一种,直接从脚本中取得,具体操作是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里去取。见下面的图片:
注:Snapshot在录制前要将Recording Options>Advanced里的Save snapshot resources locally 选项选中。
web_reg_find("Text=---------操作业务数据成功!--------",
LAST);
值得注意的是要有web_reg_find函数,可以在录制前选中Recording Options>Advanced里的Generate web_reg_find functions for page titles 选项。
web_reg_find("Text=---------操作业务数据成功!--------",
LAST);
…….
web_submit_data("chargeacc.do_3",
"Action=http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=submit&atype=commitdata",
"Method=POST",
"RecContentType=text/html",
"Referer=http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=querycustomer",
"Snapshot=t129.inf",
"Mode=HTTP",
ITEMDATA,
"Name=isconfirm", "Value=no", ENDITEM,
"Name=chargetype", "Value=telnumber", ENDITEM,
"Name=telnumber", "Value=", ENDITEM,
"Name=nowfee", "Value=8.8", ENDITEM,
"Name=factfee", "Value=0.00", ENDITEM,
"Name=totalfee", "Value=8.8", ENDITEM,
"Name=accountno", "Value={WCSParam_Diff1}", ENDITEM,
"Name=factpay", "Value=8.8", ENDITEM,
"Name=grantpercent", "Value=", ENDITEM,
"Name=grantfee", "Value=0", ENDITEM,
"Name=takecash", "Value=8.8", ENDITEM,
"Name=zero", "Value=0", ENDITEM,
"Name=paytype", "Value=Cash", ENDITEM,
"Name=remark", "Value=", ENDITEM,
"Name=invoice", "Value=joininvoice", ENDITEM,
LAST);
有一点大家都很清楚,业务成功返回的字符串和失败返回的字符串是不同的,我们所要做的是将返回的字符串做为参数保存下来,然后拿这个参数和我们事先定义好的成功的标志做比较,有两种方式可以设置和保存这一参数,下面简单介绍:
第一种方式也是最准确的方式,是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里的成功的返回标志,然后对其进行Create Parameter,这样LoadRunner会自动在脚本中添加web_reg_save_param函数,具体如下:
// [WCSPARAM WCSParam_Text2 24 操作业务数据成功!_Text2] Parameter {WCSParam_Text2} created by Correlation Studio
web_reg_save_param("WCSParam_Text2",
"LB=---------",
"RB=-",
"Ord=1",
"RelFrameId=1",
"Search=Body",
LAST);
if (strcmp(fanhuiflag,lr_eval_string("{WCSParam_Text2}"))!=0)
{
lr_error_message("消息: %s,在第 %s 次循环时出错,出错号码:%s", "提交异地缴费数据失败!", lr_eval_string("{iteration}"), lr_eval_string("{PhoneNum}"));
}
简单解释如下:
fanhuiflag:前面已经定义好的成功标志字符串的数组名,当然前面也可以用指针来实现,这里不做介绍。
WCSParam_Text2:为实现设置和保存好的成功与否返回的字符串的参数;
PhoneNum:服务号码的参数化,具体为电话号码。关于参数化,这里不做分析和解释部分。
Iteration:为了定位具体的循环而设置的参数。
Strcmp函数:LoadRunner自带的字符串比较函数,相等时返回0
lr_eval_string函数:LoadRunner自带求字符串函数,函数格式为
char * lr_eval_string (const char * instring );
(另一种判断方式:先事先定义好int rc=1; char *fanhuiflag="操作业务数据成功!";然后在定义事务的结尾进行判断: rc=strcmp(str_tip,lr_eval_string("{re_str_tip}"));
if(rc==0)
{
lr_end_transaction("异地缴费_提交", LR_PASS);
}
else
{
lr_error_message("异地缴费_提交失败,号码为:%s",lr_eval_string("{msisdn}"));
lr_end_transaction("异地缴费_提交", LR_FAIL);
}
//lr_end_transaction("异地缴费_提交",LR_AUTO);)
设置Run Logic 里的Number of Iterations 为2,然后运行,并查看日志。可以得到如下的日志(只取了关键部分的):
第一次循环关键部分:
YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.8459 Wasted Time: 0.0060).
YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 1 [table = iteration].
YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "1"
YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953555588"
YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 1 次循环时出错,出错号码:13953555588
第二次循环关键部分:
YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.2347 Wasted Time: 0.0064).
YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 2 [table = iteration].
YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "2"
YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953572390"
YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 2 次循环时出错,出错号码:13953572390
6.怎么样使多台产生vuser的测试机均匀地对被测试的系统施加压力?
在测试的过程中,为了尽可能减少或者避免本身的测试机成为测试过程中的瓶颈,需要使用多台测试机产生vuser对被测试系统施加压力,下面对操作步骤做简单介绍:
为了让10.19.180.2/3/4机器同时能真正被添加进去,我们需要做以下几步工作:
改变场景模式,将组模式()改变为百分比模式(percentage mode),具体做法是,选择Scenario菜单下的Convert Scenario to the Percentage Mode;
然后,在已经添加好的Load Generators机器列表中同时选择你想选择的机器;
最后,点OK按钮就可以得到我们所要的结果了。
当然,如有必要我们还可以把场景模式改为Vuser Group Mode,具体做法如下:
选择Scenario菜单下的Convert Scenario to the Vuser Group Mode;
然后在弹出的对话框中,单击Yes按钮可以得到如下结果,
到此为止,添加多台Load Generators测试机整个过程就完成了,其实很简单,关键是你发现了没有。
7. 怎么样在关联时取列表的最后一个值(在测试重打发票取流水号时需要)?
在压力测试脚本的关联过程中,我们有时可能需要关联最新的值(如最新的流水号,通常情况下,最新的流水号放在列表的最下方),所以找最新的流水号就是最列表最下方,如果保存在数组里,那就是找index值最大的那个元素。下面以重打发票(注:具体流程为先缴费,然后查询缴费历史,然后从缴费历史里找到最新的流水号,然后使用此流水号进行重打发票)为例对整个过程做详细的介绍:
首先,在缴费历史里找到需要关联的流水号并关联之,具体做法如下,
7.1以Tree View方式打开脚本并在对应事件的Page View里找到最新的流水号
7.2单击是(Y)按钮,对应的脚本中会增加如下内容。
7.3到此为止脚本中多出如下代码段,下面对它做一定的分析:
web_reg_find("Text=缴费历史查询",
LAST);
// [WCSPARAM WCSParam_Text1 23 536dxwf0200051031000000] Parameter {WCSParam_Text1} created by Correlation Studio
web_reg_save_param("WCSParam_Text1",
"LB=formnum=",
"RB=\"",
"Ord=8",
"RelFrameId=1",
"Search=Body",
LAST);
//后面的内容为注释部分,说明流水号536dxwf0200051031000000已经关联并保存到WCSParam_Text1参数中。
5.1 修改web_reg_save_param()函数相关部分,很简单,把"Ord=8",改为"Ord=ALL",目的是找最TOP的那个参数值。
5.2 光保存和取参数还不够,我们需要把参数能正确传递到重打发票对应的地方,为此我采取的做法如下:
char WCSParam_Text1Pram[50]; //保存取到的流水号
char WCSParam_Text1PramVal[50]; //保存以"Value=流水号"取到的流水号。
lr_message("WCSParam_text1:%s",lr_eval_string("{WCSParam_Text1}"));
//打印出关联的参数WCSParam_Text1的值。
sprintf(WCSParam_Text1Pram,"{WCSParam_Text1_%s}",lr_eval_string("{WCSParam_Text1_count}"));
//把取到流水号保存到WCSParam_Text1Pram里,具体形式为
sprintf(WCSParam_Text1PramVal,"Value=%s",lr_eval_string(WCSParam_Text1Pram));
//组合流水号和”Value=”并保存到WCSParam_Text1PramVal变量中。
lr_message("The value argument is : %s", WCSParam_Text1PramVal);
//打印出字符串变量WCSParam_Text1PramVal的值。
5.3 找到重打发票中响应的流水号,并把其中的"Value=536dxwf0200051031000000"替换成WCSParam_Text1PramVal,在这里总共有两处。
8.使用LoadRunner一些常用的注意事项:
Note1:VuGen仅能录制 Windows平台上的会话,但是,录制的Vuser脚本既可以在Windows 平台上运行,也可以在 UNIX 平台上运行。
通用 Vuser 函数和特定于协议的函数,它们共同构成了 LoadRunner API,并使Vuser能够直接与服务器通信。
Note2:用于运行Vuser脚本的C解释器仅支持ANSI C语言。它不支持 Microsoft对ANSI C的任何扩展。
通常情况下,可以将登录到服务器的活动录制到vuser_init部分中、将客户端活动录制到Actions部分中,并将注销过程录制到vuser_end部分中。
Note3:只能向Action部分(而不是init或end 部分)添加集合。
Note:不要从事务内部发送消息,因为这可能使事务执行时间变长,并扭曲事务结果。
Note4:如果使用日志运行时设置修改脚本的调试级别,则 lr_message、lr_output_message 和 lr_log_message 函数的行为将不会更改,它们将继续发送消息。
Note5:录制 Java Vuser 脚本时, Vuser 脚本中将不生成 lr_think_time 语句。
Note6:VuGen 新建参数,但不会自动替换任何在脚本中选定的字符串。
Note7:不要将参数命名为 unique,因为该名已被 VuGen 使用。
Note8:如果在常规运行时设置文件夹中将“错误处理”设置为“出现错误时仍继续”,则错误消息仍将被发送到输出窗口。
Note9:因为生成的服务器消息很长,而且日志记录会降低系统的运行速度,所以请仅为脚本中特定的代码块激活服务器消息日志记录功能。
Note10:启用“出现错误时仍继续”功能时,将覆盖 0 严重级别;即使发生数据库错误,也将继续执行脚本。然而,如果禁用了“出现错误时仍继续”功能,但将严重级别指定为 1,则当发生数据库错误时仍将继续执行脚本。
Note11:下列协议不是线程安全协议:Sybase-Ctlib、Sybase-Dblib、Informix、Tuxedo 和 PeopleSoft-Tuxedo。
Note12:对于支持树视图的协议(如“视图”菜单所示),在树视图中运行 Vuser脚本时, VuGen 将从 Vuser 脚本中的第一个图标开始运行该脚本。
Note13:要显示运行时查看器,必须安装 Microsoft Internet Explorer 4.0 或更高版本。
Note:Vuser 生成“结果摘要”报告时,事务时间可能会增加。Vuser 可以仅在从 VuGen 运行时才生成“结果摘要”报告。使用 Controller 运行 Web Vuser 脚本时, Vuser 不能生成报告。
Note14:当使用 Javascrīpt 和 VBscrīpt Vuser 时,在脚本中用到的 COM 对象必须完全的兼容。这使下列情况成为了可能:一个应用程序操纵另一个应用程序中的对象,或者公开对象以便操纵它们。
9.性能参数解析:
WEB资源参数
网页细分图
DNS解析:显示使用最近的DNS服务器将DNS名称解析为IP地址所需的时间。“DNS 查找”度量是指示DNS解析问题或DNS服务器问题的一个很好的指示器。
CPU utilization :CPU的使用时间百分比
Disk rate :磁盘传输速率
Paging rate :每秒钟读入物理内存或写入页面文件中的页数
Page-in rate :每秒钟读入到物理内存中的页数
Page-out rate :每秒钟写入页面文件和从物理内存中删除的页数
Collision rate :每秒钟在以太网上检测到的冲突数
Context switches rate :每秒钟在进程或线程之间的切换次数
Average load :上一分钟同时处于“就绪”状态的平均进程数
Swap-in rate :正在交换的进程数
System mode CPU utilization :在系统模式下使用CPU的时间百分比
User mode CPU utilization :在用户模式下使用CPU的时间百分比
网络监视参数
数据库服务器
10.AIX操作系统机器性能瓶颈定义:
瓶颈定义
CPU bound : vmstat : when %user+%sys greater than 80%;
Disk I/O bound : vmstat : when %iowait greater than 40%(AIX4.3.3 or later);
Application disk bound :vmstat : when %tm_act greater than 70%;
Paging space low : lsps -a : when used paging space greater than 70% active;
Paging bound : iostat vmstat : paging logical volumes %tm_act greater than 30% of the I/O(iostat) and paging activity greater than 10* the number of CPUs(vmstat);
Thrashing : vmstat sar :rising page outs, CPU wait and run queue;
11.系统性能分析命令:
cpu : vmstat,iostat,topas,nmon,ps,sar,time,timex,netpmon,trace,trcrpt;
内存:vmstat,topas,nmon,ps,svmon,lsps,filemon,trace,trcrpt;
磁盘:iostat,topas,nmon,lvmstat,iostat -d, lvmstat, lsps,filemon,lsattr,lsdev;
网络:netstat,topas,nmon,entstat,nfsstat,ifconfig,iptrace,ipreport,trace,trcrpt;
监视CPU使用情况:vmstat 2 ; iostat -t 2 6;sar -P ALL 2 3;
监视内存使用情况: vmstat 2 10;ps aux;svmon -G;svmon -Pau 10;
监视I/O使用情况: iostat 5;sar -d 3 3;
监视网络使用情况: netstat -i ;netstat -m;netstat -v;
原始链接:http://www.51testing.com/?94273/action_viewspace_itemid_13778.html