- 书名:软件性能测试学习笔记之LoadRunner实战
- 作者:杨婷编著
1、VuGen录制工具栏
2、VuGen录制脚本
(1)录制标签(Recording)
默认选择基于HTML的脚本录制格式,在HTML的高级中默认为第一种,描述用户操作的脚本(A script describing user actions)
而在实际应用中,描述用户操作的脚本虽然便于理解,但每段函数的依赖性太强,脚本灵活度不够。而基于URL的脚本录制(URL-Based script)分解了脚本中的每个细节,不便于业务理解。我们经常选择的录制方式是基于HTML的脚本录制格式中的第二种,仅包含明确URL的脚本类型(A script containing explicit URLs only)。
3、三种录制脚本的差异
第一种:基于HTML,以描述用户操作的方式录制脚本,录制的脚本最为简洁,站在用户视角易于理解。
第二种:基于HTML,以URL的方式录制脚本,这种方式录制的脚本,函数都自带URL地址,脚本相对独立和灵活,即使注释掉其中的某一段也可以正常运行,是脚本录制中最常见的录制方式。
第三种:基于URL的脚本,该录制的脚本信息量要大很多,便于理解操作细节,但可阅读性相对较弱,适合分解步骤时使用。
4、VuGen脚本创建
(2)HTTP属性高级(HTTP Properties → Advanced)
为避免脚本在中文环境下出现乱码,需要在复选框勾选支持的字符集UTF-8
2.“runtime Settings(F4)”运行时设置选项
Run Logic运行逻辑(General → Run Logic)
用于设置当前脚本的迭代次数(也叫循环次数)。例如,设置两次迭代,Action中的脚本将被执行2次
迭代次数不会影响到vuser_init,以及vuser_end,多数情况下我们会把脚本放入Action中方便迭代设置。
(4)迭代增强了脚本的灵活性,但有时并非所有的Action脚本都需要迭代,例如,想要实现1次注册,2次登录的检查就需要引入Block块的概念。
(5) Run Logic运行逻辑(General -> Log)
在VuGen脚本运行时为了更好地了解脚本执行情况,一般会选择查看扩展日志
【特别说明】
扩展日志一般是在单脚本运行时设置,在多脚本运行的Controller中,大多选择标准日志。
(6) Run Logic运行逻辑(General ->Think Time)
思考时间指的是脚本录制过程中产生的用户停顿时间,是用户正常访问的体现。但在单脚本运行的VuGen中,默认选择忽略思考时间(Ignore think time)
【特别说明】:在Controller中的并发操作下,一般选择使用录制思考时间的随机百分比(use random percentage of recorded think time),目的是为了更真实地模拟用户行为。
(7) Run Logic运行逻辑(General ->Think Time)补充
1、Ignore think time(忽略思考时间):忽略录制的思考时间;回放脚本时忽略所有Lr_think_time函数。
2、 Replay think time As recorded
回放期间,使用Lr_think_time函数中显示的参数。例如,Lr_think_time(10)等待10秒。按照;录制实际时间。
3、 Mutiply recordedthink time by
回放期间,使用录制的思考时间的倍数。这可以增加或减少回放期间应用的思考时间。例如,如果录制了4秒的思考时间,可以指示Vuser将该值乘以2,得到总数8秒。要将思考时间缩短为2秒,可以将录制的时间乘以0.5。
4、 Use random percentageof recorded think time
使用录制时间的随机百分比。可以通过指定思考时间的范围来设置思考时间值的范围。例如,如果思考时间参数为4,并且指定最小值喂50%,最大值为150%,则最短的思考时间可以为2(50%),最大值为6(150%)。
5、 Limit thinktime to
为think time设置一个上限,不管上面如何设置,执行的时候,取值都不会超过这个上限。
(8) Run Logic运行逻辑(Browser->Browser Emulation)
LoadRunner回放脚本默认采用IE浏览器,如果想要更改回放脚本的浏览器可以在该页面进行操作。
总结
1、脚本录制方式的选择不同,对脚本的阅读性将产生重大影响,每次录制脚本需要检查,“Recording Options”下,HTML的脚本录制格式是否选择了仅包含明确URL的脚本类型(script containing explicit URLs only)。
2、 VuGen不仅仅是录制脚本,还需要考虑对脚本的各类设置,而VuGen是单脚本运行,在设置上Controller的多脚本仿真并不完全一致,后续执行期间需要多加注意。
5、脚本优化之参数化
成功录制了一个名为“signup”的注册脚本,在脚本回放中我们手动将用户名改为了“tester002”。性能测试的目的是为了模拟大量的并发操作,看系统能否正常处理,我们不能总是注册“tester002”,实践告诉我们这是不允许的,而手动修改的办法并不符合实际需要,所以我们需要引入参数化的概念来解决以上难题。
参数化的目的是模拟真实的用户操作和创建现实的结果,就算系统不对用户名进行注册限制,那么在现实的场景中,也不可能出现全部注册同一个用户名的情况,除非有提前告知或借助神力感应。
当我们利用VuGen生成Vuser Script,脚本中的数据是固定不变的,只有借助参数化手段才能模拟真实用户场景,以百度为例,当录制脚本的时候在百度中输入“软件测试”作为搜索条件
录制的脚本,每次运行都会输入同一组数据“软件测试”,而实际用户的输入千差万别,就算是同一个用户也会有不同的搜索需求,所以该输入条件就是我们需要参数化的对象。
步骤1:首先确定脚本中需要被参数化的数据。数据依实际情况可能是一个,也可能是多个。
步骤2:选中数据,鼠标右键选择替换为参数“Replace with Parameter”->“Create New Parameter”,在弹出的对话框中选择参数类型,并对参数命名。参数的命名一定要便于理解,一眼就能看出该参数的用途,不至于同其他参数混为一谈。
步骤3:选中数据,鼠标右键查看参数列表“Replace with Parameter”-> “Parameter List”中设置参数的取值和参数的更新方式。
【特别说明】:参数的更新方式由两部分组成“Select next row”和“Update Values on”,每个部分都有3个选项,理论上共有九种组合。
理解了参数化的基本原理,下面我们尝试对注册脚本“signup”进行参数化,参数化要求将用户名和密码进行唯一性匹配。用户名:X0001;X0002;X0003;X0004密码0001;0002;0003;0004
填写好参数名称,并选择File类型后系统 会弹出提示“你是否想用参数替换该字符串的所有出现位置?”的对话框。
因username在该脚本中只出现了一次,可以选择“No”,而password在该脚本中会出现两次,可以选择“Yes”,在实际项目中处于谨慎我们最好选择“No”,并自行检查脚本对应字段。
进入参数列表,设置参数的取值和参数的更新方式,选中参数点鼠标右键进入“Parameter Properties…”窗口。
参数设置有四种方式。
第一种:以在页面中直接添加行(Add Row)或列(Add Column)的方式实现;
第二种:选中用记事本编辑,单击参数设置区域左下角“Edit with Notepad”按钮;
第三种:选择导入参数,单击参数设置区域左下角“Import Parameter”按钮;
第四种:选择模拟参数,单击参数设置区域右下角“Simulate Parameter”按钮。
【特别说明】:在日常参数设置中,第一种参数添加方式需要逐个添加,用起来相对繁琐;第二种方式最为直观,使用率最高;第三种则是从外部文件导入,数据之间的格式要求比较严格,使用时要特别注意;第四种模拟数据用于判断参数取值方式是否符合预期。
列的取值(Select column):说明参数取值的位置,从哪一列进行取值,取值方式分两种,按编号取值(By number),或者按名称取值(By name)。
文件格式(File format):默认以“,”逗号作为数据的分隔符,也可选择其他分隔符(不推荐更改)。
取值方式,选择下一行(Select next row),包括三个固定选项。
(1)Sequential:顺序取值,表示此参数从第一行开始取值,依次序取后面的每一行。
(2)Random:随机取值,表示每次参数取值都是随机取值,有重复的可能。
(3)Unique:唯一取值,按Vuser分配的参数要求和自身的取值规则进行取值。
取值方式,更新值的时间(Update Values on),也包括三个固定选项。
(1)Each iteration:每次循环取新值,表示该参数在同一个脚本中取相同的值;
(2)Each occurrence:每次遇到就取新值,表示该参数在同一个脚本中如果出现两次或两次以上都会按照选择下一行的方式重新取值;
(3)Once:一次取值,无论参数出现几次,按照选择下一行的方式,取一次即可。
通过观察,如果在signup的脚本中,username/password参数,选择下一行的取值方式选择Random,更新值的时间选择Each iteration,那么最终username和password的对应关系将不复存在。
取值方式的多样化是LoadRunner的重要特征,如何才能让username和password的对应关系不受取值方式的制约,修改password参数属性的设置,让username和password来自于同一个数据文件。
首先修改File的数据来源,password.dat->username.dat,然后在新的数据文件下增加password的列名。
然后以记事本的方式(Edit with Notepad)打开数据文件,增加password列信息,注意两个字段通过“,”逗号间隔。
最后只要将password列的取值方式改为“Same line as username”,这样无论username按什么样的方式取值对应的password都不会产生混乱
参数化组合方式
为增强脚本的业务仿真度,在实际项目中经常用到Sequential/Random/Unique+Each iteration、Sequential/Random/Unique+Each occurrence的取值组合
首先创建个空脚本,使用lr_eval_string函数尝试几种取值方式的组合用法。
Lr_eval_string函数,表示以字符串的形式返回参数的当前取值。
脚本一:用户设置Vuser=1个,参数设置{parametest}取值为A,B,C,D,E,运行时设置Run Logic迭代=3次,脚本如下。
在运行脚本时日志部分勾选“参数替换类型”的扩展日志。
lr_eval_string(“username”)
参数化组合方式
(1)Sequential+Each interation:
(2)Sequential+Each occurrence:
(3)Sequential+Unique:
(4)Random+Each interation:
(5)Random+Each occurrence:
(6)Ramdom+Unique:
(7)Unique+Each interation:
(8)Unique+Each occurrence:
(9)Unique+once:
6、脚本优化之事务+检查点
实际事务包括以下几个部分
1、Wasted Time,脚本录制过程中,自动插入所花费的时间;脚本录制后,手工编码输入执行所花费的时间。
2、函数自身所消耗的时间,包括lr_start_transation和lr_end_trasnsation函数。
3、Think Time,用于模拟用户操作步骤之间延迟时间的一种技术手段,在录制时,系统会自动生成lr_think_time()函数,单位为秒。
4、响应时间=网络+服务器处理时间
在事务的时间计算中会自动排除第一部分和第二部分的时间,而第三部分的时间会在事务结果中单独统计出来,只要做一下减法也能排除。所以事务针对要度量的时间依然是响应时间。
添加事务的三种方式
1、对脚本完全不熟悉情况下,录制工具栏添加。
2、对脚本较为熟悉,一般都是在录制结束后添加事务。
3、最后一种就是纯手工编码添加事务命令,此方法的效果和前面俩种是一致的。
事务的函数语法如下所示:
int lr_start_transacion(char *transaction_name);
int lr_end_transacion(char *transaction_name,int status);
其中lr_end_transaction函数的int status有4种状态。
1、LR_AUTO说明LR自动根据规则来判断状态,结果为PASS/FAIL/STOP。
2、LR_PASS说明系统做了正确的事,并记录下了对应的时间(响应时间)。
3、LR_FAIL说明事务失败,没有达到脚本应该有的效果,得到的时间不是正确操作的时间(后 期统计中将被独立统计)。
4、LR_STOP说明事务被停止。
如果想快速知道脚本回放成功还是失败,就要用到web_reg_find()的检查点函数。
检查点可以单独判断页面操作情况,但通常会同事务一起使用,用于判断事务时间是否是我们想要的正确时间。
【特别说明】:如果在录制时插入事务,生成的事务段脚本将包含思考时间,也就是说lr_think_time()时间将被计算在事务内,回放脚本前在Replay->Runtime Settings中将Think time改为Replay think time as recorded(按录制参考回放思考时间)
检查点的位置通常是放在事务段的内部,这样便于理解该检查点的作用,检查点函数自身所消耗的时间会被事务自动排除。
7、脚本优化之集合点+思考时间
如果想要实现10位已注册用户,同时进入Web Tours页面,在同一秒单击“Login”按钮。从功能参数角度来看,需要找10名用户同时数1,2,3点击登录。如果人数上升到500人,那就是不容易完成的任务了。
在LR12中集合点的使用分为俩个部分
步骤1:在VuGen中确定并发操作步骤,添加集合点。集合点函数lr_rendezvous(char *rendezvous_name),可以在录制脚本时添加,也可以在录制完成后通过鼠标右键插入。
【特别说明】:集合点只能在Action中添加,添加后不会对VuGen脚本运行产生实质影响,真正影响实在Controller中体现的。
步骤2:在Controller并发操作之前,设置集合点策略。
集合点策略有以下三种。
第一种策略:Release when X% of all Vusers arriver at the rendezvous,当百分之X的Vuser(占总数)到达集合点后释放所有用户。
第二种策略:Release when X% of all running Vusers arriver at the rendezvous(默认选项),百分之X的Vuser(占运行的总数)到达集合点后释放所有用户。
第三种策略: Release when X of Vusers arriver at the rendezvous,当指定的X个Vuser到达集合点后释放所有用户。
举例:50人参加爬山活动,参加人员5人一组进行审核,每10分钟完成一组人员资格审核,然后按指定路线进行登山。
第一种策略:当50名人员全部审核完成后大家一起出发登山。
第二种策略:当第一组(5名)登山人员审核后就可以出发,不用等待后续小组审核。
第三种策略:按指定人数进行登山。
【特别说明】:从并发效果角度来讲,第一种策略效果最明显;但从仿真角度来讲,第二种策略更符合用户的成长方式;第三种是按Vusers的数量,用的相对较少。
【特别说明】:集合点插入位置一定是在事务之外,否则事务的时间统计会把集合等待时间也算进去,这不符合实际情况。
在VuGen的Runtime Settings中,
思考时间默认是被忽略的,这符合单
脚本调试的需要。但在Controller中要
模拟真实用户场景的并发 行为。系统
会自动将思考时间设置为“As Recorded”按录制的实际时间。为了实现更仿真一般会选择使用随机百分比模式