loadrunner12(三) : 参数化
参数化往脚本中动态地代入数据,使脚本运行迭代时能够更加近似地模拟真实用户的操作行为。如下图所示,从工具栏入口进入参数化界面
1. 新建参数
新建参数时的窗口如图所示
需要注意的是,每个参数都必须对应一个.dat
格式的数据文件,因为参数的本质就是引用数据文件中的值,点击 创建表,LR将会为我们自动生成本地数据文件。另外,一个数据文件可以同时被多个参数引用。
2. 编辑参数值
参数创建后,需要对参数的值进行编辑,实际上是向.dat
文件中以表的等式存入数据。编辑区功能如下图所示:
向表中导入数据的方式有多种:
- 1、使用图中1、2可以手动添加数据,1:修改表结构,2:编辑表中的数据。
- 2、使用图中3,使用记事本方式编辑数据。
- 3、导入数据库中的数据。
这里主要介绍一下从数据库中导入数据
- 在使用数据向导之前,需要先去官网(请点我)下载MySQL8.0 ODBC驱动并安装,否则无法创建连接。(64位不行就用32位,本人64位的数据库,不知为啥要用32位的驱动才能使用)
- 依次点击
数据向导-->手动指定SQL语句-->创建-->机器数据源-->用户/系统(都行)-->在驱动列表中找到MySQL ODBC 8.0 ANSI Driver-->完成
,如果一切顺利,会弹出创建连接窗口:
按照图中所示要求填写参数后,点击Test,如果提示成功,则表示可以连接,点击OK跳到 机器数据源 窗口,选择刚刚创建的连接,确定后回到 输入SQL语句 页面,连接字符串输入框中会自动填入信息,如图:
在SQL语句框中输入SQL查询语句,点击完成,导入成功。 - 例:
- 数据库中的数据
数据库名称在创建连接时已经选择
- 输入SQL语句
- 结果
- 数据库中的数据
3. 设置参数的取值逻辑
数据文件中往往包含了很多行数据,甚至还有多列数据,每次调用参数时,它的取值逻辑影响着脚本的仿真程序,甚至错误的逻辑还会导致脚本迭代时发生错误。
如图,参数的取值逻辑是由图中的6、7来点来设置的。6决定了参数取哪一列的值,如果只有一列则无需设置;7决定了脚本运行中遇到参数替换时,取哪一个值。
这里主要说明一下7的设置:
- 选择下一行:
即当脚本中的参数需要从数据表中取新值的的取值逻辑。
- Sequential:从第一行开始取值,当需要更新值时,会按顺序取下一个值。如果迭代次数超过值的数量,将会自动从第一个值开始新循环。类似听歌时的顺序循环。
- Random:需要更新值时,随机从表中选取一个值,可重复。类似听歌时的随机播放。
- Unique:从第一行开始取值,当需要更新值时,会按顺序取下一个值,但表中值均只能取一次。因此当迭代次数超过表中的值的数量时,需要选择当值超出时如何处理。
只有选择Unique时该选项才是可选的。三个选项作用分别是:中止运行、从第一行开始取值、取最后一行的值。 - Same line as xxx
当参数列表中有多个参数时,选项表中会多出此选项。作用是将另一个参数作为参照,取值时选取与参照的参数同样的行数的值。这个在参数之前有关联时发挥着作用,例如用户名与密码,将会在本小结最后给出例子。
- 更新值的时间
即何种情况下参数需要从数据表中重新取值。
- Each iteration 开始新一轮迭代时,从数据表中重新取值。
- Each occurrence 运行过程中,每次遇到该参数时,从数据表中重新取值。与迭代无关系,新一轮的迭代时,仍承接上一轮迭代的最后一次更新。
- Once 只取一次值,之后遇到的所有该参数无论是否新的迭代,都使用这个值。
4. 范例:模拟用户名、密码登录
LR自带的旅游订票系统,从数据库中导入了账号密码的表,并设置了两个参数,分别为username与password,对应表中的第一列与第二列。数据表及两个参数的设置分别如下
-
数据表:
-
username的参数设置
-
password的参数设置
现在我们运行脚本时,password始终与当前选用的username对应,以确保以正确的账号密码登录系统。
但是需要注意的是,password的值是随着username的取值来应对的,这意味着直到下一次username更新为止,password的值是始终不变的。例如我将脚本范例1中的登录部分(25-39行部分)的username与password位置互换:
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/cgi-bin/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in=home",
"Snapshot=t42.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={userSession}", ENDITEM,
\*...*\
"Name=password", "Value={password}", ENDITEM,
"Name=username", "Value={username}", ENDITEM,
\\"Name=password", "Value={password}", ENDITEM,
\*...*\
"Name=JSFormSubmit", "Value=on", ENDITEM,
"Name=login.x", "Value=60", ENDITEM,
"Name=login.y", "Value=1", ENDITEM,
LAST);
之后再运行脚本,会发现运行错误,查看日志发现从第二次迭代开始报错,我们截取各次迭代中的参数取值部分如下:
- 第1次迭代
- 第2次迭代
第2次迭代时,由于password参数先于username,而username的值未更新,因此此时的password的值对应第1次迭代中的username对应的值,为第5行。接下username参数更新为第3行,将第3行的username与第5行的password作为用户名和密码进行登录,显然会无法登录。
至于为什么第1次迭代时在username未取值的情况下,password能先行取值,并且能与后取值的username对应,希望有大神能够留言帮忙解惑一下~