LoadRunner脚本编写.doc_第1页
LoadRunner脚本编写.doc_第2页
LoadRunner脚本编写.doc_第3页
LoadRunner脚本编写.doc_第4页
LoadRunner脚本编写.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 LoadRunner脚本编写LoadRunner生成脚本的方式有两种,一种是自己编写手动添加或嵌入源代码;一种是通过LoadRunner提供的录制功能,运行程序自动录制生成脚本。这两种方式各有利弊,但首选还是录制生成脚本,因为它简单且智能化,对于测试初学者来说更加容易操作。但是仅靠着自动录制脚本,可能无法满足用户的复杂要求,这就需要手工添加函数,进行必要的手动关联或在函数中进行参数化来配合,增强脚本的实用性。手写添加增强脚本的独特之处在于:1可读性好,流程清晰,检查点截取含义明确。业务级的代码读起来总比协议级代码更容易让人理解,也更容易维护,而且必要时可建立一个脚本库。而录制生成的代码大多没有维护的价值,现炒现卖。2手写脚本比录制的脚本更能真实地模拟应用运行。因为录制的脚本是截获了网络包,生成的协议级的代码,而略掉了客户端的处理逻辑。3手写脚本比录制脚本更能提高测试人员的技术水平。LoadRunner提供了Java user、VB user、C user等语言类型的脚本,允许用户根据不同的测试要求自定义开发各种语言类型的测试脚本。增强脚本的好坏关系到这个脚本是否能在实际运行环境中更真实地进行模拟操作。至于具体使用哪种方式来生成脚本,还应该以脚本模拟程序的真实有效为准。例如,有些程序只需要执行迭代多次操作,没有特殊要求,选择自动生成的脚本就可以了;有些程序需要加入参数化方可满足用户的要求,此时应该使用增强的手工脚本。再就是结合项目进度、开发难易程度等因素综合考虑。3.1 插入检查点在进行Web应用的压力测试时,经常会有页面间数据传递的操作,如果做性能测试时传递次数逐渐增多,页面间就会发生传递混乱的情况,或者客户端与服务端数据传输中断或不正确的现象。为了解决这些问题,LoadRunner提供了在脚本中插入检查点的方法,就是检查Web服务器返回的网页是否正确。在每次脚本运行到此检查点时,自动检查该处的网页是否正确,省去执行结束后人工检查的步骤和时间,进而加快了测试进度。插入检查点的方法,在工作原理上说就是在VuGen中插入Text/Image检查点。这些检查点验证网页上是否存在指定的Text或者Image,还可以测试在比较大的压力测试环境中,被测的网站功能是否保持正确。VuGen在进行Web测试时,有Tree View和Script View两种视图方式。前面我们见到的一直都是Script View,但在插入Text/Image检查点时,使用Tree View(树视图)视图方式会比较方便。这种视图之间切换,可以通过菜单或者工具栏的方式进行,如图3-1所示。图3-1 切换至Tree View视图现在切换到TreeView,如图3-2所示。图3-2 TreeView插入检查点的步骤比较简单,既可以在录制过程中添加Text/Image检查点,也可以在录制完成后进行,推荐使用录制过程中添加Text/Image检查点的方式。首先在树形菜单中选择需要插入检查点的项目,单击鼠标右键,选择将检查点插入进去。如果在该操作执行前检查,则选择Insert Before,在该操作执行后检查则选择Insert After,如图3-3所示。图3-3 插入检查点然后系统将弹出如图3-4所示的对话框,选择Text Check(这里以Text检查点为例说明)。单击OK按钮后,会出现Text Check Properties对话框,如图3-5所示。图3-4 选择检查点类型图3-5 检查点的属性配置然后切换到General选项卡页上(如图3-6所示),在Step Name的文本框中输入该操作的步骤名称(该名称应该尽量能反映该操作要搜索的对象)。图3-6 输入检查点的名称单击确定后,即可完成添加Text检查点的任务。添加Image检查点的操作步骤和Text检查点基本相同,在此仅仅对Image Check Properties对话框与Text Check Properties的不同之处进行说明,其他的项目和Text检查点的方法类似,可以参考前面的内容,不再一一进行介绍。需要在Image Check Properties对话框中输入图片的提示信息和相对路径,如图3-7所示。图3-7 Image检查点的属性配置当然VuGen还允许插入其他类型的检查点函数,比如Web_reg_find、Web_global_verification等。而且也可以对搜索Text/Image值的参数化,这里就不再一一说明。如果Web窗体中包含有JavaScript脚本,那么在Tree View中显示可能会有问题,要解决这个问题,可以在General选项中进行适当设置。单击Tools菜单选择General Options,如图3-8所示。进入图3-9所示的设置窗口,切换到Correlation选项卡上,选中Enable Scripting and Java applets on Snapshots viewer的复选框即可。单击OK后,设置完毕。图3-8 选择General Options图3-9 General Options设置3.2.1 参数化定义3.2 设置参数化方法让所有Vuser都使用相同的数据来运行,对系统造成的压力与实际情况会有所不同。例如,测试一个网站系统时使用了100个Vuser同时进行登录网站后台的并发操作。我们在录制脚本以后没有修改脚本数据信息,所有Vuser的Session(会话)数据信息都完全一模一样。而此网站系统为了防止黑客的攻击已经禁止一个用户多次登录的系统后台的操作。此时的测试过程将无法展开。为了解决这个问题,让系统更加真实地模拟多用户使用的实际环境,LoadRunner提供了对脚本进行参数化输入的功能。所谓的脚本参数化,就是针对脚本中的某些常量,定义一个或多个包含数据源的参数来取代,让场景中不同的Vuser在执行相同的脚本时,分别使用参数数据源中的不同数据代替这些常量,从而达到模拟多用户真实使用系统的目的。3.2.1 参数化定义如果用户在录制脚本过程中,填写并提交了一些数据(如增加数据库记录等),这些操作都被记录到了脚本中。当多个Vuser运行脚本时,如果对这些数据不加改动直接提交,提交的肯定都是相同记录,非但与实际运行情况不符,还有可能引起冲突。为了模拟更加真实的环境,可以使用动态参数输入的方法。在用户脚本中引入参数,不仅简化了脚本,还可以使用不同的数值来测试。例如,如果搜索不同名称的产品,仅需要写一个带参数的提交函数。在回放的过程中,传递不同的参数值就可以了。录制业务流程时,VuGen生成一个由函数构成的Vuser脚本。函数中参数的值是录制期间使用的实际值。例如,在操作Web应用程序时录制了一个Vuser脚本,用于在数据库中搜索标题UNIX。VuGen生成下列语句,如图3-10所示。图3-10 脚本示例使用多个Vuser和迭代来重播该脚本时,如果不想重复使用相同的值UNIX,那么,可以用参数来替换该常量值,如图3-11所示。图3-11 脚本参数化示例然后,生成的Vuser使用指定的数据源中的值来替换参数。该数据源可以是一个文件或者内部生成的变量。参数化包含以下两项任务:(1)在脚本中用参数取代常量值。(2)设置参数的属性以及数据源。注意:参数化只可以用于一个函数中的参量,但不能用参数表示非函数参数的字符串。另外,并不是所有的函数都可以参数化的,例如关联函数就不能参数化。关于函数,在以后的章节还要进行详细的介绍。3.2.2 创建参数创建参数有两种方式。1在脚本视图中创建。选择一个字符串并单击鼠标右键,在菜单中选择Replace with a parameter(替换为新参数),如图3-12所示。2在树视图中创建。选择要参数化的步骤,并从右键菜单中选择Properties(属性),如图3-13所示。图3-12 选择Replace with a parameter选项图3-13 选择Properties将打开相应的Submit Data Step Properties(提交数据步骤的属性)对话框,如图3-14所示。图3-14 Submit Data Step Properties对话框单击要参数化的参数旁边的ABC图标,打开Select or Create Parameter(选择或创建参数)对话框。在Parameter name框中输入参数的名称,或从列表中选择一个现有的参数名。从Parameter type列表中选择一个参数类型。可用的类型有:日期/时间、文件、组名、迭代编号、负载生成器名、随机编号、唯一编号、用户定义的函数或Vuser ID等。3.2.3 参数类型属性当选择好参数类型以后,对其属性进行设置,在图3-15的对话框中单击Properties,将根据不同的参数类型出现不同的对话框,下面将一一介绍。图3-15 Select or Create Parameter对话框1Date/Time(日期/时间)参数类型:其属性对话框如图3-16所示。Date/Time类型用当前的日期和/或时间替换参数。要指定日期/时间的格式,可以从菜单列表中选择,或者指定实际需要的格式。该格式应该与脚本中录制的日期/时间格式相对应。还可以单击该对话框中相应的按钮对格式进行添加、删除、还原等操作。图3-16 日期/时间类型表3-1对于日期/时间格式中出现的符号做了简要说明。表3-1 日期/时间格式中的符号符 号描 述c用数字表示完整的日期和时间#c完整的日期(以字符串表示)和时间H小时(24小时制)I小时(12小时制)M分钟S秒PAM或PMd日期m数字形式的月份(01-12)b字符串形式的月份,短格式(例如:Dec)B字符串形式的月份,长格式(例如:December)y短格式年份(例如:03)Y长格式年份(例如:2003)在Update Value on文本框中可选择一种更新参数值的频率,指示Vuser何时更新参数值。有以下几个选项:Each Occurrence:在运行时,每遇到一次该参数,便会取一个新的值,该方法指示Vuser在每次参数出现时使用新值。当使用同一个参数的几个语句不相关时,该方法非常有用。例如,对于随机数据,在该参数每次出现时都使用新值可能是非常有用的。Each Iteration:运行时,在每一次循环中都取相同的值。该方法指示Vuser为每次脚本迭代使用新值。如果一个参数在脚本中出现了若干次,则Vuser为整个迭代中所有出现的该参数使用同一个值。当使用同一个参数的几个语句相关时,该方法非常有用。Once:运行时,在每次循环中,该参数只取一次值。该方法指示Vuser在方案运行期间仅对参数值更新一次。Vuser为所有出现的该参数和所有迭代使用同一个参数值。当使用日期和时间时,该类型可能会非常有用。注:后面的介绍中也有此选项,为了避免出现重复叙述,在此详细说明,后面遇此选项将一笔带过。2Group Name(组名)参数类型:用Vuser组的名称替换参数,如图3-17所示。创建方案时,要指定Vuser组的名称,否则运行VuGen的脚本时,组名始终为无。从可用格式中选择其中一种或者新建一种格式,来指定参数字符串的长度。3Iteration Number(迭代编号)参数类型:用当前的迭代编号替换参数,如图3-18所示。图3-17 组名类型图3-18 迭代编号类型从可用格式中选择其中一种或者新建一种格式,来指定参数字符串的长度。4Load Generator Name(负载生成器名)参数类型:用Vuser脚本的负载生成器名替换参数,如图3-19所示。负载生成器是运行Vuser的计算机。从可用格式中选择其中一种或者新建一种格式,来指定参数字符串的长度。5Random Number(随机编号)参数类型:用一个随机生成的整数替换参数,可以通过指定最小和最大值,设置随机编号的范围,如图3-20所示。在Sample value框中,可以查看VuGen如何显示该值的示例。选择Number format,指明唯一编号的长度。例如:指定%01lu表示一位数,%02lu表示两位数,依此类推。在Update Value on下拉框中可选择一种更新参数值的频率,指示Vuser何时更新参数值。随机编号参数类型用于在一个可能的值域内对系统的行为进行抽样。例如,要对50名员工(员工的ID编号范围从1到1000)进行查询,创建50个Vuser并设置其最小值为1,最大值为1000。每个Vuser都接收到一个11000的随机编号。图3-19 负载生成器名类型图3-20 随机编号类型6Unique Number(唯一编号)参数类型:用一个唯一编号替换参数,如图3-21所示。图3-21 Unique Number类型在图3-21所示界面中Block size(块大小)指明分配给每个Vuser的编号块的大小。每个Vuser都从其范围的下限(start)开始,在每次迭代时递增该参数值。例如,如果设置起始编号为1并且块大小为500,则在其第一次迭代中,第一个Vuser使用值1,下一个Vuser使用值501。例如,如果限制编号为5位数并使用大小为500的块,则只有100 000个数(099 999)是可用的。因此,只能运行200个Vuser,并且每个Vuser运行500次迭代。在Sample value框中,可以查看VuGen如何显示该值的示例。选择Number format,指明唯一编号的长度。指定%01d表示一位数,%01d表示两位数等。在Update Value on下拉框中可选择一种更新参数值的频率,指示Vuser何时更新参数值。Unique Number类型在执行时由于设置编号块过小,可能会出现超出范围的情况,为了解决这个问题,在Unique Number的设置界面中有对此情况进行超出范围的相应处理,即When out of values(超出范围)选项,如果超出范围所执行的操作有以下三种:Abort Vuser(中断 Vuser):停止循环,重新设置编号块大小,再次重新执行;Continue in a cyclic manner(以循环方式继续):执行不停止,按照事先设置的编号的循环方式再次执行一次;Continue with last value(使用最后的值继续):选取最后一个值继续执行下去,即后面的编号相同并使用的都是同一个值。7Vuser ID参数类型:用分配给该Vuser的ID来替换参数,如图3-22所示,此ID是方案运行期间控制台分配给Vuser的。图3-22 Vuser ID类型从可用格式中选择其中一种或者新建一种格式,来指定参数字符串的长度和结构。注意,该ID并不是在Vuser窗口中显示的ID,而是在运行时生成的唯一的ID编号。3.2.4 导入数据方法LoadRunner允许使用Microsoft Query或者指定数据库连接字符串与SQL语句,利用参数化从已经存在的数据库中导入数据。用户脚本生成器在从数据库导入数据的过程中提供了一个向导。在此向导中,可以指明如何导入数据-通过MS Query创建查询语句或者直接书写SQL语句。在导入数据以后,以.dat为后缀并作为正规的参数文件保存。在向导中单击Data Wizard按钮,从数据表中选择用户名后,使用Specify SQL statement manually(手工指定数据库连接字符串)方法连接数据库,如图3-23所示。单击下一步按钮,出现图3-24所示的对话框。填入连接字符串和SQL语句后,单击Finish按钮,出现查询结果。图3-23 指定数据库连接方法 图3-24 指定SQL语句3.2.5 数据文件存储 数据文件能保存脚本执行期间Vuser访问的数据,这些数据可以被存储在本地或全局文件中。如果拥有大量已知参数值,数据文件是非常有用的。数据文件中的数据以表格的形式存储。一个文件可以包含大量参数值,每一列都保存一个参数的数据。列的分隔由分隔符标记,例如逗号、-或者Tab符号等。如果使用文件作为参数的数据源,必须指定文件的名称和位置、包含数据的列、文件格式,包括列的分隔符、更新方法等内容。在下例中,就是使用文件作为参数的数据源,其数据文件包含了每个数据的ID编号及其相对应的名称,如图3-25所示。图3-25 数据文件存储设置在File path框中输入数据文件的名称,或者单击Browse(浏览)按钮指定现有数据文件的文件位置。默认情况下,所有新数据文件均被命名为parameter_name.dat并且存储在脚本的目录中。单击Edit with Notepad按钮,将打开记事本,在记事本文档中编辑此数据,其中第一行是参数名,第二行是参数的初始值。用表格的形式将其他列名和值输入到该文件中。使用分隔符(例如逗号或者制表符)来指示列分隔。对表格中的每个新行都要另起一行开始。Select next row下拉列表框有以下几个选项:1Sequential:按照顺序一行行地读取。每一个Vuser都会按照相同的顺序读取文件中的参数值,选择Sequential方法系统会按照顺序向Vuser分配参数值。当正在运行的Vuser访问数据表格时,Vuser会提取下一个可用的数据行。如果在Update Value on(更新值的时间)列表框中指定了Each iteration(每次迭代),则Vuser将为每一次迭代从数据表格中提取下一个值。如果在Update value on列表框中指定了Each occurrence(每次出现),则Vuser将为每一次参数的出现从数据表格中提取下一个值,即使它在同一次迭代中。如果在Update Value on列表框中指定了Once(一次),则第一次迭代中分配的值就会在每个Vuser接下来所有的迭代中使用。例如表3-2列出了数据文件的参数值。表3-2 数据表格名KimDavidMichaelJaneRonAliceKenJulie如果选择了Each iteration,则所有Vuser就会在第一次迭代中使用Kim,第二次迭代中使用David,第三次迭代中使用Michael,依此类推。如果选择了Each occurrence,则所有Vuser就会在第一次出现时使用Kim,第二次出现时使用David,第三次出现时使用Michael,依此类推。如果选择了Once,则第一个Vuser为所有的迭代提取Kim,第二个Vuser为所有的迭代提取David,依此类推。如果在数据表格中没有足够的值,则VuGen返回到表格中的第一个值,循环继续直到测试结束。2Random:在每次循环里随机地读取一个数据,但是在循环中一直保持不变。当测试开始运行时,随机方法为每个Vuser分配一个数据表格中的随机值。如果在Update Value on列表框中指定了Each iteration,则Vuser将会为每一次迭代从数据表格中提取一个新的随机值。如果在Update Value on列表框中指定了Each occurrence,则Vuser将会为每一次参数的出现从数据表格中提取一个新的随机值,即使它在同一次迭代中。如果在Update Value on列表框中指定了Once,则第一次迭代中分配的随机值就会在该Vuser的所有迭代中使用。当从LoadRunner控制台运行一个方案时,您可以指定随机顺序的种子数。每个种子值代表用于测试执行的一个随机值顺序。每当使用该种子值时,都会将相同顺序的值分配给方案中的Vuser。如果在测试执行中发现问题,并且要使用相同的随机值顺序重复该测试,请启用Random选项。3Unique:该方法为每一个Vuser的参数分配一个唯一的顺序值。如果在Update Value on列表框中指定了Each iteration,则Vuser将为每一次迭代从数据表格中提取下一个唯一值。如果在Update Value on列表框中指定了Each occurrence,则Vuser将会为每一次参数的出现从数据表格中提取一个新的唯一值,即使它在同一次迭代中。如果在Update Value on列表框中指定了Once,则第一次迭代中分配的唯一值就会在每个Vuser的所有接下来的迭代中使用。请确保表格中的数据对所有的Vuser和它们的迭代来说是充足的。如果拥有20个Vuser,并且要运行5次迭代,则表格中必须至少包含有100个唯一值。如果数据表格中没有足够的值,可以在When out of value下拉框中指示VuGen如何继续运行:中断Vuser、以循环方式继续或者使用最后的值继续。如果选择使用最后的值继续运行,则Vuser将会为所有接下来的迭代使用表格中最后一行的数据。如果想要给每一个Vuser都分配值,并且不想让那些值在Vuser之间共享,要实现该目标,可以在图3-25中的Allocate Vuser values in the controller(在控制台中分配Vuser值)组合框中指示VuGen为每个Vuser的值分配一个特定的编号。默认情况下,VuGen自动为Vuser的值分配必需的编号。要跟踪上述说的分配编号情况,请启用日志运行时设置中的扩展日志参数替换选项。当没有足够的数据时,VuGen将会向Vuser日志中写入警告消息:在表中,此参数没有其他唯一值。注意:使用该类型必须注意数据表有足够多的数。比如,控制台中设定20个Vuser进行5次循环,那么编号为1的Vuser取前5个数,编号为2的Vuser取610的数,依此类推,这样数据表中至少要有100个数据,否则控制台运行过程中会返回一个错误。3.3.1 关联的意义3.3 语句关联当录制脚本时,VuGen会拦截客户端(浏览器)与服务器端(网站服务器)之间的会话,并且记录下来,产生脚本。在VuGen的Recording Log中,可以找到浏览器与服务器之间所有的对话,包含通信内容、日期、时间、浏览器的请求、服务器的响应内容等等。脚本和Recording Log最大的差别在于,脚本只记录了客户端要对服务器端所说的话,而Recording Log则是完整记录二者的对话。当执行脚本时,可以把VuGen想象成是一个演员,它伪装成浏览器,然后根据脚本,把当初浏览器确实说过的话,再对网站服务器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。所以VuGen记录在脚本中的要跟服务器所说的话,完全与当初录制脚本时所说的一样,是写死的(hard-coded)。这样的做法在遇到有些比较聪明的服务器时,还是会失效。这时就需要通过关联来让VuGen再次成功地骗过服务器。3.3.1 关联的意义所谓的关联就是把脚本中某些写死的代码(hard-coded)数据,转变成撷取自服务器所送的、动态的、每次都不一样的数据。一般情况下,比较聪明的服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器,一般称这个辨识码为Session ID。对于每个新的请求,服务器都会产生新的Session ID给浏览器。这也就是执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器发现这个Session ID是失效的或者它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了。下面的例子说明了这样的情形:当录制脚本时,浏览器发出对网页A的请求,服务器将网页A的内容传送给浏览器,并且夹带了一个ID=123的数据,当浏览器再发出对网页B的请求时,这时就要用到ID=456的数据,服务器才会认为这是合法的请求,并且把网页B的内容送回给浏览器。在执行脚本时会发生什么状况呢?浏览器再发出对网页B的请求时,用的还是当初录制的ID=123的数据,而不是用服务器新给的ID=456,因此整个脚本的执行就会失败。要对付这种服务器,必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代脚本中有用到Session ID的部分,这样就可以成功骗过服务器,正确地完成整个交易了。 1什么地方需要关联凡是脚本每次执行时都必须获得唯一标识的地方都需要关联。假如脚本需要关联,如果不做关联是不会执行通过的,也就是说会有错误消息发生。不过很遗憾,并没有任何特定的错误消息是和关联有关系的。会出现什么错误消息,与系统实际的错误处理机制有关。错误消息有可能会提醒用户要重新登录,但是也有可能直接就显示HTTP 404的错误消息。 2如何做关联关联会用到下列的函数: web_reg_save_param;web_create_html_param;web_create_html_param_ex;其中,web_reg_save_param的语法为:web_reg_save_param ( Parameter Name , , LAST ); web_create_html_param和web_create_html_param_ex这两个函数主要是保留以兼容以前旧版本。建议使用web_reg_save_param函数。那么,如何找出要关联数据呢?简单地说,每一次执行时都会变动的值,就有可能需要做关联。VuGen提供两种方式帮助用户找出需要做关联的值:自动关联和手动关联。3.3.2 自动关联方法VuGen内建自动关联引擎(Auto-correlation Engine),提供Rules Correlation和Correlation Studio两种机制,可以自动找出需要关联的值,并且自动使用关联函数建立关联。1Rules Correlation:在录制过程中VuGen会根据使用者事先制订的规则,实时自动找出要关联的值。规则的来源有内建(Built-in Correlation)和使用者自定(User-defined Rules Correlation)关联规则两种。内建(Built-in Correlation):VuGen已经针对常用的一些应用系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,内建了一些关联规则。这些应用系统可能会有一种以上的关联规则。可以在Recording OptionsInternet ProtocolCorrelation中启用关联规则,启用关联后,当录制这些应用系统的脚本时,VuGen会在脚本中自动建立关联。也可以在Recording OptionsInternet ProtocolCorrelation检视每个关联规则的定义。除了内建的关联规则之外,使用者也可以自定关联规则。可以在Recording OptionsInternet ProtocolCorrelation建立新的关联规则。请依照以下步骤使用Rule Correlation:单击VuGen的ToolsRecording Options,开启Recording Options对话窗口,选取Internet ProtocolCorrelation,勾选Enable correlation during recording,以启用自动关联。假如录制的应用系统属于内建关联规则的系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,请勾选相对应的应用系统。或者也可针对录制的应用系统加入新的关联规则,此即为使用者自定的关联规则。自动关联时VuGen会侦测到符合关联规则的数据,以下为处理方式:首先会跳出一个Correlation warning消息对话窗口,选择Issue a pop-up message and let me decide online:询问用户是否要建立关联,每遇到一次询问一次,以了解每个关联数据的内容和位置。如果每次询问很麻烦,可以选择Perform correlation in script(直接自动建立关联)。2Correlation Studio:有别于Rules Correlation,Correlation Studio是在执行脚本后才会建立关联,也就是说当录制完脚本后,脚本至少须被执行过一次时Correlation Studio才会起作用。Correlation Studio会尝试找出录制时与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。当录制的应用系统不属于VuGen预设支持的应用系统时,Rule Correlation可能无法发挥作用,这时可以利用Correlation Studio来进行关联。使用Correlation Studio的步骤如下:(1)录制脚本并执行。(2)执行完毕后,VuGen会跳出Scan Action for Correlation窗口,询问用户是否要扫描脚本并建立关联,单击Yes按钮,扫描脚本。(3)扫描完后,可以在脚本下方的Correlation Results中看到扫描的结果。(4)检查一下扫描的结果,选择要做关联的数据,然后单击Correlate按钮,逐次关联,或是单击Correlate All让VuGen一次就对所有的数据建立关联。注意:由于Correlation Studio会找出所有有变动的数据,但是并不是所有的数据都需要做关联,所以不建议用户直接用Correlate All。重复步骤(1)(4),直到所有需要做关联的数据都找出来为止。注意:有时关联的地方有多处,前面的关联如果没有执行通过,执行将停止验证脚本的正确性,后面需要做关联的部分无法被扫描出来。3.3.3 手动关联方法在对脚本进行关联的时候,有的脚本利用上面介绍的方法自动关联就可以了,但是也有可能某些需要做关联的动态数据,连Correlation Studio都无法侦测出来,这时就需要进行手动关联。虽然手动关联比自动关联方法麻烦一些,操作复杂,对于没有代码编程经验的测试初学者来说,甚至有时连需要关联的位置都无法找到,但是经过多次实践后,会发现很多关联的方法与技巧。毕竟手动关联出来的脚本拥有更大的灵活性,可以随意改动来满足用户不同的需求。手动关联的执行过程大致如下:使用相同的业务流程与数据,录制两份脚本。使用WinDiff工具协助找出需要关联的数据。使用web_reg_save_param函数手动建立关联。将脚本中有用到关联的数据,以参数取代。具体的执行过程如下:1使用相同的业务流程与数据,录制两份脚本。先录制一份脚本并存档,再依照相同的操作步骤与数据录制第二份脚本并保存。注意:所有的步骤和输入的数据一定都要一样,这样才能找出由服务器端产生的动态数据。在录制第二份脚本时有时候无法使用相同的输入数据,但也要记住第一份脚本所使用的输入数据,到时对两个脚本进行比较时才能判断出这是所要输入的数据,还是变动的数据。2使用WinDiff工具协助找出需要关联的数据。(1)在第二份脚本中,单击VuGen的ToolsCompare with Vuser,并选择第一份脚本。(2)接着WinDiff会开启,同时显示两份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字(假如没看到红色字体,请单击OptionsViewShow Inline Differences)。(3)逐一检视两份脚本中差异的部分,每一处差异都可能是需要做关联的地方。选取差异的脚本,然后复制。在复制时,有时并不需要取整行脚本,可能只会选取脚本中的一部分。注意:请忽略lr_thik_time的差异部分,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间的。(4)接着要在Recording Log(单一协议)或是Generation Log(多重协议)中找这个值。将鼠标光标放到Recording Log的第一行开头,按下Ctrl+F组合键,开启Find窗口,贴上刚刚复制的脚本,找出其在Recording Log第一次出现的位置。如果在Recording Log中找不到要找的数据,这时请先确认是否找对了脚本,毕竟现在开启了两个几乎一样的脚本,很容易弄错。如果在Recording Log中找到了要找的数据,这时要确认数据是否为从服务器端传送过来的。首先可以检查数据的标头,从标头的Receiving response可以知道数据是否是从服务器端传送到客户端的。假如此数据第一次出现是在Sending request中,则表示此数据是由客户端产生,不需要做关联,但是有可能需要做参数化(Parameterized)。现在已经找到录制两次不一致而且是由服务器所产生的动态数据,此数据极有可能需要做关联。3使用web_reg_save_param函数手动建立关联。在找到由服务器所产生的动态数据之后,接下来要做的就是找出适当的位置,使用web_reg_save_param函数,将这个动态数据撷取到某个参数中。(1)web_reg_save_param函数对于关联来说,web_reg_save_param是最重要的一个函数,其功能是在下载的网页内容中,通过设定的边界字符串,找出特定的数据并将其存储在一个参数中,以供后续脚本使用。web_reg_save_param是一个服务端函数(Service function,主要用来完成一些特殊的工作,如关联、设定proxy、提供认证信息等),当其作用时,不会对网页的内容做任何的修改。web_reg_save_param同时也是一个注册类型的函数(Registration Type Function,只要函数名称中包含_reg_的字眼,表示其为注册类型的函数)。注册类型的函数意味着其真正作用的时机是在下一个动作函数(Action Function)完成时。举例来说,当某个web_url执行时所接收到的网页内容中包含了要做关联的动态数据,则必须将web_reg_save_param放在此web_url之前,web_reg_save_param会在web_url执行完毕后,也就是网页内容都下载完后,再执行web_reg_save_param,寻找要做关联的动态数据并建立参数。要记住一点,当使用注册类型的函数时,要注意其放置的位置必须在要作用的动作函数之前。(2)web_reg_save_param的语法int web_reg_save_param(const char *ParamName, , LAST); ParamName:存放动态数据的参数名称。list of Attributes:其他属性,包含 Notfound、LB、RB、RelFrameID、Search、ORD、SaveOffset、Convert以及SaveLen。下面将详细说明每个属性值的意义。Notfound:指定当找不到要找的动态数据时该怎么处理。当指定Notfound=error时,表示着找不到动态数据时,就发出一个错误消息。此为该属性的默认值。当指定Notfound=warning时,表示当找不到动态数据时,不发出错误消息,只发出警告,脚本也会继续执行下去不会中断。在对脚本出错时,可以如此设置。LB:动态数据的左边界字符串。此属性是必须要有的,而且区分大小写。RB:动态数据的右边界字符串。此属性是必须要有的,而且区分大小写。RelFrameID:相对于URL而言,欲搜寻的网页的Frame。此属性可以是All或是数字,而且可有可无。Search:搜寻的范围,其值可以是Headers(只搜寻headers)、Body(只搜寻body部分,不搜寻header)、Noresource(只搜寻body部分,不搜寻header与resource)或是All(搜寻全部范围,此为默认值),此属性可有可无。ORD:指明从第几次出现的左边界开始才是要撷取的数据,默认值是1。假如该属性值为All,则所有找到符合的数据会存储在数组中。此属性可有可无。SaveOffset:当找到符合的动态数据时,从第几个字符开始才开始存储到参数中。此属性值不可为负数,其默认值为0。Convert:转换数据格式。当指定该属性值为HTML_TO_URL时,意味着将HTML-encoded数据转成URL-encoded数据格式。如果是HTML_TO_TEXT,表示将HTML-encoded数据转成纯文字数据格式。SaveLen:当找到匹配项后,偏移量之后的几个字元存储到参数中。此参数可有可无,默认值是-1,表示一直到结尾的整个字符串都存入参数中。(3)确定使用web_reg_save_param函数的位置之前的步骤已经在Execution Log中找到可能需要关联的动态数据。在Execution Log中选取动态数据前的文字,然后复制,利用这段文字,找出要关联的动态数据。不过在这之前,需要先找出使用web_reg_save_param函数的正确位置,所以要再重新执行一遍脚本,而且这次会开启所有的Log。在VuGen中单击VuserRun-Time Settings。单击GeneralLog,勾选Enable logging、Always sends messages、Extended log以及Extended log下的所有选项。然后,单击OK按钮就可以执行脚本了。执行完脚本之后,在Execution Log中搜寻刚刚复制的字符串。找到字符串后,在字符串前面会有A.tion1.c(7),这个7就是到时候要插入web_reg_save_param函数的位置,也就是说要插入到脚本的第7行。在脚本的第7行前插入一行空白行,然后输入:web_reg_save_param(UserSession, 这个UserSession就是到时要使用的参数名称,建议取一个有意义的名字。注意:到目前为止,整个web_reg_save_param函数还没完成。(4)确定web_reg_save_param中的边界。web_reg_save_param函数主要是通过动态数据前后的固定字符串,来辨识要撷取的动态数据的,所以还需要找出动态数据的边界字符串。1)确定左边界字符串再回到Execution Log中,选取动态数据前的字符串并且复制它。这时会有个问题,到底要选取多少字符串才足以唯一识别要找的动态数据呢?建议是越多越好,但是尽量不要包含特殊字符。选取input type=hidden name=userSession value=字符串,之后再确认一次这段字符串真的是可以唯一识别的,所以在Execution Log中通过Ctrl+F搜寻,查看这段字符串是不是要找的动态数据。假如找不到,web_reg_save_param函数还有个ORD参数可以使用,ORD参数可以设定出现在第几次的字符串才是要找的字符串。将这个边界字符串加到未完成的web_reg_save_param函数中:web_reg_save_param(UserSession, LB= input type=hidden name= userSession value=, 2)确定右边界字符串接下来要找出动态数据的右边界字符串,这个字符串就比较好找了,从动态数据的最后一个字符开始,通常就是要找的右边界字符串。以这个例子来看,就是,所以再把右边界字符串加入web_reg_save_param函数中,最后再加上LAST);就完成整个web_reg_save_param函数:web_reg_save_param(UserSession, LB= input type=hidden name= userSession value=, RB=, LAST); 当使用web_reg_save_param建立参数后,接下来就是用UserSession参数去取代脚本中写死的(hard-coded)资料。即将Name=userSess

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论