熟悉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;
  }

  性能测试的第一步就是要创建出符合实际应用的测试脚本,而脚本的调试和优化却是脚本创建过程中最为重要的,如何合理运用参数化功能,对于最后的场景运行和监控都是至关重要的,如果理解不当,将会浪费大量的时间去分析,既误导开发人员,也误导自己的测试结果分析。

转载于:https://www.cnblogs.com/candle806/archive/2011/07/18/2109607.html

深入解析LoadRunner下的参数化取值相关推荐

  1. lr参数化取值与连接数据库

    TXT文本,EXCEL表格以及数据库中的表都可以作为参数的数据集载体,LR都是支持的. 特别提醒: 1.在形成数据池之后,数据库中的数据变化不会影响数据池中的数据. 2.数据文件一定要以一个空行结束, ...

  2. object取值_this的原理、函数的不同调用方式this取值、以及不同环境下this的取值、函数四种调用方法...

    一.this的原理 1.1问题的由来 学懂 JavaScript 语言,一个标志就是理解下面两种写法,可能有不一样的结果 var obj = {foo: function () {} };var fo ...

  3. 03-Jmeter参数化取值策略

    CSV Data Set Config配置中线程共享模式共有三种,分别为:所有线程.当前线程.当前线程组.这三种模式决定了jmeter的取值策略.Jmeter线程共享模式,共享的是数据文件. 1.线程 ...

  4. sphinx下的max_matches取值对SetLimits的影响

    使用PHP在client运行 $s -> SetLimits(0, 15, 1200); 传递的第三个參数,是server端设定当前查询的结果集大小为1200.可是执行结果,确实$s终于查询得到 ...

  5. linux系统下pid的取值范围了解一下

    一般PID_MAX=0x8000(可改),因此进程号的最大值为0x7fff,即32767. 进程号0-299保留给daemon进程. 现在的内核好像没有这个限制了,<linux内核设计与实现&g ...

  6. IE 兼容模式下 contentEditable 无法取值

    原因:IE访问页面的时候,受限制 解决办法 :在html里插入以下代码 <!-- saved from url=(0014)about:internet -->

  7. c语言 long类型取值范围,详解 IOS下int long longlong的取值范围

    详解 IOS下int long longlong的取值范围 32bit下: unsigned int 0-4294967295 int -2147483648-2147483647 unsigned ...

  8. 参数处理:#{}与${}取值的区别

    2019独角兽企业重金招聘Python工程师标准>>> #{}与${}都可以从传递的参数中取得对应的值,而且每种取值的写法都一样,不同在于 1.${}是采用SQL拼接的方式 2.在不 ...

  9. python wx模块下choice列表框值怎么更新_wx python

    一.静态文本控件 wx.StaticText(parent, id, label, pos=wx.DefaultPosition,    size=wx.DefaultSize, style=0, n ...

  10. DC-DC电路反馈分压电阻,取值越大越好吗?

    DC-DC输出电压的计算,我相信每个硬件工程师都会计算,芯片规格书也会给出计算公式.但是,我们在选择反馈电阻时,有没有考虑过在比值相同的情况下,和取值到底是选大些的好还是小些的好,下面我针对这个问题探 ...

最新文章

  1. Python的Tkinter点击按钮触发事件
  2. signature=d60f979e909db97dbaa034ebe539f2fd,Experimental signatures of fermiophobic Higgs bosons
  3. 开发函数计算的正确姿势 —— 安装第三方依赖
  4. java数字高低呼唤_记录某电话交换台 5 分钟内接到的呼唤次数,则样本空间 S={0,1,2, … ,n, … }_Java答案_学小易找答案...
  5. 【Oracle】RAC中控制文件多路复用
  6. 2021-08-09
  7. linux的tar命令压缩26g文件,如何使用Linux上的tar命令压缩和解压缩文件 | MOS86
  8. 做了三年Java,java参考文献近五年图书
  9. pve万兆网卡驱动_家庭基础万兆网络——最简单的方案
  10. OA办公系统 Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器
  11. Python3+Selenium3自动化测试 - 实例 - 登录QQ邮箱并自动发送邮件
  12. python 多线程内子线程结束后执行主线程
  13. 闲聊机器人实例四:python实现小姜机器人(检索式chatbot_sentence_vec_by_bert_bert句向量)
  14. OpenCV学习笔记(九)之直方图均衡化(图像增强)
  15. 算法时间复杂度的计算:从几道题目讲起
  16. fluter的环境搭配及android studio开发
  17. 【Multisim仿真】二极管钳位电路仿真
  18. 平安好医生遭遇困局:六年亏近47亿元 价值百亿品牌或被舍弃
  19. (贪心5.3.2)POJ 1505 Copying Books()
  20. STM32F407获取OV7670摄像头图像及上位机解码(一维码二维码)

热门文章

  1. java lambda_Java 8 Lambda 表达式 ( 中 )- 外部参数
  2. 基于springboot的失物招领系统
  3. java泛型特点_Java泛型
  4. Unity(八)脚本生命周期
  5. Linux添加浮动路由,Linux路由配置详情
  6. linux之cenos7修改ip(临时和永久)
  7. datatable自定义表单或者导出excel按钮,搜索
  8. 二、Oracle学习笔记:常用数据类型和关键字
  9. 5-7Linux 起源,与Unix的联系,与Windows的不同
  10. mmh学长的实验器材