1.概述
在山东BOSS性能压力 测试 过程中,发现脚本对于整个压力测试过程的重要性,一个压力测试脚本录制和编辑修改得怎么样直接影响后面压力测试的执行。通常情况下,脚本应尽可能的精简,就像写代码一样。针对BOSS系统的特点, 个人 认为把单一业务录制成一个Action,并在脚本中添加Transaction,Find检查(可以采用URL-based scrīpt 方式录制并事先设定),Rendezvous,参数化等基本元素,然而有时我们会发现光有这些基本元素还不能满足我们的要求。比如在Controller中运行我们的脚本时,一旦压力过大或某种原因导致某一业务失败,而此时我们很想尽快地找出错误的原因。当然此时我们第一想到的是,查找 日志 ,但是有时发现查找日志很不方便,因此我们希望寻求一种更快捷的方式,希望能直接从Controller的Errors错误中找到出错的服务号码、在第几次Iteration的哪个Transaction出错。实现的方式,当然是通过简单的编程来调用错误日志里的信息,另外本文中还简单介绍了关于 LoadRunner 工具使用的一些常用注意事项、脚本处理技巧和一些常用性能参数的分析及 性能测试 中机器瓶颈的定义和查看机器瓶颈的相关命令。
下面再具体的一一介绍。
2.一个规范的性能测试脚本就像一段规范的程序代码一样,需要基本的说明信息:
在下面要介绍的脚本中,我把这些信息以注释的形式放在vuser_init最前面:
/*
@corporation:Copyright By *** Technologies CO.,LTD. All Rights Reserved.
@Athour:XuLinLin
@Date:2005-09-18
@Name:异地缴费压力测试脚本
@Parameter:BOSSURL,LogName,PhoneNum,iteration,FanHui
@Data:BOSSURL:BOSSURL.dat; //由于BOSS压力测试前台展现环境多,故将地址也参数化。
LogName:LogName.dat; //登录用操作员,选择具备异地缴费权限的操作员,这里选择的是德州操作员300个。
PhoneNum:PhoneNum.dat; //用于异地缴费的服务号码,这里选择的是烟台的正常在用的标准全球通号码3000个。
iteration:iteration.dat; //用于压力测试出错时,打印出错所在的循环次数。
@Descrīption:此脚本用于测试异地缴费的性能及稳定性,选用德州的操作员对烟台的标准全球通号码进行异地缴费,目标是
通过vuser模仿真实操作员进行异地缴费,达到验证或测试系统性能和稳定性的目的。
@Notes:脚本的录制使用的是LoadRunner8.0的VU,采用的是URL-based scrīpt方式,需要特别注意的是Recording Options(按Ctrl+F7)
的Advanced 选项里的Surport Charset一般情况默认为不选,除非字符集合采用的是国际标准才选中UTF-8选项,否则会出现汉字乱码现象。
*/
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.增强脚本,对脚本进行简单的编程。
增强脚本,对脚本进行简单的编程,为性能或压力测试提供方便,这也是写
本文的宗旨,下面对此做简单的介绍:
5.1首先,定义成功与否的判断标志或字符串。
在此,我把判断成功与否的标志定义在异地缴费Action 最前面,具体定义如下:char fanhuiflag[30]="操作业务数据成功!";
但是大家可能会问,字符串"操作业务数据成功!"从何处而来,可以肯定的不能凭空想象,成功标志可从两三种方式来取得:
第一种:也是最简单的一种,直接从脚本中取得,具体操作是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里去取。见下面的 图片 :
注:Snapshot在录制前要将Recording Options>Advanced里的Save snapshot resources locally 选项选中。
文章来源于领测软件测试网 https://www.ltesting.net/