LoadRunner参数值定义-摘自一米阳光
深入解析LoadRunner下的参数化取值
熟悉LoadRunner的人,相信都会经常使用参数化功能,但是对于参数化的使用到底了解多少,就值得深思了。包括本人在内也是,每次在做压力测试的时候,基本上都少不了要对一些动态的参数进行大数据量的读取,使用参数化功能也都是为了更符合实际应用。所以说用了就不表示理解了,更不能代表能灵活运用了。最近在一次接口压力测试中就让我遇到了一点麻烦,本来准备了10万级的数据量,但是在执行压力场景运行总,配合做压力的开发人员监控数据库中表记录就发现,真正插入进去的数据有时候只有不到1000条,甚至有时候只有一条,起初我以为是接口那边做一些复杂的判断规则导致的,要求开发人员把程序里的规则包括数据库表中的约束等属性都适当的去除,或者是放宽,这样以来可以避免一些数据不至于因为规则和约束而插入失败。经过一番折腾之后,发现不以为然,数据还是没能按照预期的结果入库,而当前表约束只有一个规则,那就是唯一性,要求每次插入的数据都必须是唯一的,也就是新值,不过这对于LoadRunner的参数化功能是完全可以实现的,经过一番折腾之后发现这个参数化功能真还是那么简单,看似每个设置都能理解,但如果没有深入实践去证明,结果还真是大不相同。
改变参数化的取值方式,关键在于Select next row和Update value on这两个选项。
Select next row包括以下选项:
- Sequential:顺序方式
- Random:随机方式
- Unique:唯一方式
Update value on包括如下选项:
- Each iteration:每次迭代更新取值
- Each occurrence:每次取值更新
- Once:只更新一次
下面我们将通过如下的一段脚本来分别解析各个组合设置的效果,脚本如下:
Action()
{
int i = 0;
for (i=0; i<5; i++) {
lr_eval_string("{paramtemp}");
}
lr_eval_string("{paramtemp}");
return 0;
}
注:以上脚本的功能就是先重复循环取5次参数,然后循环结束后再读取一次参数的值。这里为参数paramtemp准备的参数数据有temp1~8共8条数据,供测试使用。
1、Sequential+Each iteration(顺序方式+每次迭代更新取值),设置Run—Logic中action循环迭代5次,并运行以上脚本,结果如下:
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
。。。。。。
通过如上的回放日志可以发现,共循环action5次,共取了5个参数化中的数据,但每次执行action脚本时,脚本内部的取值均相同。设置Sequential是为了保证顺序读取方式,而Each iteration是基于Run—Logic的设置的,就是说每次循环一次后,读取新的值。如果设置循环次数超过数据的行数,此时再回放之后的结果就是,超过第八,从第九次开始就又从temp1开始读取,完成循环迭代的读取过程。
2、Sequential+Each occurrence(顺序方式+每次取值更新),设置Run—Logic中action循环迭代5次,并运行以上脚本,结果如下:
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp3"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp4"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp5"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp6"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp7"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp8"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp3"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp4"
。。。。。。
分析如上的两次迭代回放日志我们可以发现,每一次迭代中取值都在变化,而且都是在读取新的一行数据,当数据读取完之后,又重新顺序读取。这里我们就可以很清晰的认识到Each occurrence和Each iteration之后的结果,是完全不同的方式进行读取的,Each occurrence每一次取值更新的。
3、Sequential+Once(顺序方式+只读取一次),设置Run—Logic中action循环迭代5次,并运行以上脚本,结果如下:
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
。。。。。。
从回放日志中可以看出,这里的读取方式很符合Once的字面理解,它只对参数读取一次,由于是顺序读取,所以它就只读取一个第一行数据。关于Once的读取方式是我们通常容易犯错的地方,就以为选择Once可能就是每个参数只读取一次,导致最后可能就只插入一条数据进去进入到库中。
接下来我们需要了解的就是Select next row中其他两种方式,分别为Random和Unique,具体如下:
Random:表示随机读取方式
- Random+Each iteration,跟顺序读取的结果唯一不同的就是这里是随机读取,取值是每次迭代取值
- Random+Each occurrence,随机取值更新方式
- Random+Once,随机取一行数据,然后重复迭代读取这一行数据
Unique:主要是强调取值的唯一性,如果到最后没有该值了,LR提供了其他解决方案,如图所示:
此处的下拉列表中提供了三种方式,具体如下:
- About Vuser,当取值次数超过参数的行数时,忽略脚本的运行
- Continue in a cyclic manner,取值超过时,启用循环扫描,扫描那些还未被使用的数据进行使用
- Continue with last value,重复读取最后一行数据
所以关于Unique的唯一性取值方式还是需要值得,而且通常也用得比较多,特别是对于一些数据库表有唯一性约束的字段,必须要配合此项设置方能顺利执行。
其实,在参数设置方式中,关于数据行的读取顺序基本上都比较直接明了,唯独在结合取值方式上就容易引起一些混乱,特别是Each iteration和Each occurrence这两种方式,前者是基于Run-Logic的迭代循环取值的,而Each occurrence是基于每一次取新值的,当然在通常情况下,这两者其实是有共性的,如果一个脚本中只有一个参数,且只读取一次参数的话,设置这两种方式的结果是相同的,可以将脚本缩减如下,回放之后就可发现结果是一样的,但提前是配合顺序和随机两种方式,如果配合唯一性,那结果就另当别论。缩减后的脚本如下:
Action()
{
lr_eval_string("{paramtemp}");
return 0;
}
性能测试的第一步就是要创建出符合实际应用的测试脚本,而脚本的调试和优化却是脚本创建过程中最为重要的,如何合理运用参数化功能,对于最后的场景运行和监控都是至关重要的,如果理解不当,将会浪费大量的时间去分析,既误导开发人员,也误导自己的测试结果分析。
360个人图书馆连接
http://www.360doc.com/content/15/0726/16/19090937_487531973.shtml
LoadRunner参数值定义-摘自一米阳光的更多相关文章
- loadrunner中定义数组
loadrunner 中数组的定义 loadrunner 中数组的定义: lr_save_string("www.google.com","website_1" ...
- 一文读懂HDMI和VGA接口针脚定义
一文读懂HDMI和VGA接口针脚定义 摘自:http://www.elecfans.com/yuanqijian/jiekou/20180423666604.html HDMI概述 HDMI是高清 ...
- 一张图让你看懂HDMI针脚定义
一张图让你看懂HDMI针脚定义 摘自:http://www.hdmiaoc.com/cjwt-175.html 什么是HDMI线,HDMI插头的每根PIN脚是什么意思? 大部分使用HDMI标准的研发及 ...
- Markdown语法基础
Markdown基本语法 创建 2018-09-07 by YANHAI 标题:Setext方式 三个或更多 大标题 === 小标题 --- 大标题 小标题 标题:Atx方式 # 内容 (一级标题) ...
- Python中的input你真会吗?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:一米阳光里的晴天娃娃 python中的input()方法是在控制台可 ...
- android初级篇之apk签名key keystore格式转pk8+x509.pem
转自:http://www.jianshu.com/p/3bd5c68cc44d 常用的android的签名工具有两个即jarsigner 和apksigner.这两种使用的key格式不一样,keys ...
- Eclipse+Maven创建webapp项目<一>(转)
还在为jar下载而烦恼吗?还在为jar依赖关系而烦恼吗?还在为jar冲突而烦恼吗?强大的maven项目管理工具来拯救你们呢?自动下载jar,自动下载jar依赖包.你什么都不用做,只需要在中央仓库中co ...
- 高斯混合模型(GMM)
复习: 1.概率密度函数,密度函数,概率分布函数和累计分布函数 概率密度函数一般以大写“PDF”(Probability Density Function),也称概率分布函数,有的时候又简称概率分布函 ...
- Highcharts动态添加点数据
Highcharts用来作为图表数据的展示十分方便,效果也比较好.highcharts不仅可以实现死数据的展示,也能实现动态数据的实时添加显示,类似财经股票的实时刷新效果,实现过程并不难,大致如下. ...
随机推荐
- mysqldump备份错误:诡异的#mysql50#.mozilla数据库
今天测试mysql自动备份功能 在red_hat_linux5系统下安装了mysql_5.5 系统提示执行脚本抛错, 手动执行脚本, 返回错误:mysqldump: Got error: 1102: ...
- easyui 个人使用心得之下拉列表
下拉框: 第一种:从数据库获取<input id="FlowType" name="FlowType" style="width: 245px; ...
- 8259A工作原理描述
通过初始化编程向8259A写入相应的初始化命令ICW,可以使芯片处于一个规定的基本工作方式,并在此方式下进行工作.8259A的初始化命令字共有4个ICW1-ICW4,进行初始化时要求ICW1-ICW4 ...
- VS超强调试技巧--忍不住想赞一下
你是否曾遇到一个项目启动都要半分钟? 启动后调试或突然看到有行代码写错了?然后开始了: 处理步骤:停止运行->修改代码->重新启动(10-30秒)->又写错了->又要修改-&g ...
- Amazon才推众包物流,“京东众包”已红绿上阵,“达达”还手握10万配送大军
据外媒消息,Amazon正在开发一款App,想让大家都来为他家送包裹. Amazon的设想是,在市区招募实体零售商,租用空间或者按包裹向其支付费用.这项服务在内部代号为“On My Way”,目前还在 ...
- jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)
JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter ...
- Linux 下Nginx 的安装及负载均衡的简单配置
这次发布程序需要均衡负载,网上看了一下这方便的东西,觉得很不错,学完之后做下总结,一遍后期用到. 1.安装nginx之前需要安装的两个依赖,pcre-x.x.x.tar.gz 和pcre-devel- ...
- 隐藏android中EditText中的下划线以及修改光标颜色
在android开发中 EditTextText是我们经常用到的,我们使用时会有一些小问题,当我们点击输入文字时,EditText中的光标和下划线会变成粉红色. 解决方法很简单,我们只要在EditTe ...
- Front-End(五)——工具使用
mac端推荐使用sublime+emmet. 环境搭建 sublime 官网下载sublime text 02或者03,03现在(2016.07)还是测试版,我使用的是text02. emmet su ...
- Tomcat7性能优化
目的 通过优化tomcat提高网站的并发能力. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有决定性影响. 优化配置 配置tomcat管理员账户 在conf/ tomcat-users ...