5.7 数据驱动——参数化(Parameters)
数据驱动就是把测试脚本和测试数据分离开来的一种思想,脚本体现测试流程,数据体现测试案例。数据不是hard-code在脚本里面,这样大大提高了脚本的可复用性。而LoadRunner的参数化功能是数据驱动测试思想的一个重要实现。
在本节中,我们要学习的是:理解参数的局限性,建立参数,定义参数的属性,理解参数的类型,为局部数据类型设置参数的属性,为数据文件设置参数的属性,从已经存在的数据库中引入数据。
5.7.1 为什么需要参数化
在录制程序运行的过程中,Vugen(脚本生成器)自动生成了脚本以及录制过程中实际用到的数据。在这个时候,脚本和数据是混在一起的。
比如,你用VU的Web Vuser录制一个用户登录Web系统的过程,对于登录的操作,会生成以下脚本:
web_submit_form("auth", "Snapshot=t2.inf", ITEMDATA, "Name=ssousername", "Value=robin", ENDITEM, "Name=password", "Value=123456", ENDITEM, "Name=remember", "Value=<OFF>", ENDITEM, LAST); |
web_submit_form是登录触发的动作,而“robin”和“123456”是填入的数据。如果Controller里以多用户方式运行这个脚本的时候,每个虚拟用户都会以同样的用户名“robin”、密码“123456”去登录Web系统。这样做性能测试,我们的客户可能不会答应,因为这显然不是一个真实的业务场景。尤其现在服务器大多会采用Cache功能提高系统性能,用同样的用户名/密码登录系统的Cache命中率会很高,也要快得多。
因此,我们的客户希望当用LoadRunner多用户多循环运行时,不会只是重复一个用户的登录,也就是说,此函数中的数据要能变化,这样的话,就把这些数据用一个参数来代替,其实就是把常量变成变量。参数化后的脚本如下:
web_submit_form("auth", "Snapshot=t2.inf", ITEMDATA, "Name=ssousername", "Value={username}", ENDITEM, "Name=password", "Value={passwd}", ENDITEM, "Name=remember", "Value=<OFF>", ENDITEM, LAST); |
参数化后,用户名“robin”被一个参数{username}替换,密码“123456”被另外一个参数{passwd}代替。{username}和{passwd}分别和参数文件关联,在脚本运行时,用户名和密码的值从参数{username}和{passwd}中获得。而我们会在后面介绍LoadRunner有一套机制来保证参数的使用和变化,这样就实现了脚本与数据的分离。
参数化是我们学习LoadRunner中经常用到的功能。除了实现数据驱动之外,参数化脚本还有以下两个优点:
(1)可以使脚本的长度变短。
(2)可以增强脚本的可读性和可维护性。
实际上,参数化的过程如下:
(1)在脚本中用参数取代常量值。
(2)设置参数的属性以及数据源。
这些我们会在下面内容中详细介绍。
5.7.2 参数的创建
LoadRunner对脚本中参数个数没有限制,我们可以在一个脚本中创建任意多个参数。
下面以Web Vuser为例,看看LoadRunner是如何创建参数的。我们已经知道,VU可以通过Tree View和Script View两种途径来改变脚本,包括参数化功能。我们这里分别介绍。
还是上面那个登录脚本,我们可以在基于文本的脚本视图中参数化。
1.脚本视图参数化
将光标定位在要参数化的字符上,单击右键,弹出快捷菜单,如图5-26所示。
图5-26 脚本参数化之右键选择替代参数
在弹出菜单中,选择“Replace with a Parameter”,打开选择或者创建参数对话框,如图5-27所示。
在“Parameter name”中输入参数的名称,或者选择一个在参数列表中已经存在的参数。
在“Parameter type”下拉列表中选择参数类型,如图5-28所示。
图5-27 脚本参数化之设定参数名字 图5-28 脚本参数化之设定参数类型
下面重点介绍一下参数的类型。
在定义参数属性的时候,要指定参数值的数据源。你可以指定下列数据源类型中的任何一种:
(1)Data Files
这是我们最常使用的一种参数类型,它的数据存在于文件中。该文件的内容可以手工添加,也可以利用LoadRunner的Data Wizard从数据库中导出。我们将在后面详细地介绍。
(2)User-Defined Functions
调用外部DLL函数生成的数据。
(3)Internal Data
虚拟用户内部产生的数据。
Internal Data包括以下几种类型:
Date/Time
Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,你可以从菜单列表中选择格式,或者指定自己的格式。这个格式应该和脚本中录制的Date/Time格式保持一致。
Group Name
Group Name用虚拟用户组名称替换参数。在创建scenario的时候,你可以指定虚拟用户组的名称。注意:当从VU运行脚本的时候,虚拟用户组名称总是None。
Load Generator Name
Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。
Iteration Number
Iteration Number用当前的迭代数目替换参数。
Random Number
Random Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。
Unique Number
Unique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。
注意:使用该参数类型必须注意可以接受的最大数。例如:某个文本框能接受的最大数为99。当使用该参数类型时,设置第一个数为1,递增的数为1,但100个虚拟用户同时运行时,第100个虚拟用户输入的将是100,这样脚本运行将会出错。
Vuser ID
Vuser ID用分配给虚拟用户的ID替换参数,ID是由LoadRunner的控制器在scenario运行时生成的。如果从脚本生成器运行脚本的话,虚拟用户的ID总是-1。
我们给此参数命名为“username”,然后单击“OK”按钮,关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符,参数用一对“{}”括住,如图5-29所示。
图5-29 脚本参数化后的变化
提示:在参数化CORBA或者General-Java用户脚本的时候,必须参数化整个字符串,而不是其中的部分。另外注意:除了Web或者WAP,缺省的参数括号对于任何脚本都是“{}”。你可以在“General Options”对话框的“Parameterization”选项卡(“Tools”>“General Options”)中定义参数括号种类。