实训LoadRunner测试脚本的参数化
1.1实训目标
能够使用参数化数据解决系统压力问题
能够使用数据池中数据对参数变量实施参数化
能够使用数据库中数据对参数变量实施参数化
具备使用不同数据对系统施加预期压力的能力
1.2问题引出:
观察以下示例代码
web_url("MercuryWebTours",
"URL=http://localhost/MercuryWebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
lr_think_time(5);
web_submit_form("login.pl",
"Snapshot=t3.inf",
ITEMDATA,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=53", ENDITEM,
"Name=login.y", "Value=18", ENDITEM,
LAST);
代码分析:
在这段代码中,用灰色背景黑色字体标识的是用户输入的用户名和口令,如果直接使用这段脚本对应用进行测试,则所有VU都会使用同一个用户名和口令登录系统。
如果要模拟更加真实的应用场景(例如,不同权限的用户执行同一个操作),就有必要将用户名和口令用变量代替,为变量的取值准备一个“数据池”并设定变量的取值规则,这样每个VU在执行的时候就能根据要求取不同的值。
当然,要进行参数化的场合远远不止用户名和口令的处理。
设想这样一种情况,需要模拟多个用户同时操作一个页面,该页面要求用户输入一条信息记录,且规定记录内容不能重复。
对于这种情况,如果不采用参数化的方式,则必须为每个可能的VU使用一个不同的脚本。
采用参数化方式时,只需要将输入的内容设置为参数,在参数池中给出大于VU 的数据即可。
1.3任务描述
“参数化”是LoadRunner的脚本处理过程中最常用的操作技巧之一。
LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而要进行性能测试,在环境变化(例如,需要使用不同的用户名和口令)时就必须让脚本适应环境变化的能力。
可以通过将要更改的内容设为“参数”,然后允许参数以某种方式和形式取值,在脚本运行时就可以通过预先设定的规则,在脚本运行时取不同的值。
要求:完成客户信息的注册任务
(1)对以上数据分别实行参数化,通过回放脚本实现不同用户的注册功能。
(2)添加注册事务
(3)加入集合点
(4)加入验证用户成功注册的检查点
(5)更改运行时日志选项将参数化数据的替换过程在执行日志中显示
1.4覆盖的知识点
录制脚本、参数化、事务、集合点
1.5实训参考步骤
LoadRunner提供了对参数化很好的支持,最简单的方法是通过上下文菜单直接对脚本中的某部分内容进行参数化操作,具体操作方法如下:
(1)在脚本中选择需要参数化的内容,单击右键,从弹出菜单选择Replace with a parameter 命令,如图
(2)在弹出的对话框中给出参数的名称、类型,图中给出的参数名为username,参数的类型为File。
File类型可以利用数据文件为参数提供数据池,并设置参数依据某种规则从数据池中取出替代脚本中的参数。
注意:将某个参数类型设置为File或Table后,可以手工编辑数据文件形成参数的数据池,这里特别需要注意的是数据文件一定要以一个空行结束,否则最后一行输入的数据不会被参
数所使用。
(3)单击该对话框的Properties按钮可以设定参数数据池的内容以及参数的取值方式。
在该对话框中增加参数和设定参数的属性。
指定参数的Update方式
所谓参数的Update方式指名参数在何种情况下发生改变,以何种规则改变。
下图是File类型参数Update方式设置的对话框内容,从图中可以看到,参数的Update方式
包含Select next row、Update value on 和when out of values 3个选项。
Update value on 指明了参数在何时发生改变。
该选择共有3个选项:Each Iteration、Each Occurrence和Once。
Each Iteration表示“在每次迭代时更新参数的值”、Each Occurrence表示“在参数每次出现时更新参数的值”。
对Each Iteration而言,一个VU执行时,每次迭代时更新参数的值,如果在一个迭代过程中参数出现了多次,参数取相同值。
而对Each Occurrence而言,如果一个迭代过程中某参数出现了多次,每次都取不同值。
Once表示VU 执行过程中,只在第一次迭代时为参数取一次值,以后每次迭代取相同值。
Select next row指明以何种方式从数据池中获取数据,该选择共有三个选项,Sequential
(顺序取值),Random(随机取值),Unique(每次取唯一值)。
根据Select next row和Update value on 的不同设置组合,VU运行过程中为参数取不同的值。
举例说明:
例:假设为某个类型为File的参数Username设置表B1所示的数据池,该参数所在的脚本中包含该参数的部分要求迭代2次,执行脚本的VU数量为2个,脚本需要迭代的部分有两个地方使用了参数Username。
则在不同设置时参数取值见表B2描述。
从上表描述可以看出,只有当参数的Select next row 设置为Unique时,才能保证每个vu在每次迭代时取不同的值。
1.6 课后任务
录制一个Tomcat自带的一个小程序numguess,该小程序实现的是一个非常简易的猜数
字游戏,系统随机生成一个1-100之间的数字,作为标准数值,用户在文本框中输入猜测的数字,如果输入的数值比标准数值大,则告知您应该输入小一点的数字;否则相反;如果输入的正好是标准数值,那么就会出现恭喜成功的页面。
知识点:录制脚本、参数化、事务、集合点
参考步骤:
(1)录制脚本URL=http://localhost:8080/jsp-examples/num/numguess.jsp,启动页面,在文本框中输入数字“2”,单击[submit]按钮,完成一个猜数字过程。
停止录制。
(2)录制完成后,需要对脚本进行完善,想考查该小程序的并发处理能力及了解事务的处理时间的情况,所以需要加入集合点和事务。
改良后的脚本代码如下:
Action()
{
lr_rendezvous("集合点");
lr_start_transaction("执行时间");
web_url("numguess.jsp",
"URL=http://localhost:8080/jsp-examples/num/numguess.jsp",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_think_time(5);
web_submit_form("numguess.jsp_2",
"Snapshot=t2.inf",
ITEMDATA,
"Name=guess", "Value=2", ENDITEM,
LAST);
lr_end_transaction("执行时间", LR_AUTO);
return 0;
}
(3)通常,如果猜数字不正确之后,我们都会根据提示,尝试输入另外一个数字,猜这个数字是否就是那个正确的数字。
这就涉及脚本参数化的问题,在这里需要对脚本中的Value=2进行参数化,将其参数化为“guessval”,相应的数据文件为“guessval.dat”,包括数据为“35-44,28-37”。
如果在Controller里进行负载测试的时候,希望10个用户并发,每个虚拟用户取2个数值。
这样必须设置脚本参数的取值策略,数据分配方法选择“Unique”,数据更新方式选择“Each iteration”,同时指定在Controller中执行时“Allocate 2 values for each Vusers”,这样在Controller中进行负载测试时就符合先前设计思想,10个用户进行负载测试,每个用户迭代两次,每次取一个数值。