实训LoadRunner测试脚本的参数化1.1实训目标能够使用参数化数据解决系统压力问题能够使用数据池中数据对参数变量实施参数化能够使用数据库中数据对参数变量实施参数化具备使用不同数据对系统施加预期压力的能力1.2问题引出:观察以下示例代码web_url(MercuryWebTours,URL==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在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而要进行性能测试,在环境变化(例如,需要使用不同的用户名和口令)时就必须让脚本适应环境变化的能力。可以通过将要更改的内容设为“参数”,然后允许参数以某种方式和形式取值,在脚本运行时就可以通过预先设定的规则,在脚本运行时取不同的值。要求:完成客户信息的注册任务如果想应用该系统订购飞机票,那么首先必须注册用户信息。参考数据如下UsernamePasswordFirstnameLastnamePostcodeAddressWilson123456JohnWilson100084PekingDavis654321AdamDavis100084TianjinTony734323TonyJunior100083ShanghaiDiego123456JohnWilson100083Jilin(1)对以上数据分别实行参数化,通过回放脚本实现不同用户的注册功能。(2)添加注册事务(3)加入集合点(4)加入验证用户成功注册的检查点(5)更改运行时日志选项将参数化数据的替换过程在执行日志中显示1.4覆盖的知识点录制脚本、参数化、事务、集合点1.5实训参考步骤LoadRunner提供了对参数化很好的支持,最简单的方法是通过上下文菜单直接对脚本中的某部分内容进行参数化操作,具体操作方法如下:(1)在脚本中选择需要参数化的内容,单击右键,从弹出菜单选择Replacewithaparameter命令,如图(2)在弹出的对话框中给出参数的名称、类型,图中给出的参数名为username,参数的类型为File。File类型可以利用数据文件为参数提供数据池,并设置参数依据某种规则从数据池中取出替代脚本中的参数。注意:将某个参数类型设置为File或Table后,可以手工编辑数据文件形成参数的数据池,这里特别需要注意的是数据文件一定要以一个空行结束,否则最后一行输入的数据不会被参数所使用。(3)单击该对话框的Properties按钮可以设定参数数据池的内容以及参数的取值方式。除这种方法外,还可以通过LoadRunner工具条上的ParamList按钮打开参数列表对话框,在该对话框中增加参数和设定参数的属性。指定参数的Update方式所谓参数的Update方式指名参数在何种情况下发生改变,以何种规则改变。下图是File类型参数Update方式设置的对话框内容,从图中可以看到,参数的Update方式包含Selectnextrow、Updatevalueon和whenoutofvalues3个选项。Updatevalueon指明了参数在何时发生改变。该选择共有3个选项:EachIteration、EachOccurrence和Once。EachIteration表示“在每次迭代时更新参数的值”、EachOccurrence表示“在参数每次出现时更新参数的值”。对EachIteration而言,一个VU执行时,每次迭代时更新参数的值,如果在一个迭代过程中参数出现了多次,参数取相同值。而对EachOccurrence而言,如果一个迭代过程中某参数出现了多次,每次都取不同值。Once表示VU执行过程中,只在第一次迭代时为参数取一次值,以后每次迭代取相同值。Selectnextrow指明以何种方式从数据池中获取数据,该选择共有三个选项,Sequential(顺序取值),Random(随机取值),Unique(每次取唯一值)。根据Selectnextrow和Updatevalueon的不同设置组合,VU运行过程中为参数取不同的值。举例说明:例:假设为某个类型为File的参数Username设置表B1所示的数据池,该参数所在的脚本中包含该参数的部分要求迭代2次,执行脚本的VU数量为2个,脚本需要迭代的部分有两个地方使用了参数Username。则在不同设置时参数取值见表B2描述。表B1参数Username的数据池数据UsernameAliceBobChrisDavidFrankGreenJackSmith表B2不同设置时参数取值Selectnextrow取值Updatevalueon取值参数取值示例SequentialEachIteration每个VU的参数都按照同样的方式取值,第一次迭代中参数Username两次出现都取Alice,第二次迭代中参数Username两次出现都取BobEachOccurrence每个VU的参数都按照同样的方式取值,第一次迭代中参数Username首次出现取Alice,第二次出现取Bob;第二次迭代中参数Username首次出现取Chris,第二次出现取David。Once每个VU的参数都按照同样的方式取值,每次迭代每次出现都取Alice。Selectnextrow取值Updatevalueon取值参数取值示例RandomEachIteration每个VU的参数都按照同样的方式取值,第一次迭代中参数Username两次出现都取相同值,其值为从数据池中随机选择一个,第二次迭代中参数Username两次出现都取相同值,其值为从数据池中随机选择一个EachOccurrence每个VU的参数都按照同样的方式取值,第一次迭代中参数Username首次出现取随机值,第二次出现再取随机值;第二次迭代中参数Username首次出现取随机值,第二次出现再取随机值。Once每个VU的参数都按照同样的方式取值,每次迭代每次出现都取相同随机值。Selectnextrow取值Updatevalueon取值参数取值示例UniqueEachIteration每个VU按照不同的方式取值,对第一个VU,第一次迭代中参数Username两次出现均取Alice;第二次迭代中参数Username两次均取Bob。对第二个VU,第一次迭代中参数Username两次出现均取Chirs;第二次迭代中参数Username两次均取David。EachOccurrence每个VU按照不同的方式取值,对第一个VU,第一次迭代中参数Username第一次取Alice,第二次取Bob;第二次迭代中参数Username第一次取Chris,第二次出现取David。对第二个VU,第一次迭代中参数Username第一次出现取Frank,第二次出现取Green;第二次迭代中参数Username首次出现取Jack,第二次出现取Smith。Once每个VU按照不同的方式取值,第一个VU,两次迭代中参数username每次出现均取相同值Alice。第二个VU,两次迭代中的参数每次出现均取值Bob。从上表描述可以看出,只有当参数的Selectnextrow设置为Unique时,才能保证每个vu在每次迭代时取不同的值。1.6课后任务录制一个Tomcat自带的一个小程序numguess,该小程序实现的是一个非常简易的猜数字游戏,系统随机生成一个1-100之间的数字,作为标准数值,用户在文本框中输入猜测的数字,如果输入的数值比标准数值大,则告知您应该输入小一点的数字;否则相反;如果输入的正好是标准数值,那么就会出现恭喜成功的页面。知识点:录制脚本、参数化、事务、集合点参考步骤:(1)录制脚本URL=,启动页面,在文本框中输入数字“2”,单击[submit]按钮,完成一个猜数字过程。停止录制。(2)录制完成后,需要对脚本进行完善,想考查该小程序的并发处理能力及了解事务的处理时间的情况,所以需要加入集合点和事务。改良后的脚本代码如下:Action(){lr_rendezvous(集合点);lr_start_transaction(执行时间);web_url(numguess.jsp,URL==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);return0;}(3)通常,如果猜数字不正确之后,我们都会根据提示,尝试输入另外一个数字,猜这个数字是否就是那个正确的数字。这就涉及脚本参数化的问题,在这里需要对脚本中的Value=2进行参数化,将其参数化为“guessval”,相应的数据文件为“guessval.dat”,包括数据为“35-44,28-37”。如果在Controller里进行负载测试的时候,希望10个用户并发,每个虚拟用户取2个数值。这样必须设置脚本参数的取值策略,数据分配方法选择“Unique”,数据更新方式选择“Eachiteration”,同时指定在Controller中执行时“Allocate2valuesforeachVusers”,这样在Controller中进行负载测试时就符合先前设计思想,10个用户进行负载测试,每个用户迭代两次,每次取一个数值。