miDBErrorSeverity); LoadRunner只支持mpctext参数化: lrd_stmt(Csr4, \name from sysobjects where name =\\\
那么,对于不能使用上面机制参数化的数据,我们有没有其他办法将其参数化呢?答案是lr_eval_string,我们可以在Vuser脚本中的任何地方使用lr_eval_string来参数化数据。lr_eval_string用来得到一个参数的值,而参数可以预先在LoadRunner的Parameter List里定义好,也可以是之前通过其他函数创建的。下面是一个小例子: //通过lr_save_datetime把七天后的时间保存在date参数中lr_save_datetime(\%m %y\DATE_NOW + (ONE_DAY*7), \
//通过lr_eval_string把date参数中的值取出来,lr_output_message的输出值为七天后的时间
lr_output_message(\ 其详细使用方法可参见LoadRunner函数手册。这里需要注意的是:lr_eval_string函数的返回值是一个指向参数值的指针,这个指针指向的内存是LoadRunner内部分配的,每次Iteration后自动释放。如果在Iteration中还有多层循环进行参数化,那么最好不要使用lr_eval_string了,这会导致内存迟迟不能释放。在这种情况下,应该使用lr_eval_string_ext,同时配对使用lr_eval_string_ext_free来
及时释放内存。
5.7.3 定义参数的属性
创建参数完成后,就可以定义其属性了。参数的属性定义就是在脚本执行过程中,定义参数使用的数据源。在Web用户脚本中,既可以在基于文本的脚本视图中定义参数属性,也可以在基于图标的树视图中定义参数属性。 1.使用参数列表
使用参数列表可以在任意时刻查看所有的参数、创建新的参数、删除参数,或者修改已经存在参数的属性。
单击参数列表按钮或者选择“Vuser”>“Parameter List”,打开参数列表对话框,如图5-36所示。
要创建新的参数,单击“New”按钮,新的参数则被添加在参数树中,该参数有一个临时的名字,你可以给它重新命名,然后回车。设置参数的类型和属性,单击“OK”按钮,关闭参数列表对话框。
注意:不要将一个参数命名为“unique”,因为这个名称是用户脚本生成器本身的。用户脚本生成器创建新的参数,但是不会自动用该参数在脚本中替换任意选中的字符串。
图5-36 VU参数列表对话框
要删除已有的参数,首先要从参数树中选择该参数,单击“Delete”按钮,然后确认你的行为即可。
要修改已有的参数,首先要从参数树中选择该参数,然后编辑参数的类型和属性。 2.数据文件
数据文件包含着脚本执行过程中虚拟用户访问的数据。局部和全局文件中都可以存储数据。可以指定现有的ASCII文件、用脚本生成器创建一个新的文件或者引入一个数据库。数据文件中的数据是以表的形式存储的。一个文件中可以包含很多参数值。每一列包含一个参数的数据,列之间用分隔符隔开,比如用逗号。
如果使用文件作为参数的数据源,必须指定以下内容:文件的名称和位置、包含数据的列、文件格式、包括列的分隔符、更新方法。
如果参数的类型是“File”,打开参数属性(Parameter Properties)对话框,设置文件属性如下: 在“File path”中输入文件的位置,或者单击“Browse”按钮指定一个已有文件的位置,如图5-37所示。在默认情况下,所有新的数据文件名都“parameter_name.dat”,注意,已有的数据文件的后缀必须是.dat。
图5-37 选择打开文件来导入参数
单击“Edit With Notepad”按钮,打开记事本,里面第一行是参数的名称,第二行是参数的初始值。使用诸如逗号之类的分隔符将列隔开。对于每一个新的表行开始一行新的数据。 注意:在没有启动记事本的情况下如果想添加列,就在参数属性对话框中单击“Add Column”按钮,打开“Add new column”对话框。输入新列的名称,单击“OK”按钮,脚本生成器就会将该列添加到表中,并显示该列的初始值。
在“Select column”部分,指明选择参数数据的列。可以指定列名或者列号。列号是包含你所需要数据的列的索引;列名显示在每列的第一行(row 0)。
图5-38 以记事本方式打开参数
在“Column delimiter”中输入列分隔符,可以指定逗号、空格符等。
在“First data line”中,在脚本执行的时候选择第一行数据使用。列标题是第0行,若从列标题后面的第一行开始的话,那么就在“First data line”中输入1;如果没有列标题,就输入0。
在“Select next row”中输入更新方法,以说明虚拟用户在获取第一行数据后,下一行数据按照什么规则来取。方法可以是:顺序的(Sequential)、随机的(Random)、唯一的(Unique),或者与其他参数表相同的行(Same Line as..)。下面我们一一介绍。 (1)顺序(Sequential):该方法顺序地给虚拟用户分配参数值。如果正在运行的虚拟用户访问数据表的时候,它会取到下一行中可用的数据。也就是说,按着顺序一个个取,取了第一行再取第二行,取了第二行再取第三行,依此类推。如果参数表里的数据都取一遍了,不要紧,那就再回到第一行,重新开始。 (2)随机(Random):该方法在每次迭代的时候会从数据表中随机取一行的数据。比如当前参数表中有100行数据,那么随机数就从1~100之间任取一个,然后作为行号,去取相应行的参数值数据。 (3)唯一(Unique):Unique方法分配一个唯一的有顺序的值给每个虚拟用户的参数。也就是100行数据,只能取100次,如果第101个用户来取,怎么办?对不起,没有数据了,LoadRunner会报错,提示数据不够用。
(4)与以前定义的参数取同一行(Same Line As
ID Name Title 132 Kim Manager 187 Cassie Engineer 189 Jane VP 对于参数id1,你可以指示虚拟用户使用Random方法,而为参数name1和title1就可以指定方法“Same Line as id1”。所以,一旦ID“132”被使用,那么,姓名(Name)“Kim”和职位(Title)“Manager”就同时被使用。 Updtae value on,数据的更新方法。
我们做事主要考虑3个因素:什么时候做,什么地点做,还有怎样做。对应参数表的读取规则来说,上面的Select next row指的是怎么取新值,是顺序还是随机等。而这里Update value on指的是什么时候取新值。 注意:LoadRunner并不是每次取值都是要取新值的。所以就有了以下几种取新值的策略: Each? iteration——每次迭代就要取新值(在同一个迭代中,无论读几次参数,获得的都是同一个参数值)。 Each? occurrence——只要取一次,就要新的(在同一个迭代中,读一次参数,就要取其新值,而新值是从哪里来的,由Select next row来规定)。 Once——在所有的循环中都使用同一个值(只取一次,也就是说,这个参数只有一个值)。? When out of values,超出范围:(选择数据为Unique时才可用到) Abort Vuser——中止。? Continue in a cyclic? manner——继续循环取值。 Continue with last value——取最后一个值。? Allocate Vuser values in the Controller在控制器中分配值:(选择数据为unique时才可用到) Automatically allocate? block size——自动分配。 Allocate()values for each? Vuser——指定一个值。 实例
场景需求:100个不同的用户以各自的密码并发登录某搜索引擎系统,然后每个用户做10个不同关键字的搜索,最后退出搜索系统。问参数表该如何设计? 解析
很显然,在此场景下,我们至少需要3个参数:username、password和keyword,分别存储用户名、密码和关键词。其中username参数包含100条记录,password参数包含100条记录,keyword参数包含100*10=1000条记录。
对于脚本结构设计,我们从前面章节介绍的内容中已经知道,可以把登录的操作放在vuser_init中,搜索操作放在Action中,迭代设为10次,退出操作放在vuser_end中。 我们在参数表中做如下设置。 username: Select next row设为Unique(或Sequential);? Update value? on设为Each iteration。 password: Select next row设为Same Line as? username(为了保证username和password一一对应); Update value? on设置自动与username相同。 keyword: Select next? row设为Unique(或Sequential); Update value on设为Each? iteration。 思考
如果我们更改上面的脚本结构设计,取消迭代,而把10次搜索操作放在同一个Action中。
参数表的解决方案是:
username和password与第一种情形保持不变。 keyword: Select? next row设为Unique(或Sequential); Update value on设为Each? occurrence。 思考一下这样修改的原因何在。
5.7.4 高级——从已存在的数据库中导入参数数据
LoadRunner
允许你利用参数化从已经存在的数据库中导入数据。可以使用下列
两种方式之一:
(1)使用Microsoft Query(要求在系统上先安装MS Query)。 (2)指定数据库连接字符串和SQL语句。
用户脚本生成器在从数据库中导入数据的过程中提供了一个向导。在向导中,指明如何导入数据——通过MS Query创建查询语句或者直接书写SQL语句。在导入数据以后,以.dat为后缀并作为正规的参数文件保存。要开始导入数据库中数据的过程,在参数属性对话框中单击“Data Wizard”按钮,则打开数据库查询向导。 1.创建新的查询
(1) 选择“Create query using Microsoft Query”。如果需要MS Query的帮助,选择“Show me how to use Microsoft Query”,然后单击“Finish”按钮,如图5-39所示。
图5-39 在Data Wizard中选择通过Microsoft Query创建查询
如果你还没有安装Microsoft Query,LoadRunner会提示你这个功能不可用。在进行操作之前,从Microsoft Office中安装MS Query。 (2) 在Microsoft Query中导入期望的表和列。 ● 选择表和字段(见图5-40)