5.5 脚本视图和树视图
VU提供两种视图来查看脚本的内容,一个是脚本视图,另一个是基于图标的树视图(内有快照)。
所有类型的Vuser都有文本脚本视图,但是只有特定的Vuser才会有树视图。
5.5.1 树视图(Tree View)
Tree View也叫做基于icon的View,也就是说,脚本的每个函数在Tree View中都以一个带有icon的节点来代替。可以点击工具栏中的“Tree”按钮或者在“View”菜单下选择“Tree View”,显示VU树视图,如图5-20所示。
图5-20 VU树视图
Tree View的好处是使用户更方便地修改脚本,Tree View支持拖拽,用户可以把任意一个节点拖拽到他想要的地方,从而达到修改脚本的目的。用户可以右键单击节点,进行修改/删除当前函数参数属性,增加函数等操作,通过Tree View能够增加LoadRunner提供的部分常用通用函数和协议相关函数。比如Web Service Vuser就不能通过Tree View参数化一些复杂的数据类型,在这种情况下,就需要Script View了。
5.5.2 脚本视图(Script View)
在Script View中能够看到一行行的API函数,Script View适合一些高级用户,通过Script View向脚本中增加一些其他API函数。可以单击工具栏上的“Script”按钮或者在“View”菜单下选择“Script View”,显示VU脚本视图,如图5-21所示。
注意:当用户在Script View中对脚本做了修改之后,Tree View也会做相应的变化。如果脚本有语法错误,Script View将不能转化为Tree View或缩略图。
图5-21 VU脚本视图
5.5.3 理解Snapshot
Snapshot,顾名思义,就是快照,代表当前的step,Snapshot显示了客户端在执行完当前step后的样子。在Tree Ciew右侧的frame中可以查看Snapshot,在LoadRunner 9.5中,Snapshot包含Page View、Client Request和Server Response。Snapshot有两种生成方式,一种是在record的时候生成,另一种是在replay的时候生成。你可以对比两种方式生成的Snapshot,以发现哪些是动态值,需要参数化。
5.6 事务、同步点和思考时间 5.6.1 Transaction(事务)
事务是计算机程序设计中一个很重要的概念。一个事务应该具有原子性、一致性、隔离性和持久性。这4个属性的详细解释在网上都可以找到。在LoadRunner里,我们定义事务主要是为了度量服务器的性能。每个事务度量服务器响应指定的Vuser请求所用的时间,这些请求可以是简单任务(例如等待对单个查询的响应),也可以是复杂任务(例如提交多个查询和生成报告)。
要度量事务,需要插入Vuser函数以标记任务的开始和结束。在脚本内,可以标记的事务不受数量限制,每个事务的名称都不同。
在场景执行期间,Controller将度量执行每个事务所用的时间。场景运行后,可使用LoadRunner的图和报告来分析各个事务的服务器性能。 设置Transaction的方法如下:
选择新Transaction开始点,在被度量脚本段之前插入lr_start_transaction。 选择新Transaction结束点,在被度量脚本段之后插入lr_end_transaction。 下面的脚本例子中将登录操作设为一个名为“login”的事务: Lr_start_transaction(\web_submit_form(\ \ ITEMDATA, \ \ \ENDITEM, \\ LAST); Lr_end_transaction(\ 如果上面手工插入Transaction函数看作是“显式事务”的话,那么LoadRunner还提供了一种“隐式事务”的机制,在VU的Run-time Settings中又称为“自动事务”。
在Run-time Settings中,在Miscellaneous选项卡的Automatic Transactions中定义自动事务。
可以设置LoadRunner直接按事务处理Vuser中的每个Action或step。这里,Action指的是vuser_init、Action和vuser_end三大函数,而step指的是LoadRunner执行的每个函数。LoadRunner将Action名或step名指定为事务名。在默认情况下,将启用按Action使用自动事务的功能,如图5-22所示。
图5-22 VU定义自动Transaction
要禁用按操作使用自动事务的功能,清除“Define each action as a transaction”复选框(默认情况下启用)。
要启用按步骤使用自动事务的功能,选中“Define each step as a transaction”复选框(默认情况下禁用)。
提示:Transaction的开始点和结束点必须在一个Action中,跨越多个Action是不允许的。
Transaction的名字在脚本中必须是唯一的,当然也包括在多Action的脚本中。
你也可以在一个Transaction中创建另外一个Transaction,叫做Nested Transaction。详细使用方法可参看LoadRunner函数手册。
5.6.2 Rendezvous Point(同步点)
要在系统上模拟较重的用户负载,需要同步各个Vuser以便在同一时刻执行任务。通过创建集合点,可以确保多个Vuser同时执行操作。当某个Vuser到达该集合点时,Controller会将其保留,直到参与该集合的全部Vuser都到达。当满足集合条件时,Controller将释放Vuser。
可通过将集合点插入到Vuser脚本中来指定会合位置。在Vuser执行脚本并遇到集合点时,脚本将暂停执行,Vuser将等待Controller允许继续执行。Vuser被从集合释放后,将执行脚本中的下一个任务。
下面脚本以多用户运行时(在Controller中执行场景),所有的用户会一同发起登录请求。
Lr_rendezvous(\web_submit_form(\ \ ITEMDATA, \ENDITEM, LAST); \ 提示:只能在Action中添加集合点(不能在vuser_init/vuser_end中添加)。 提示:因为同步点是协调多个虚拟用户的并发操作,显而易见,在VU运行脚本时,同步点是没有任何意义的,只有Controller多用户并发场景时,同步点的意义才表现出来(我们在Controller一章中会有详述)。 思考
在Transaction的开始和结束中间,插入同步点会对Transaction有什么影响?
5.6.3 注释
写脚本和写程序一样,应该养成经常写注释的习惯。
在LoadRunner C脚本中,LoadRunner支持C的注释方法。 以下是文件头注释,如图5-23所示。
图5-23 VU脚本信息注释
也可插入注释以描述脚本函数功能的信息,如图5-24所示。
图5-24 VU脚本函数注释 5.6.4
Think Time(思考时间)
用户在执行两个连续操作期间等待的时间称为“思考时间”。Vuser使用lr_think_time函数模拟用户思考时间。录制Vuser脚本时,Vugen将录制实际的思考时间并将相应的lr_think_time语句插入到Vuser脚本。可以编辑已录制的lr_think_time语句,而且可以向Vuser脚本中手动添加更多的lr_think_time语句。
提示:添加以上语句的途径有多种,我们可以通过Tree View、Script View以及快捷图标来添加事务、同步点、思考时间和注释等函数。
提示:lr_think_time的参数单位是秒,比如lr_think_tim(5)意味着LoadRunner执行到此条语句时,停留5秒,然后再继续执行后面的语句。
提示:如果不想在脚本中执行Think Time语句,需要逐条语句删除,那是件很麻烦的事情,所以LoadRunner提供了在Run-time Settings中可以设置直接忽略Think Time,而不用修改脚本,如图5-25所示。
图5-25 在VU运行时设置中忽略Think Time
上述设置生效后,脚本运行时,脚本中所有的lr_think_time语句都不会被执行。 思考
在一个Transaction里,插入lr_think_time语句,对Transaction会有什么影响?
思考
有Think Time的脚本和没有Think Time的脚本相比,哪个给服务器造成的压力大?哪个更符合用户实际的工作场景?
5.7 数据驱动——参数化(Parameters)
数据驱动就是把测试脚本和测试数据分离开来的一种思想,脚本体现测试流程,数据体现测试案例。数据不是hard-code在脚本里面,这样大大提高了脚本的可复用性。而LoadRunner的参数化功能是数据驱动测试思想的一个重要实现。
在本节中,我们要学习的是:理解参数的局限性,建立参数,定义参数的属性,理解参数的类型,为局部数据类型设置参数的属性,为数据文件设置参数的属性,从已经存在的数据库中引入数据。
5.7.1 为什么需要参数化
在录制程序运行的过程中,Vugen(脚本生成器)自动生成了脚本以及录制过程中实际用到的数据。在这个时候,脚本和数据是混在一起的。
比如,你用VU的Web Vuser录制一个用户登录Web系统的过程,对于登录的操作,会生成以下脚本:
web_submit_form(\ \ ITEMDATA, \ \ \ \ LAST); web_submit_form是登录触发的动作,而“robin”和“123456”是填入的数据。如果Controller里以多用户方式运行这个脚本的时候,每个虚拟用户都会以同样的用户名“robin”、密码“123456”去登录Web系统。这样做性能测试,我们的客户可能不会答应,因为这显然不是一个真实的业务场景。尤其现在服务器大多会采用Cache功能提高系统性能,用同样的用户名/密码登录系统的Cache命中率会很高,也要快得多。
因此,我们的客户希望当用LoadRunner多用户多循环运行时,不会只是重复一个用户的登录,也就是说,此函数中的数据要能变化,这样的话,就把这些数据用一个参数来代替,其实就是把常量变成变量。参数化后的脚本如下:
web_submit_form(\ \ ITEMDATA, \ \ \ \ \ LAST); 参数化后,用户名“robin”被一个参数{username}替换,密码“123456”被另外一个参数{passwd}代替。{username}和{passwd}分别和参数文件关联,在脚本运行时,用户名和密码