说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/103992466
文章目录
三、增强脚本
5.参数化
5.5 使用数据库参数化
5.5.1 大量数据快速插入数据库
- 首先博主在windows server 2008虚拟机中安装了sqlserver_2008数据库,并创建了LR数据以及users表(关于数据库sqlserver的安装可以参考功能测试与项目实战之编写测试用例(重中之重)这篇文章)
- 数据库中的声明语句
- 插入数据的 sql 语句
- 向数据库中快速插入 200 行数据
5.5.2 参数化设置
- 首先要保证loadrunner所在的电脑能ping通SqlServer数据库所在的电脑(关闭防火墙)
- 开启SqlServer服务器TCP/IP协议
- 重启SqlServer服务,令配置生效
- 回到loadrunner注册脚本中,将之前进行参数化的数据全部进行恢复初始值
- 创建新的参数
- 跟之前QTP中一样,创建数据源
- 选择创建系统数据源,选择SqlServer
- 配置数据库连接
- 选择要连接的SqlServer数据库
- 最后测试数据库连接,没有任何问题
- 指定数据库连接字符串和 SQL 语句
✔ 为尽量保证参数的真实性,参数最好在历史数据库中获取。
- 选择unique+once
- 对脚本中的数据进行参数化,在密码这块需要新建参数,选择之前的yhm.dat文件,列数为第二列密码即可,不同重新创建数据源了
- 脚本参数化配置完成如下
5.5.3 使用数据库参数化数据进行负载测试
- 保存脚本,创建场景
- 更改全局计划
- 删除之前参数化创建的100个用户数据,执行场景,事务全部通过,每个虚拟用户通过6个事务,200个虚拟用户这就是1200个事务,需要注意的是再次运行脚本init、action、end这三种脚本自带的事务不会记录进行,则总共通过的事务为600个事务
- 博主又忘记执行场景之前勾选扩展日志了,哎,如果没有勾选始终发送以及扩展日志,那么vuser运行成功的日志将不会被记录下来
- 删除注册成功的200个用户数据,重新执行场景,查看vuser虚拟用户运行日志
5.6 使用随机数参数化
5.6.1 LoadRunner 提供的随机数
- 对脚本中的密码恢复初始值后,再使用loadrunner提供的随机数
- 创建场景,并执行场景,跟之前的场景计划计划一样(不要忘记删除已注册成功的用户数据)
5.6.2 使用脚本生成随机数
- 随机数种子
✔ 从 1、2、3、4、5、6、7、8、9、0 这十个数中随机取出一个数,比如取出的数是 6 的话,那么 6 就叫随机数,十个数字就叫随机数种子。 - 使用 rand 产生随机数
✔ int a = rand() % 10;
★ 产生 0~9 的随机数,注意 10 会被整除。
★ 如果数据量不大,随机数可能会有重复。
✔ int a = rand() % 51 + 100;
★ 可以规定上下限,产生 100~150 的随机数。
★ 包括 0 在内共 51 个数,%51。
★ 起始值是 100。 - 随机字符串
✔ strncat 函数
★ strncat(dest, src, n)
■ 从字符串 src 的开头拷贝 n 个字符到 dest 字符串尾部,从而实现字符串的连接。
✔ 随机字符串的实现
6.关联
6.1 关联的含义
- 【例 1】录制完整订票的脚本,注意验证脚本是否实现了业务(添加事务、检查点)。
- 录制脚本时,服务器会返回一些动态的、变化的值给客户端,每次回放脚本这些数据都会变化,这些数据直接获得是不可能的,通常需要关联。
- 切换到树视图,为脚本添加检查点
- 删除cdtaogang用户数据文件中的订票数据
- 回到脚本,执行脚本,查看回放日志中所有的检查点都显示成功
- 但是打开cdtaogang用户文件数据,却没有看到订票数据
- 切换到树视图,给打开网站、登录、搜票、订票、退出添加事务
- 回到脚本中,在每个事务结束前对事务状态PASS OR FAIL进行判断
- 运行脚本,从日志中得出在登录事务的时候不成功
- 打开运行时查看器,发现在进行登录提示了如下错误
- 点击下一步,发现连用户名都没有显示
6.2 如何关联
-
录制后关联
✔ 脚本至少执行一次后才能进行关联。 -
手动关联方法
✔ 对比脚本或者双击日志中的红色文字,定位到错误行,分析错误行中哪些数据可能发生了改变;
✔ 在生成日志中,查找上一步发现的变化的数据,找到后,复制出整个一行到记事本;
✔ 整理复制出的代码(如对齐),找出左右边界;
✔ 插入关联函数:web_reg_save_param -
新建脚本,录制与webtours订票脚本一样的操作,不用保存脚本,并进行回放脚本操作
-
将当前新录制的脚本与webtours订票脚本进行对比,查看不同的地方(也就是前面查看运行时查看器提示的回话错误点)
-
通过勾选选项中显示不同标红,排除事务检查点以及航班的班次不同以为,那么这个userSession则也就是会话
-
回到webtours注册脚本中,查看脚本代码以及生产日志中的userSession
-
在脚本中鼠标点击userSession所在的函数,切换到树视图中,查看http视图,从服务返回的响应数据中查找userSeesion,如果没有找到,则需要往前找,很明显这里服务器响应数据中没有userSession字段
-
往前找,找到了userSession字段
-
复制响应中的userSession字段所在的input标签,然后鼠标点击nav.pl并切换到脚本中,在这个函数之前鼠标右击插入新步骤
-
配置如下
-
添加web_reg_save_param步骤完成后如下
-
通过在脚本中打印出session会话值,就明白为什么回放脚本在登录事务提示FAIL失败了
-
替换脚本中写死的会话值为session
-
运行脚本,查看结束登录事务显示成功,并且cdtaogang用户文件中写入订票数据
★ web_reg_save_param(参数名,“LB/IC=左边界”,“RB/IC=右边界”,“其他属性 1=值”,“其他属性 2=值”,待查找字符串,LAST)
■ 关联参数名
◆ 表示将缓冲区中查找到的内容保存到此参数中。
■ 边界可以为空,但"LB="、"RB="等不能省略
◆ LB/IC 中的 IC 可以省略,表示忽略大小写,不写时表示区分大小写。
■ Ordinal 或 Ord=1
◆ 选择找到多项中的第几项(从 1 开始);
◆ 设置为 All 时,找到所有项后放到数组中
● 参数名_count:存放着找到的项数
● 参数名_i:存放着第 i 项(i 从 1 开始)。
◆ 对应于图中 Instance。
■ Search=Body
◆ 查找位置,对应于图中 Search in。
■ RelFrameId=1
◆ 当页面中有多个帧(框架),匹配帧中的数据时需指定帧号,帧号最多 7 位。
◆ 对应于图中 Relative Frame ID。
■ NotFound=ERROR
◆ 指定找不到时的处理方式。
■ SaveLen=3
◆ 截取字符串的长度,默认-1 表示全部截取。
■ SaveOffset=2
◆ 从第几个字符开始截取字符,默认 0 即第 1 位开始
■ IgnoreRedirections=yes
◆ 忽略重定向。
6.3 关联案例
- 【例 1】将航班始发地、目的地参数化,实现一人买 3 张票,每次选择航班中的第2个班次(以;02 为边界)
- 首先对出发地进行参数化
- 再对目的地进行参数化,这里需要注意的是不去创建新的表,而使用上面的cong.dat文件来新建一个列即可
- 因为要连续购买三次票,所以需要设置迭代次数为3,开启扩展日志
- 删除cdtaogang数据文件中的订票数据,运行脚本,查看日志得知所有事物均pass通过,出发地及目的地选择的参数正确
- 打开cdtaogang用户数据中的订票数据得知其实每次选择的航班都是一样的,那么肯定是错误的,因为三次买票的出发地与目的地都不一样,而脚本中的选择航班却不变,并且订票的检查点也是固定不变的但状态还是Pass,那么脚本是有问题的
- 解决方法:首先对检查点中的出发地和目的地进行替换现有的参数
- 对于航班号和日期,在脚本中进行复制然后到生成日志中查找,复制这一段
- 复制后粘贴到记事本中,以<input>标签开始进行整理
- 紧接着切换到树视图,倒着往前找服务器返回的响应日志中的input标签数据
- 切换到脚本,然后在函数上方添加关联
- 关联配置如下
- 在脚本中打印出banci参数的值,运行脚本,查看banci的值没有任何问题
- 替换脚本中的班次
- 【例 2】修正订票检查点中的航班号错误。
✔ 拆分字符串
char p[]=“241;97”;
char *a=(char *)strtok(p,";"); //p 必须是数组形式 lr_output_message(a);
★ (char *)strtok(lr_eval_string("{参数名}"),“分割字符串”)
■ 返回指针变量(存储字符串)类型
✔ 变量存入参数
★ lr_save_string(变量或常量,“参数名”); - 新建一个脚本,测试取出banci中的航班号
- 在脚本中取出banci参数的值,并进行分割取出航班号
- 删除cdtaogang用户数据中的订票数据,然后执行脚本,主要查看订票检查点是否通过
- 查看cdtaogang用户数据中的订票数据,肯定也是没有问题的
- 【例 3】将航班始发地、目的地参数化,实现一人买 3 张票,每次选择航班中的第 1 个班次(以>为边界)。
- 首先修改脚本中关联函数的右边界和匹配选择第一个
- 删除cdtaogang用户数据中的订票数据,保存脚本并执行,查看日志以及用户订票数据如下
- 根据如上写入到用户数据中的信息,那么在脚本中则不需要保留日期了
- 现在要做的则是对banci参数的值进行处理,不要checked,在将变量保存为banci参数即可
- 执行脚本,查看cdtaogang用户订票数据与回放脚本中的banci日志,没有任何问题
- 【例 4】使用"Ord=All"的方式,选择航班中的某一个班次。
- 修改脚本中关联函数Ord属性
- 打印出单选框的个数,并且取第一个选项(打印语句忘记添加;了)
- 保存脚本,删除cdtaogang订票数据,运行脚本查看日志中与用户数据中的订票数据均为第一个航班,并且打印出的班次数4个也是没有问题的
6.4 参数化与关联对比
- 参数化数据是由客户端传往服务器的,关联是服务器返回客户端的数据。
- 参数化数据事先知道,关联数据事先可能不清楚。