VU——用户行为的模拟器
LoadRunner之所以强大,很大原因是VU的功能强大。VU几乎支持模拟当今所有主流的软件客户端,同时还在不断地推陈出新,每个Vuser脚本的设置也是非常繁多和详细的,达到了精确模拟的效果
了解熟悉VU是玩转LoadRunner要做的第一件事情,最常听到的关于VU的描述就是VU通过运行VU脚本模拟了用户对软件操作行为
VU是基于网络协议的,被测服务器是通过各种各样的网络协议与客户端打交道的。VU要“骗过”被测服务器,当然就要遵守这些协议,按规矩、步骤来动作,否则就会吃“闭门羹”,毫不留情地被服务器拒绝
VU录制生成的也是网络协议层次的脚本,在回放时,VU将按照录制下来的网络协议,一一重放,基于网络协议脚本的好处是,可以使用相对少的硬件资源,来生成大量的虚拟用户负载。相比之下,WinRunner和QTP的脚本是基于界面事件GUI的,它在一台主机上同时只能运行一个虚拟用户的脚本,因为一个虚拟用户会占用整个主机的资源。
推论一,VU不关心用户在界面上发生的事情
推论二,VU中的操作关联与界面上的操作关联是不一致的
如用客户查询系统,查询出此客户
1、点击这个客户,打开另外一个页面,展现此客户的基本信息
2、点击基本信息中的“交易历史明细”,系统经过查询后,刷新此页面,显示明细结果
3、显示,在UI测试中,要测试第三步骤,之前必须完成第一步和第二步,但在VU中就不是这样
这三个操作被VU记录成三个函数,如果是上下文无关的函数,其实完全可以忽略掉第一和第二个函数,只执行和参数化第三个函数
录制脚本
VU通过录制用户在客户端软件的操作直接生成脚本,用户的每个协议级的操作以LoadRunner的API函数方式记录在脚本里。回放脚本的时候,通过执行API函数来模拟最初用户的操作动作
选择协议
LoadRunner具体有哪些协议,Vuser类型可根据应用领域分为下列几种:
应用程序部署解决方案:Citrix ICA
客户端/服务器:MS SQL Server、Oracle(2层)、Sybase Ctlib等协议
自定义:C模版、Java模版、JavaScript类型的脚本
分布式组件:适用于COM/DCOM、Corba-Java和Rmi-Java协议
电子商务:FTP、Web(HTTP/HTML)、SOAP等协议
流数据:Media Player(MMS)和Real协议
无线:i-Mode、VoiceXML和WAP协议
新建Vuser,弹出协议选择对话框
两种协议选择方式:单协议模式和多协议模式
单协议模式
用户以单协议录制时,VU只录制在既定协议上的用户操作,在VU中我们可以使用单协议模式选择任何一种协议
多协议模式
用户以多协议录制时,VU录制几个协议上的操作,不是任意的协议都可以组合成多协议模式。有以下协议支持多协议录制:COM、FTP、IMAP、Oracle NCA、POP3、Real Player、Windows Socket(raw)、SMTP和web。双协议Web/Win Socket应该被看作单协议,因为其机制与多协议不一样
不同类型的Vuser的另外一个区别是多Action的支持,一些协议支持多Action,目前这些协议是:Oracle NCA、Web、RTE、general C、WAP、I-Mode和voice XML
规划脚本结构
在录制时,用户可以选择哪些操作生成脚本在vuser_init、Action和vuser_end中,同时,也可以在录制时随时加入transaction的定义、注释和同步点
HTTP Vuser 中的 URLmode 和 HTML mode
“URL-based script”说明脚本中的表示采用基于URL的方式,所有的HTTP的请求都会被录制下来,单独生成函数,所以URL模式生成的脚本会显得有些杂乱
选择HTML还是URL录制
(1)基于浏览器的应用程序推荐使用 HTML-based script
(2)不是基于浏览器的应用程序推荐使用URL-based script
(3)如果基于浏览器的应用程序中包含了JavaScript并且该脚本向服务器产生了请求,比如DataGrid的分页按钮等,也要使用URL-based script方式录制
(4)基于浏览器的应用程序中使用了HTTPS安全协议,使用URL-based script方式录制
查看日志
在录制和回放的时候,VU会分别把发生的事件记录成日志文件,这些日志有利于跟踪VU和服务器的交互过程。可以通过VU输出窗口观察日志,也可以到脚本目录中直接查看文件
1、执行日志
脚本运行时的输出都记在Log里
“输出”窗口的“执行日志”显示的消息用于描述Vuser运行时执行的操作。该信息可说明在方案中执行脚本时,该脚本的运行方式
脚本执行完成后,可以检查“执行日志”中的消息,以查看脚本在运行时是否发生错误
“执行日志”中使用了不同颜色的文本
黑色:标准输出消息
红色:标准错误消息
绿色:用引号括起来的文字字符串(例如URL)
蓝色:事务信息(开始、结束、状态和持续时间)
如双击以操作名开始的行,光标将会跳到生成的脚本中的相应步骤上
执行日志是我们调试脚本时最有用的信息
录制日志
当录制脚本时,Vugen会拦截Client端(浏览器)与Server端(服务器)之间的对话,并且通通记录下来,产生脚本。
脚本和Recording Log最大的差别在于,脚本只记录了Client端要对Server端所说的话,而Recording Log则是完整记录二者的对话,因此通过录制日志,能够更加清楚地看到客户端与服务器的交互,对我们开发和debug脚本非常有帮助
产生日志
产生日志记录了脚本录制的设置、网络事件到脚本函数的转化过程
回放脚本
单击run按钮,或按快捷键“F5”就可以运行脚本
关联
录制好的脚本回放能否成功时,首先想到第一个可能出现的问题—关联
关联是LoadRunner中一个重要的应用,也是经常犯错误的地方
如果脚本需要关联(Correlation),在还没做之前是不会执行通过,也就是会有错误信息发生,会出现什么错误信息,与系统实际的错误处理机制有关,错误信息有可能会提醒您要重新输入,但是也有可能直接就显示HTTP404的错误信息,这种问题在任何系统中都是非常常见的问题
服务器返回给客户端一些动态变化的值,客户端使用这些值访问服务器的时候,不能把这些值写死在脚本里面,而应该存放在一个变量里面。这就是关联的概念
VU为我们提供了三种关联机制
录制前Correlation(关联)
服务器就像一个“饭店”,而客户端就像“拿着小票领饭的食客”。如果在进饭店之前,已经预先知道小票的样子,那么这时就可以启用录制前关联了,录制前关联又叫做规则关联。使用录制前关联的必要条件是必须在录制脚本之前就知道哪些变量是需要关联的
规则来源有两种:
(1)内建关联规则
Vugen已经针对常用的一些应用系统,如mySAP、Oracle、Siebel等内建关联规则,这些应用系统可能会有一种以上的关联规则
(2)使用者自订关联规则
除了内建的关联规则之外,使用者也可以自订关联规则
规则的应用
(1)启用自动关联(auto-correlation)
点选Vugen的“Tools”>“Recording Options”,打开“Recording Options”对话框,选取“HTTP Properties” >“Correlation”,勾选“Enable correlation during recording”,以启用自动关联
(2)运行脚本验证关联机制
当关联规则都运行开始录制脚本时,在录制过程中,当Vugen侦测到符合关联规则的数据时,会依照设定建立关联
录制后关联
有别于内建关联,录制后关联则是在执行脚本后才会建立关联,当录制完脚本后,脚本至少需要被执行过一次,录制后关联才会座椅。录制后关联会尝试找出录制时与执行时,服务器响应内容的差异部分,找出需要关联的数据,并建立关联
有时可能有些需要做关联的动态数据,连自动关联都无法侦测出来,这时就需要手动关联
手动关联
录制前关联和录制后关联都属于自动关联范畴,一般靠自动关联能够解决脚本中大多数的关联问题,但是万一它们都不能起作用的话,那只能采用手动关联方法了。手动关联的原理与自动关联一样,就是找出哪些变量是需要关联的,然后用LoadRunner提供的web_reg_save_parame来实现关联
手动关联的执行过程
1、使用相同的业务流程与数据,录制两份脚本
2、使用WinDiff工具协助找出需要关联的数据
WinDiff是内嵌在VU中的一个文件比较工具,用于比较两个文件的内容,在这里用它来比较两个脚本的不同之处,从而找到需要被关联的数据
3、确定被关联数据的左、右边界
4、使用web_reg_save_param函数手动建立 关联
5、将脚本中有用到关联的数据,以参数取代
关联的用途和意义:
1、简化和优化脚本代码
2、动态产生数据
3、支持唯一数据
有些系统要求使用唯一的数据,录制时生成的数据,在回放时就重复了,无法保持唯一,也将不可用
手动关联实现原理
1、捕获第一个操作的输出
需要知道哪个值需要关联的,可以用wdiff去对比两个录制同样操作的脚本,其中不同的地方可能就是需要关联的
2、保存为参数
3、将参数化传递到另外一个操作的输入
把另外一个操作中的常数,替换成参数变量
脚本视图和树视图
VU提供两种视图来查看脚本的内容,一个是脚本视图,另一个是基于图标的树视图,所有类型的Vuser都有文本脚本视图,但是只有特定的Vuser才会有树视图
树视图(Tree View)
TreeView也叫做基于icon的View,也就是说,脚本的每个函数在Tree View中都以一个带有icon的节点来代替。
TreeView的好处是使用户方便地修改脚本,TreeView支持拖拽,可以把任意一个节点拖拽到他想要的地方,从而达到修改脚本的目的。用户可以右键单击节点,进行修改/删除当前函数参数属性,增加函数等操作,通过TreeView能够增加LoadRunner提供的部分常用通用函数和协议相关函数。如WebServiceVuser就不能通过TreeView参数化一些复杂的数据类型,这种情况下,就需要ScriptView
脚本视图(Script View)
在ScriptView中能够看到一行行的API函数,ScriptView合适一些高级用户,通过ScriptView向脚本中增加一些其他API函数
理解Snapshot
Snapshot——快照,代表当前的step,Snapshot显示了客户端在执行完当前step后的样子
Snapshot有两种生成方式
一种是在record的时候生成,另一种是在replay的时候生成。可以对比两种方式生成的Snapshot,以发现哪些是动态值,需要参数化
Transaction(事务)
事务是计算机程序设计中一个很重要的概念。
一个事务应该具有原子性、一致性、隔离性和持久性
在LoadRunner里,定义事务主要是为了度量服务器的性能。每个事务度量服务器响应指定的Vuser请求所用的时间,这些请求可以是简单的任务,也可以是复杂的任务
手工插入Transaction函数分为“显示事务”和“隐式事务”的机制,在VU的Run-time Settrings中又成为“自动事务”
在Run-time Settrings中,在Miscellaneous选项卡的Automatic Transaction中定义自动事务
可以设置LoadRunner直接按事务处理Vuser中的每个Action或step。Action指的是vuser_init、Action和vuser_end三大函数,而step指的是LoadRunner执行的每个函数,LoadRunner将Action名或step名指定为事务名,默认情况下,将启用按Action使用自动事务的功能
Rendezvous Point(同步点)
在系统上模拟较重的用户负载,需要同步各个Vuser以便在同一时刻执行任务,通过创建集合点,可以确保多个Vuser同时执行操作。当某个Vuser到达该集合点时,Controller会将其保留,直到参与该集合的全部Vuser都到达。当满足集合条件时,Controller将释放Vuser
可以通过将集合点插入到Vuser脚本中来指定会合位置
ThinkTime(思考时间)
用户在执行两个连续操作期间等待的时间称为“思考时间”
Vuser使用lr_think_time函数模拟用户思考时间,录制Vuser脚本时,Vugen将录制实际的思考时间并将相应的lr_think_time语句插入到Vuser脚本。可以编辑已录制的lr_think_time语句,且可以向Vuser脚本中手动添加更多的lr_think_time语句
数据驱动—参数化
数据驱动就是把测试脚本和测试数据分离开来的一种思想,脚本体现测试流程,数据体现测试案例。LoadRunner的参数化功能是数据驱动测试思想的一个重要实现。
为什么需要参数化
在录制程序运行的过程中,Vugen(脚本生成器)自动生成了脚本以及录制过程中实际用到的数据,在这个时候,脚本和数据是混在一起的
客户希望当用LoadRunner多用户多循环运行时,不只是重复一个用户的登录,此函数中的数据要能变化,这样,就把某些数据用一个参数来代替,就是把常量变成变量
参数化是学习LoadRunner中经常用到的功能,除了实现数据驱动之外,参数化脚本还有以下两个优点
1、可以使脚本的长度变短
2、可以增强脚本的可读性和可维护性
实际上,参数化的过程如下:
1、在脚本中用参数取代常量值
2、设置参数的属性以及数据源
参数的创建
LoadRunner对脚本中参数个数没有限制,可以在一个脚本中创建任意多个参数。VU可以通过Tree View和Script View两种途径来改变脚本,包括参数化功能
参数的类型,在定义参数属性的时候,要指定参数值的数据源。可以指定下列数据源类型中的任何一种
1、Data Files
这是最常使用的一种参数类型,它的数据存在于文件中。该文件的内容可以手工添加,也可以利用LoadRunner 的 Data Wizard从数据库中导出
2、User-Defined Functions
调用外部DLL函数生成的数据
3、Internal Data
模拟用户内部产生的数据
Internal Data包括以下几种类型
Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,可以从菜单列表中选择格式,或者指定自己的格式。这种格式应该和脚本中录制的Date/Time格式保持一致
Group Name用虚拟用户组名称替换参数。在创建scenario的时候,可以指定虚拟用户组的名称。注:从VU运行脚本的时候,虚拟用户组名称总是None
Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机
Iteration Number用当前的迭代数据替代参数
Random Number 用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围
Unique Number用一个唯一的数字来替换参数,可以指定一个起始数字和一个快的大小
Vuser ID用分配给虚拟用户的ID替换参数,ID是由LoadRunner的控制器在scenario运行时生成的。如果从脚本生成器运行脚本的话,虚拟用户的ID总是-1
定义参数的属性
参数的属性定义就是在脚本执行过程中,定义参数使用的数据源
1、可以在基于文本的脚本视图中定义参数属性
2、也可以在基于图标的树视图中定义参数属性
使用参数列表可以在任意时刻查看所有的参数、创建新的参数、删除参数,或者修改已存在的参数的属性
数据文件包含者脚本执行过程中虚拟用户访问的数据,局部和全局文件中都可以存储数据。
如果使用文件作为参数的数据源,必须指定以下内容:文件的名称和位置、包含数据的列、文件格式、包括列的分隔符、更新方法
1、顺序(Sequential):该方法顺序地给虚拟用户分配参数值
2、随机(Random):该方法在每次迭代的机会从数据表中随机取一行的数据
3、唯一(Unique):该方法分配一个唯一的有顺序的值给每个虚拟用户的参数
4、与以前定义的参数取同一行(Same Line As ):该方法从与以前定义过的参数中同样的一行分配数据,但必须指定包含有该数据的列。注:至少其中的一个参数必须是Sequential、Random或者Unique
高级—从已存在的数据库中导入参数数据
LoadRunner允许利用参数化从已经存在的数据库中导入数据
1、使用Micorosoft Query(在系统上先安装MS Query)
2、指定数据库连接字符串和SQL语句
用户脚本生成器在数据库中导入数据的过程中提供了一个向导。在想到中,指明如何导入数据——通过MS Query创建查询语句或者直接写SQL语句
检查点(Check point)
LoadRunner的很多API函数的返回值会改变脚本运行结果。如:web_find函数,如果它查找匹配的结果为空,它的返回值就是LR_FALL,整个脚本的运行结果也将置为FALL,反之,查找匹配成功,则web_find返回值是LR_PASS,整个脚本的运行结果置为PASS。脚本的结果则反应在Controller的状态面板上和Analysis统计结果中
仅仅通过脚本函数执行结果来决定整个脚本的成功/失败,这太草率了,因为脚本往往是在执行一个业务流程,VU脚本函数本身就是协议级的,它执行的失败会引起整个业务的失败,但它运行成功却未必意味着业务会成功
检查点,并不是一个LoadRunner里专有的概念。在WinRunner和QTP中就有检查点,对于自动化测试来讲,检查点是一个很重要的功能,它的作用是验证程序的运行结果是否与预期结果相符
web_find和web_reg_find函数两者有一些差别
1、web_reg_find先注册的优势是脚本能够一边接受Server的数据缓冲,一边进行查找,提高了查找的效率
2、web_reg_find的参数与web_find并不完全一样,其中有个参数叫做SaveCount,它能够记录查找匹配的次数。而web_find的机制是一旦查找匹配成功,就立即返回,并不继续查找和记录匹配次数
3、VU run time设置“enable image and text check”对web_find有效,而对 web_reg_find无效
检查点设置技巧
如何加入检查点,才能检查出正确的结果。与事实相符,这的确有一些技巧:
1、它必须满足是验证事务通过与否的充分必要条件。检查点通过,我们就能够确信系统是一个正常的状态
2、检查点可以是常量,也可以是变量
3、检查点可以是文本、图像文件,也可以是数据库记录等
高级——多Action
对于支持多Action的Vuser,可以把一个脚本的Action import到另外一个脚本中。必须要保证这两个import的脚本Vuser类型是相同的。注意,被import的Action中的有关参数也要一同被improt。选择被import的脚本,然后选择被import的Action
1、迭代次数:LoadRunner将按指定的次数重复执行所有Actions,但不会重复Vuser脚本的vuser_init和vuser_end部分
需要注意的是,如果在Controller的计划设置中指定方案持续时间,则持续时间设置将覆盖Vuser迭代设置。意味着,如果将持续时间设置为5分钟(默认设置),Vuser将在5分钟内按照需要继续运行任意多次迭代,即使运行时设置仅指定一次迭代
2、操作块:是脚本内函数的组合,每个块都有自己的单独属性设置,包括顺序、迭代和权重。可以通过单击“Properties”设置Block的属性
3、顺序:可以设置块内脚本的操作顺序。有两种方式:按顺序和随机执行操作
4、迭代:除了为整个Run部分设置迭代次数以外,还可以设置单个操作或操作块的迭代。读设置非常有用,例如 可以用模拟一个商业站点,你在该站点执行了多个查询查找某个产品,但只进行一次采购
高级——脚本错误处理机制
一个好的脚本应该具有健壮性,要能够捕捉到错误,并能采取有效的错误处理方式,否则脚本一旦发生错误,唯一的出路就是退出执行
VU提供了一套在出错情况下的脚本处理机制。VU的错误处理机制可设定Vuser在执行脚本时遇到错误怎样处理。当Vuser遇到错误时,可以有两种处理策略:一是停止执行脚本,这适用于严重的问题。第二种是忽略这个错误,继续执行下去。
使用lr_continue_on_error函数。通过lr_continue_on_error函数可以控制Vuser脚本特定段的错误处理,标记就用lr_continue_on_error(1)和lr_continue_on_error(0)语句将其括起来
使用lr_continue_on_error函数的脚本段将会覆盖“出现错误时仍继续”的Run-time Settings运行时设置
高级——脚本调试技巧
解释性语言的调试一直是个棘手的问题,如果没有专门的debug工具,只能通过加入变量输出语句来查看每个变量值的变化,下面是两种比较常用的调试脚本的方式,并不是真正意义上的调试
动态运行与非动态运行
脚本可以设置为Animated运行模式和非Animated运行模式,
在Animated运行模式下,VU会显亮当前正在执行的脚本语句。可以通过VU设置语句执行的延迟时间,以便观察每行代码执行的效果
在非Animated运行模式下,VU在执行脚本时不会显亮语句,而直接执行下去。显然,Animated运行模式是我们调试脚本的一个很好的方法
日志设置
对于软件开发人员来讲,日志无疑是跟踪和调试最好的线索
1、仅在出错时发送消息:指示Vugen仅当出错时记录log
2、标准日志:创建在脚本执行期间所发送的函数和消息的标准日志,供调试时使用。大型负载测试方案应禁用该选项
3、扩展日志:创建扩展日志,包括警告和其他消息。大型负载测试方案禁用该选项
可以使用“扩展日志”选项指定应向扩展日志中添加哪些其他信息:
参数替换:选择该选项可记录指定给脚本的所有参数及其相应的值
服务器返回的数据:选择该选项可记录服务器返回的所有数据
高级跟踪:选择该选项可记录Vuser在会话期间发送的所有函数和消息。调试Vuser脚本时,该选项非常有用
VU脚本运行成功后,可以创建Controller场景并运行场景