一、参数化策略
  1、Select next row(How? 如何取?)取值方式
    选择下一行
    1)Sequential:顺序的
      每个VU都从第一行开始,顺序依次向下取值;
      数据取完可以从头循环重复使用;
      --每个VU取值序列相同
    2)Unique:唯一的 (VU和VU之间值不重复)
      从第一行,对于VU唯一依次向下取值;
      如果数据不足,需要按照指定策略进行取舍;
      --每个VU取值序列不相同
      举例:目前有10行数据:a1 a2 a3 ... a10,2个VU,每次迭代时更新数据,一共迭代2次(表示需要更新2次)。
      按照SE组合:顺序+每次迭代 VU1(a1, a2) VU2(a1, a2)
      按照UE组合:唯一+每次迭代 VU1(a1, a2) VU2(a3, a4)
    3)Random: 随机取 (更真实效果)
      每个VU都随机获取参数池中数据,值可以重复;
    4)Same line as xxx: 和xxx参数同行取值、策略一致
      比如:password 设置为 Same line as username

  2、Update value on (When? 何时取?)更新时机
    结论:何时更新能够决定每个VU需要取几次数据
    1)Each Iteration: 每次迭代 (默认,最常用)
      脚本Action每迭代一次,需要重新取参数的值;
    2)Each Occurrence: 每次遇到 (不常用,不好控制)
      脚本中参数出现一次,则算遇到一次
    3)Once: 仅取一次
      每个VU仅取值一次,不再改变(从一而终)

  3、When out of values: 当超过值的策略
    前提:使用Unique策略时才有效,考虑值不够用时的策略。
    1)Abort Vuser: 放弃VU VU不再执行脚本,并且报错
      (最常用)
    2)以循环方式继续:循环从第一行开始继续取(重复)
    3)以最后一个值继续:重复取最后一个值(重复)

二、练习1
  某参数现有备用数据a1 a2 a3 ... a30,使用VuGen完成(只有1VU),脚本迭代3次,默认迭代一次参数只出现一次,完成以下策略组合的结果:
  1)顺序 + 每次迭代:a1 a2 a3
  2)唯一 + 每次迭代:a1 a2 a3
  3)随机 + 每次迭代:a18 a5 a21
  4)顺序 + 每次遇到:a1 a2 a3
  5)唯一 + 每次遇到:a1 a2 a3
  6)随机 + 每次遇到:a6 a30 a8
  7)顺序 + 一次:a1 a1 a1
  8)唯一 + 一次:a1 a1 a1
  9)随机 + 一次:a5 a5 a5

  新建脚本param1,设置一些参数{name}和{pwd},给定数据,指定不同策略进行检验:

    Action.c(6): 用户名:{name},密码:{pwd}
    原样输出表示参数不认识(未定义)
    如何解决?需要在Parameter List中定义(参数池)
    类型 + 数据 + 策略

  将param1备份为param2,外部循环Action迭代改为2次;
  Action代码中增加内循环3次。 for语法
    (好比迭代一次参数遇到3次)
  for循环语法(Java/C/C++):
    之前语句0;
    for(初始化语句1; 循环条件2; 步进语句3) {
      循环体4;
    }
    之后语句5;
  执行顺序:0 1 2 4 3 2 4 3 2 4 3 2为假 5 循环3次

  比如:3次循环
    for(int i=0; i<3; i++){ // 0 1 2
      ...  
    }
    for(int i=0; i<=3; i++){ // 1 2 3
      ...
    }
    for(int i=3; i>=1; i--){ // 3 2 1

    }

三、练习2
  某参数现有备用数据a1 a2 a3 ... a30,使用VuGen完成(只有1VU),脚本迭代2次,迭代一次参数出现3次,完成以下策略组合的结果:
  1)顺序 + 每次迭代:a1 a1 a1, a2 a2 a2
  2)唯一 + 每次迭代:a1 a1 a1, a2 a2 a2
  3)随机 + 每次迭代:a9 a9 a9, a16 a16 16
  4)顺序 + 每次遇到:a1 a2 a3, a4 a5 a6
  5)唯一 + 每次遇到:a1 a2 a3, a4 a5 a6
    多用户时考虑块大小,VuGen只有1VU,块大小不起作用,象征性写1即可。
    改为:外循环5次,内循环10次
    使用Unique,就要考虑When out of values:
      a) Abort Vuser: 放弃VU 越界会报错Action.c(5): Error
        -- 推荐使用! 保证数据不重复,满足业务需求
      b) 循环继续取: 正常循环取值,不会报错 数据可能重复
      c) 持续最后一个: 持续取值,会报错Action.c(5): Error

  6)随机 + 每次遇到:a15 a1 a6, a9 a1 a19
  7)顺序 + 一次:a1 a1 a1, a1 a1 a1
  8)唯一 + 一次:a1 a1 a1, a1 a1 a1
  9)随机 + 一次:a3 a3 a3, a3 a3 a3

  Action.c(5): Error: Parameter 'name':
  No more unique values for this parameter in table
  没有 更多 唯一 值 针对 参数 name.dat
  'name.dat' [unique range is 1-30].
  VU 被放弃 根据 xxx 策略
  The Vuser is aborted according to "When Out Of Values" policy.

四、多用户分块的概念 块 Block
  1、使用控制台管理多用户时,使用Unique策略时,首先考虑分块的问题,分块时保证用户数据不重复的关键。
    分块后,每个VU选择自己块内数据,能够保证VU之间不会重复使用数据。 分块--数据的隔离

  2、测试过程中,如果参数池数据不够,场景运行会报错。
    建议:使用Unique策略时,保证数据充足,允许必要的浪费。

  3、块大小:分配给每个VU的数据量;

  4、分块的方式:
    1)自动分块:块大小根据VU的需要自动分配--按需分配
    2)手动分块:块大小可以自己设置
      <1> 刚好够用
      <2> 有所富余--推荐使用
      <3> 有所不足--参考When out of values策略
        每个VU在自己的块内数据进行取舍:
          a. 放弃VU;(推荐) b.循环方式继续; c.持续最后一值

五、在控制台中查看运行日志(多用户,产生多个日志文件)
  1、打开控制台:加载param1脚本
    指定日志输出的位置:
      Controller -> Results菜单 -> Results Settings 结果设置
      -> 窗口:
        Result Name: res 存放日志的目录名,可以修改
        Directory: C:\... 默认长路径,建议改短,自己指定
      -> C:\ 新建目录 lrlog
      -> 点击Browse -> 指定目录:C:\lrlog
      另外,还有两个选项:
        每次执行场景,产生新的日志文件;
        每次执行的结果会覆盖之前的日志文件;(选择)

  2、为了能够生成日志文件,需要设置Run-time Settings:
    -> Log -> Always send message 总是发消息

  3、其它设置:
    VU数量:10
    VU行为:默认初始化、同时启动、运行直到结束
    运行场景,观察C:\lrlog目录
    每个VU都会产生一个日志文件:
    param1_1.log .... param1_10.log
    组名_VU的id.log

    重要提示:VuGen修改完数据和策略 -> 编译脚本
    -> 控制台中及时刷新脚本 -> 才可生效

      Insufficient records for parameter 'name' in table to provide the Vuser with unique data
    强调:Unique策略时,数据分配必须要充足,避免报错。

六、综合练习题
  某参数现有备用数据a1 a2 a3 ... a30,使用Controller设置3个VU运行脚本,脚本迭代4次,默认迭代一次参数只出现一次,完成以下策略组合的结果:
  1)顺序 + 每次迭代:<重要> SE组合
    VU1:a1 a2 a3 a4
    VU2:a1 a2 a3 a4
    VU3:a1 a2 a3 a4
  2)唯一 + 每次迭代:<重要> 默认自动分块 块大小: 4
    VU1:a1 a2 a3 a4
    VU2:a5 a6 a7 a8
    VU3:a9 a10 a11 a12
    自动分块 块大小: 4
      第一块:a1 a2 a3 a4 VU1
      第二块:a5 a6 a7 a8 VU2
      第三块:a9 a10 a11 a12 VU3
  3)随机 + 每次迭代:<重要>
    VU1:a10 a1 a6 a15
    VU2:a3 a6 a12 a21
    VU3:a5 a9 a1 a8
  4)顺序 + 每次遇到:
    VU1:a1 a2 a3 a4
    VU2:a1 a2 a3 a4
    VU3:a1 a2 a3 a4
    如果迭代一次遇到2次:
      VU1:a1 a2 a3 a4 a5 a6 a7 a8
      VU2:a1 a2 a3 a4 a5 a6 a7 a8
      VU3:a1 a2 a3 a4 a5 a6 a7 a8
  5)唯一 + 每次遇到:<重要> 手动分块 块大小:6
    VU1:a1 a2 a3 a4
    VU2:a7 a8 a9 a10
    VU3:a13 a14 a15 a16
    手动分块 块大小:6
      第一块:a1 a2 a3 a4 a5 a6 VU1
      第二块:a7 a8 a9 a10 a11 a12 VU2
      第三块:a13 a14 a15 a16 a17 a18 VU3
  6)随机 + 每次遇到:
    VU1:a6 a3 a19 a2
    VU2:a22 a1 a7 a19
    VU3:a5 a9 a23 a16
  7)顺序 + 一次:<重要>
    VU1:a1 a1 a1 a1
    VU2:a1 a1 a1 a1
    VU3:a1 a1 a1 a1
  8)唯一 + 一次:<重要> 默认自动分块 块大小:1
    VU1:a1 a1 a1 a1 满足VU之间值不重复
    VU2:a2 a2 a2 a2
    VU3:a3 a3 a3 a3
    自动分块 块大小:1
      第一块:a1 VU1
      第二块:a2 VU2
      第三块:a3 VU3
  9)随机 + 一次:<重要>
    VU1:a8 a8 a8 a8
    VU2:a16 a16 a16 a16
    VU3:a3 a3 a3 a3
  10)唯一 + 每次迭代:<重要> 手动分块 块大小:5
    VU1:a1 a2 a3 a4
    VU2:a6 a7 a8 a9
    VU3:a11 a12 a13 a14
    手动分块 块大小:5
      第一块:a1 a2 a3 a4 a5 VU1
      第二块:a6 a7 a8 a9 a10 VU2
      第三块:a11 a12 a13 a14 a15 VU3

    查看多用户执行结果的方法2:VuGen就能模拟
    打开VuGen 使用param1 -> Parameter List
    -> Simulate Parameter... 模拟参数化(多用户时)
    -> 窗口:
      Vusers: Number of Vuser: 3
      Scenario run mode: 场景运行模式
      Run until completion: 运行直到结束(取决于迭代次数)
      Number of iteration to run: 4 迭代4次
    -> 点击Simulate 模拟

    对比两种方法:
      方法1:优点:通用,获取运行的日志文件
        缺点:配置过程比较繁琐
      方法2:优点:配置非常方便
        缺点:每次遇到时无法模拟(用得不多)
        无法记录日志文件

    以上参数类型:File类型 使用自定义文件保存参数池数据
    实际项目中常用的组合:
      1)SE组合:顺序 + 每次迭代
        Sequential + Each Iteraction 数据可重复
      2)UEA组合:唯一 + 每次迭代 + 放弃VU 数据不重复
        Unique + Each Iteraction + Abort Vuser
      3)RE组合:随机 + 每次迭代 数据更随意,可重复
        Random + Each Iteraction

七、其它参数类型
  1、Date/Time 日期/时间
    用途:脚本中需要使用日期数据时,获取当前系统时间,使用不同日期格式表示。
      to_char date -> char 提取关心的日期信息
      to_date char -> date 生成date数据 入库
    计算机中保存日期数据的本质:长整数-毫秒数
      从1970年1月1日0点 到 某一时刻的毫秒数
        128639837868
        128639837869
    计算机有算法(历法)将该值推算出所有的日期信息:
      世纪、年、月、日、时、分、秒、毫秒

    将param1另存为 param3
    需求:获取以下格式的当前系统时间数据
      举例 格式字符串
        04/21/2017 %m/%d/%Y
        20170421 %Y%m%d
        2017-04-21 16:26:18 %Y-%m-%d %H:%M:%S

    说明:Date/Time类型适合获取不同格式的当前系统时间;
      File类型可以自己填写某个具体时间。
      2008-08-08 20:08:08

  2、Iteration Number:迭代编号
    用途:获取一组有序的递增的值
    格式:%d
      %01d
      ...
      %05d 具有5位数值,不够的使用0补齐
      00001 00002 ... 00100 01000 ...

  3、Random Number:随机编号
    用途:工具根据指定的规则、范围自动生成一组随机数
    设置:Min: 1 Max: 100 %06lu
      表示6位 1~100随机数 不够0填补
      比如 000001 000100

    UEA: 唯一+每次迭代+放弃VU
    版本1:File类型,数据由自己指定
    版本2:Unique Number类型,数据由工具规则产生

  4、Unique Number: 唯一编号 (UEA版本2) 重点
    用途:根据指定的规则自动为不同VU生成一组唯一的编号
    原理:分块、块大小
    具体配置:
      <1> Start: 1 数据起始值 下一次:1001 2001 ...
      <2> Block size per VU: 100 块大小
        10VU,使用UEA版本2,脚本迭代80次
        VU1: 1~100 VU2: 101~200 .. VU10: 901~1000
      <3> Sample: Hello00001 数值举例
      <4> Number: Hello%05d 数据格式
      <5> Update value: Each iteration 更新时机 每次迭代
      <6> When out of values: Abort Vuser 放弃VU

    技术(技术专家) + 业务(领域专家):
    手机号:138-1181-0086
    运营商 地区 不同用户

    项目案例:针对某电信项目中账户注册功能进行性能测试,其中需要对脚本中的手机号进行参数化,要求手机号不能重复使用。需要1000VU在线执行注册功能,持续运行1小时,已知1个小时内平均每个VU执行437次注册,请提供参数化具体策略。手机号使用138开头。

    思路:不重复 - 唯一 UEA 版本1 或 版本2?
      File Unique Number

    将param3备份为testMobile
    用户id: {uid} 手机号:{number}
    uid的策略:Vuser ID VU的id 格式:%05s
    number的策略:UEA版本2 Unique Number
    具体配置:
      <1> Start: 1 数据起始值 下一次:500001 1000001..
      <2> Block size per VU: 500 块大小
        既要让数据充足,又要便于后续的计算
        VU1: 1~500 VU2: 501~1000 ....
        1000个VU分配了:1000 * 500 = 500000
      <3> Sample: 13800000001 数值举例
      <4> Number: 138%08d 数据格式
      <5> Update value: Each iteration 更新时机 每次迭代
      <6> When out of values: Abort Vuser 放弃VU

    将脚本载入控制台,设置场景:
      1)Run-time Settings:
        <1> 迭代次数:430 (不超过500)
        <2> Pacing: 没有要求
        <3> Log: 选择Always send message 能生成日志文件
        <4> VU模拟:使用线程方式--省资源
      2)Results Settings: 指定日志输出目录 C:\lrlog\res1
      3)设置1000VU
      4)VU行为:默认初始化、同时加载、运行直到结束
        -> 运行场景

归纳最常用的策略组合: 着重说明其项目中应用场合
  1)SE组合: 顺序+每次迭代 最常用
  2)UEA组合:唯一+每次迭代+放弃VU 数据唯一时使用
    关键:分块 块大小
    版本1:File类型 数据由自己填写(工作量大)
    版本2:Unique Number类型 数据由规则产生
  3)RE组合:随机 + 每次迭代 用户访问具有随机性

LoadRunner(7)的更多相关文章

  1. 老李分享:性能测试你不应该只知道loadrunner(1)

    老李分享:性能测试你不应该只知道loadrunner(1)   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...

  2. LoadRunner(三)——LR相关概念&组成部分

    参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.运行机制和主要组成部分 1.LoadRunner主要由VuGen.Controller和Analysis三部分构成: 2. ...

  3. LoadRunner(一)——性能测试基础及性能指标概述

    参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.典型的性能测试场景 某个产品要发布了,需要对全市的用户做集中培训.通常在进行培训的时候,老师讲解完成一个业务以后,被培训用 ...

  4. LoadRunner(8)

    一.脚本关联技术  引入: 打开WebTours首页,点击administration连接: 具有大量管理项,LR为了模拟一些特效设置的选项,实际项目中不存在. -> 选择第三项: Set LO ...

  5. LoadRunner(4)

    一.LoadRunner工具的组成 1.VuGen 虚拟用户脚本生成器 脚本好比:武器 VuGen好比:兵工厂 VU好比:士兵 2.Controller 压力调度控制台 好比:总指挥部 3.Analy ...

  6. LoadRunner(2)

    一.性能测试的基本概念 1.并发和在线的区别:并发的压力是一种瞬时压力,一般针对同一类型业务:在线的压力是一段时间的压力,没有并发那么集中. 规律:一般20用户并发产生的压力相当于200用户在线的压力 ...

  7. LoadRunner(1)

    性能测试:HP LoadRunner11 一.初步概念: 1.功能测试:测试产品的功能是否满足功能需求. 如:ATM取款(在线取款)是否成功或转账操作是否成功 -- 一个用户 2.性能测试:测试产品的 ...

  8. LoadRunner(6)

    一.脚本录制技术细节 1.选择合适的协议: 1)B/S架构:常用Web[HTTP/HTML]协议,如果项目中使用了其它技术,比如Ajax.JDBC.FTP等,就需要选择多协议: 2)C/S架构:常用W ...

  9. LoadRunner(5)

    一.在线综合场景测试:号称能更真实模拟实际生产环境 又称为:混合交易测试 (交易就是事务 Transaction) 1.三要素: 1)多用户:根据需求指定VU数 压力的来源 2)多任务:根据需求结合多 ...

随机推荐

  1. Map对象,Set对象使用(1)

    Map对象:包含所有类型.可以是对象,函数,或字符串等,本质上是键值对的集合 let m = new Map(); let keyarr = [1,23,"发广告"]; let k ...

  2. [LuoguP1074]靶形数独_搜索

    靶形数独 题目链接:https://www.luogu.org/problem/P1074 数据范围:略. 题解: 传说中的大爆搜题啊. 我觉得这种题就是你能想到什么优化就直接上什么优化.... 这个 ...

  3. [百度贴吧]飞腾1500a .VS. 龙芯3a3000: 同频实用性能对比

    贴吧关于 龙芯与飞腾的简单对比. https://tieba.baidu.com/p/5682824804?red_tag=0221728732 龙芯3a3000实用性能 ,还不如4年前发布的FT15 ...

  4. 自己动手写一个服务网关-java

    自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...

  5. java CGLib代理

    转载自   cglib之Enhancer 1. 背景 cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用.本文针对Enhancer的用法以实际代码为例作一些介绍. ...

  6. Netty源码剖析-启动服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...

  7. 【Python基础】02_Python中变量的输入输出

    1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...

  8. Go语言之依赖管理

    Go语言之依赖管理 Go语言的依赖管理随着版本的更迭正逐渐完善起来. 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面.这就导致了同一个库只能保存一个 ...

  9. 怎样设置cookie的到期时间

    1. 使用Cookie的: Expires 属性. 它可以设置cookie的过期时间. 下面的代码表示id这条cookie的过期时间是2015年10月21日早上7点28分; Set-Cookie: i ...

  10. Java语言中:float、double数据类型在内存中是如何存储的

    引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/arti ...