JMeter接口测试-4.JMeter工具详解

1. JMeter元件介绍及执行顺序

在这里插入图片描述

  • 取样器是典型的不与其它元件发生交互作用的元件
  • 逻辑控制器只对其子节点的取样器有效
  • 而其它元件(config elements 、timers 、post-processors、assertions、listeners、)需要与取样器(sampler)等元件交互。

1、配置元件

  • 用来提供对静态数据配置的支持。例CSV Data Set config可以将本地数据文件形成数据池(Date Pool)
  • 元件会影响其作用范围内的所有元件。

2、定时器(具有LR的Think_time功能)

  • 用于操作之间设置等待时间,等待时间是性能测试中常用的控制客户端QPS的手段。
  • 元件对其作用范围内的每一个sampler 有效

3、前置处理器

  • 用于在实际的请求发出之前对即将发出的请求进行特殊处理。例当url中有SessionID一类的信息时,可以通过该处理器填充发出请求实际的SessionID。
  • 元件在其作用范围内的每一个sampler元件之前执行。

4、后置处理器(具有类似于LR中的关联功能)

  • 用于对Sampler发出请求后得到的服务器响应数据进行处理,一般用于提取响应中的特定数据。
  • 元件在其作用范围内的每一个sampler元件之后执行。

5、断言(具有类似于LR中的检查点功能)

  • 用于检查测试中得到的响应数据是否符合预期。断言一般用来设置检查点,验证测试过程中的数据交互是否与预期一致。
  • 元件对其作用范围内的每一个sampler 元件执行后的结果执行校验。

6、监听器(具有类似于LR中的日志功能)

  • 用来对测试结果数据进行处理和可视化显示的一系列原件。图形结果、查看结果树、聚合报告等都是比较常用的原件。

  • 元件收集其作用范围的每一个sampler元件的信息并呈现。

7、取样器–Sampler
  是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元。每一种不同类型的Sampler可以根据设置的参数向服务器发送不同的请求。

8、逻辑控制器

逻辑控制器的作用域只对其子节点的sampler有效,作用是控制采样器的执行顺序。

  • 分为两类元件:
    • 一类用于控制Test Plan中Sampler节点发送请求的逻辑顺序控制器,常用的有 如果(If)控制器、Swirch Controller、Runtime Controller、循环控制器等。
    • 另一类用来对Test Plan中的脚本进行分组,方便Jmeter统计执行结果以及脚本运行时的控制。如事务控制器、吞吐量控制器等。

元件的执行顺序

1、配置元件(Config Elements)

2、前置处理器(Pro-processors)

3、定时器(Timers)

4、取样器(Sampler)

5、后置处理器(Post-processors)

6、断言(Assertions)

7、监听器(Listeners)

需注意事项

  • 取样器是典型的不与其它元件发生交互作用的元件,
  • 前置处理器、后置处理器和断言等元件功能对取样器作用。因此,如果在它们的作用域内没有任何取样器,则不会被执行;
  • 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。
  • 一个断言在测试树中是分等级的。如果它的父元件是请求,它就被应用于那个请求。如果它的父元件是控制器,它就影响所有那个控制器下的所有请求
  • 逻辑控制器只对其子节点的取样器有效,而其它元件(config elements 、timers 、post-processors、assertions、listeners、)需要与取样器(sampler)等元件交互。

2. Jmeter逻辑控制器

什么是逻辑控制器?

​ 概念:Jmeter逻辑控制器是可以控制采样器(Sampler)的执行顺序,它由多个逻辑控制语句封装成不同功能的组件组成

逻辑控制器作用域

​ 作用域:只对其子节点的sampler有效

逻辑控制器

逻辑控制器共有 17个,分别是:

1、If Controller【如果(If)控制器】                               
2、Transaction Controller【事务控制器】
3、Loop Controller【循环控制器】                                  
4、While Controller【While 控制器】
5、ForEach Controller 【ForEach 控制器】          
6、Include Controller【Include 控制器】
7、Runtime Controller【Runtime 控制器】                       
8、Critical Section Controller【临界部分控制器】 
9、Interleave Controller【交替控制器】                       
10、Once Only Controller【仅一次控制器】
11、Recording Controller【录制控制器】       
12、Simple Controller【简单控制器】
13、Random Controller【随机控制器】                  
14、Random Order Controller【随机顺序控制器】  
15、Throughput Controller【吞吐量控制器】
16、Switch Controller【Switch 控制器】                          
17、Module Controller【模块控制器】  

在这里插入图片描述

1.1 如果(If)控制器

作用:

  • 条件成真,则执行控制器下所有取样器,根据给定表达式的值决定是否执行该节点下的子节点,条件可以使用 JavaScript 与变量表达式。

  • 判断if控制器里面的语句是否为真,如果为真继续执行

案例1:1==1,则执行登录用例

步骤:

  • 添加if控制器

    • 线程组 > 添加 > 逻辑控制器 > 如果 (if) 控制器
  • 在if控制器下面添加登录接口HTTP请求以及察看结果树

  • 编写Expression

    • 建议使用__jexl3函数,可通过菜单栏->tools->函数助手,选择功能 __jexl3

      • 在JEXL值处添写表达式1==1,点击生成

      • 可以看到生成的函数字符串,直接复制即可

        • ${__jexl3(1==1,)}
          
      • The result of the function is 表示的是该表达式的结果

        • 结果为true
          

      在这里插入图片描述

  • 把函数${__jexl3(1==1,)}复制到if控制器里

  • 在这里插入图片描述

  • 运行及查看结果

    • 在这里插入图片描述

    • 结果

      • 表达式为true时

        • 在这里插入图片描述
      • 表达式为false时

        • 在这里插入图片描述

        • 结果为空,未执行登录接口

参数详解:

在这里插入图片描述

步骤:

  • 添加如果(if)控制器
    • 线程组 > 添加 > 逻辑控制器 > 如果 (if) 控制器
  • 编写Expression,${__jexl3("${__property(token,,)}"!= "")}

在这里插入图片描述

  1. 名称:如果(If)控制器名称,可以随意设置,甚至可以为空。

  2. 注释:可以随意设置,可以为空。

  3. 表达式(必须计算为true或false)

  4. Expression(must evaluate to true or false):
    表达式(值必须是true或false),也就是说,在右边文本框中输入的条件值必须是true 或 false,(默认情况下)

    • Interpret Condition as Variable Expression?:

      • 条件是否解释为变量表达式(需要使用__jexl3 or __groovy 表达式)

        • 如果不选中,可直接写表达式

        • 1==1
          
        • 在这里插入图片描述

        • 表达式结果为true,则登录接口执行

      • 条件中为变量

        • 很多情况下,需要根据用户变量或者上一个取样器的返回值来进行条件判断,觉得是否需要执行某一个的取样器。
        • 案例2:假如token未获取到,则不执行获取个人信息接口
          • 具体信息参考下面具体内容
      • t

    • Evaluate for all children:

      • 判断条件是否对所有的子节点执行?
      • [勾选:是,则该条件在每一个子节点执行时执行一次;
      • 默认不勾边:否,该控制器可以对包含在其下面的所有可运行的元素进行执行,但只在如果(If)控制器的入口处判断一次。]
      • 假如这个控制器下面,有3个HTTP请求。如果需要在执行每个HTTP请求前,进行判断是否满足控制器中的条件,则需要勾选该复选框。
      • 案例3:
  5. 说明翻译:

    For performance it is advised to check "Interpret Condition as Variable Expression" and 
    use __jecl3 or __groovy evaluating to true or false or a variable that contains true or false.
    对于性能,建议检查“将条件解释为变量表达式”,并使用“jecl3”或“groovy”计算为“真”或“假”或包含“真”或“假”的变量。
    
    ${JmeterThread.last_sample_ok} can be used to test if last sample was successful
    ${JmeterThread.last_sample_ok}:可用于测试最后一个样本是否成功
    

案例2:假如token未获取到,则不执行获取个人信息接口

在这里插入图片描述

步骤:

  • 添加如果(if)控制器
    • 线程组 > 添加 > 逻辑控制器 > 如果 (if) 控制器
  • 编写Expression,${__jexl3("${__property(token,,)}"!= "")}

在这里插入图片描述

  • 或者,直接编写
    • 在这里插入图片描述

注意

  • 引用变量格式${name}需要被双引号""括起来
  • 两个等号==
  • 值需要被双引号括起来

​ “${__property(token,)}”!= “”

  • 文本框上的黄色感叹号,就是提示你,建议采用__jexl3 or __groovy 表达式,以提高性能,也就是默认的方式。

  • if 控制器 只能作用于其下的子项

    • 在这里插入图片描述

案例3

  • 定义3个登录的接口请求,使用“Evaluate for all children”控制哪些接口请求是否执行
  • ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传]在这里插入图片描述

实现

  • 创建用户定义的变量,添加变量name = test

    • 在这里插入图片描述
  • 创建if控制器,条件:“${name}”==“test”,选中“Evaluate for all children”

    • 在这里插入图片描述
  • 创建3个登录接口请求

  • 创建beanshell取样器:目的是修改变量"name"的值
    *

    • vars.put表示是设置变量name的值为"test_1"
  • 执行,查看结果
    *在这里插入图片描述

  • 因为选中了"Evaluate for all children",表示判断条件是否对所有的子节点执行,所以当执行BeanShell取样器后,变量name的值修改为test_1,并不是定义的test,所以第3个登录3请求并未执行

  • 如果取消选中,则不对所有的子节点执行,只需要验证第一次判断,成功则子节点所以请求都会执行,无论在些过程中,变量的值修改为什么

补充(判断条件):

  • == 等于,如 11 或 ${__jexl3(11,)}

  • > 、< 大于 小于,如 2>1,1<2,或 ${__jexl3(2>1,)}

  • >=、<= 大于等于 小于等于,如 2>=1 ,或 ${__jexl3(2>=1,)}

  • **!=、!**不等于,非,如 “y”!=“n”,非 则取 != 的反值

  • 多条件可用:|| 或,&& 和,如:2<5 && 2>1,${__jexl3(2<5 && 2>1,)}

1.2 事务控制器

作用

  • 可以用于测试执行嵌套测试元素所花费的总时间,即相当于用户进行一系列操作的测试

    • 值得注意的是,这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的
  • 只有整个事务控制器定义的事务成功,才算成功

  • 事务响应时间是我们衡量业务性能的主要指标,事务控制器可以把其节点下的取样器执行消耗时间累加在一起,便于我们统计。

在这里插入图片描述

事务控制器参数说明

  • 名称:事务控制器名称,可以随意设置,甚至可以为空。

  • 注释:可以随意设置,可以为空。

  • Generate Parent sample:
    是否生成父样本

    • 勾选后,所有的结果将在父结点中展示
      *在这里插入图片描述

    • 否则样本将作为独立样本生成。使用根据自己需求使用
      在这里插入图片描述

  • Include duration oftimer and pre-post processors in generated sample:
    是否在生成的样本中,包括计时器和前后处理程序的持续时间,默认值为false。一般不建议选择,因为选择会把一些额外时间算入总时间

    • 查看时间,可添加聚合报告,进行查看
      • 在这里插入图片描述
      • 查看聚合报告
        在这里插入图片描述

注意:

  • 事务下有多个取样器,其中一个取样器请求失败,这个事务就失败了
  • 性能测试过程中事务控制器使用较多,接口测试中使用较少

1.3 循环控制器

需求:

  • 测试购物车接口
  • 实现:添加多个商品到购物车

分析:

  • 添加购物车目的要实现去下订单,所以需要先登录
  • 在线程组,登录需要执行1次,添加购物车需要执行多次
  • 登录接口请求实现执行1次,可使用仅一次控制器
  • 添加购物车请求实现执行多次,可使用循环控制器

循环控制器:

  • 循环控制器可以控制在其节点下的元件的执行次数,该控制器下的取样器请求可以循环运行
  • 执行次数计算规则
    • 如果在线程组中也设置了执行次数,那么循环控制器下的元件的执行次数是:
      • 循环控制器下的元件的执行次数 = 线程组执行次数 * 循环控制器执行次数
      • 线程组设置执行 3 次,循环控制器设置执行 6 次,那么其下的元件执行次数为 3*6 = 18 次。

在这里插入图片描述

参数说明 :

  • 名称:循环控制器名称,可以随意设置,甚至可以为空。
  • 注释:可以随意设置,可以为空。
  • 循环次数:
    • 永远:是否设置为永久循环
      • 选中,那么控制器下的请求可一直运行;
    • 默认不勾选且循环次数为1
      • 填写具体的执行次数,在输入框中输入需要循环的次数,控制器下的请求即可循环运行

实现步骤:

  • 创建登录接口用例

  • 创建添加购物车接口用例,增加断言
    在这里插入图片描述

  • 在登录接口用例,增加仅一次控制器

在这里插入图片描述

  • 在添加购物车接口用例,增加循环控制器

    在这里插入图片描述

    • 想实现添加多个商品到购物车,需要使用参数化,使用csv配置

      • 添加csv

        • sku_id.txt文件内容

        • sku_id
          3
          4
          5
          6
          7
          8
          
        • 配置csv

          • 在这里插入图片描述
        • 修改断言

          • 在这里插入图片描述
  • 运行并查看结果

    • 配置循环控制器为永远

    • 添加察看结果树并运行

    • 查看结果

    在这里插入图片描述

1.4 While控制器

While 控制器:While 条件控制器,当/判断控制器,其节点下的元件将一直运行直到 While 条件为 false 。

While 控制器】 参数说明
1、名称:While 控制器名称,可以随意设置,甚至可以为空。

2、注释:可以随意设置,可以为空。

3、Condition(function or variable):
条件(函数或变量)
[填写:里面可填入判断依据的条件,接受变量表达式与变量]

Condition(function or variable)
1、Blank:空白,当循环中有取样器失败后停止。
2、LAST: 最后一个值,当循环前有取样器失败则不进入循环。
3、Otherwise: 否则,当判断条件为 false 时停止循环。
// 条件可以是任何变量或函数,最终等于字符串” 假 ”。
// 需要注意的是:条件是评估两次,一次取样前,一次随机取样

作用:循环执行控制器内所有采样器,直到条件为假时,停止循环

While 控制器,与开发语言中的While功能一致。直到条件为false时,停止运行

循环执行一个请求,仅判断一种状态下退出循环

Condition条件如下:

1:为空(不输入任何值) – 直到某次请求执行失败才退出循环

2:LAST – 直到最后一个请求请求失败才退出循环

3:其它 – 条件值等于"false"时,退出循环

4:Contion可以输入计算结果等于“false”的变量、函数。

例:${num} !=5判断变量num的值是否为5,等于5则退出循环 
${__javaScript("${num}"!=8 && "${num}"<"5",)},表示在${num}不等于8的情况下执行循环体,但是只能循环5次  

1、哪些条件会导致While Controller控制器跳出循环退出?

成功的sampler在前面 失败的sampler在后面 执行到fail会跳出循环
条件中的方法或者变量为false   Condition     ${BooleanValue}

条件不满足了  Condition     "${BooleanValue}"=="AAA"
这个控制器下的sampler执行结果失败

2、哪些条件会导致While Controller控制器下sampler一直循环执行?

Condition什么都不写(会一直循环执行 知道执行到有fail跳出循环)

失败的sampler在前面 成功的sampler在后面 这种情况会一直执行死循环

Condition写LAST(会一直循环执行 知道执行到有fail跳出循环)Condition     LAST

1. 为空:最后一个请求失败,停止循环;(如果不是最后一个请求执行失败,则继续循环)
2. LAST:
    1) 与为空相同之处:最后一个请求失败,停止循环;(如果不是最后一个请求执行失败,则继续循环)
    2) 与为空不同之处:测试计划在执行while控制器之前如果有请求失败,则不会执行while控制器
3. 表达式:表达式为false退出循环;
    例如:
        1) ${VAR}:当参数VAR的值被设置成false时退出循环
        2) ${__javascript(“${VAR}”==”User1”)}:当参数VAR的值部位User1时退出循环

1.5 ForEach控制器

作用:ForEach控制器一般和用户定义的变量一起使用,用于可以遍历读取相关的返回值。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值

https://blog.csdn.net/qq_36502272/article/details/88014742

作用:ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值(多个变量执行多次)

示例:1、创建不同权限的用户,账号用随机变量创建,类型0和1用自定义变量

输入变量前缀:在其中输入需要遍历的用户参数(User Parameter)

Start index for loop(exclusive):循环指数开始(唯一)→ 遍历查询的变量范围,开始的值(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)

End index for loop(inclusive):循环指数结束(包含)→ 遍历查询的变量范围,结束的值

输出变量名称:将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),然后就可以在控制器下的取样器使用,格式为${输出变量名}

Add””before number:输入变量名称中是否使用“”进行间隔

PS:这个控制器一般配合配置元件→ 正则表达式提取器来一起使用,可对页面上的某些元素进行重复处理。

示例:

1. ForEach控制器参数设置
2. 用户定义的变量书写格式(前缀+_+数字)

1. 输入前缀变量:输入要遍历变量前缀
2. Start index for loop(exclusive):遍历变量开始的索引(从0开始)
3. End index for loop(inclusive):遍历变量结束的索引(不包括结束索引)
4. 输出变量名称:定义要被引用的变量名称

注:foreach控制器通常和表达式提取器一起使用。表达式提取值应为-1,表示取全部值,然后sampler在foreach控制器下执行遍历

https://www.cnblogs.com/Zfc-Cjk/p/8466136.html

作用:指定循环控制器内取样器的执行次数

作用:指定其子节点运行的次数,可以使用具体的数值,也可以使用变量

1、Forever选项:勾选上这一项表示一直循环下去

2、如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘的结果。

1.6 Include控制器

1.7 Runtime控制器

1.8 临界部分控制器

1.9 交替控制器

作用:交替控制,该控制器包含的所有取样器,步骤交错执行在每个循环中;

1.10 仅一次控制器

作用:该控制器下取样器只执行1次

在测试计划执行期间,该控制器下的元件对每个线程只执行一次,登录场景经常会使用到这个控制器

在这里插入图片描述

1.11 录制控制器

1.12 简单控制器

https://blog.csdn.net/qq_36502272/article/details/88014742

作用:只做分组使用,犹如打隔断;
备注:

有多个简单控制器时,采样器按顺序执行

1.13 随机控制器

作用:随机执行其下的所某个请求

作用:随机执行其下的某个子结点,随机选择控制器中的请求进行执行

应用场景: 页面的随机访问

1.14 随机顺序控制器

作用:对控制器下所有采样器,随机产生1个执行顺序,进行执行

· 与Random Controller不同的是,这个控制器会先将需要随机的内容均执行一遍,但次序不定

· 应用场景: 页面的随机访问,但均需要访问,且次序不限

应用场景: 页面的随机访问

1.15 吞吐量控制器

1.16 Switch控制器

作用:通过给该控制器中的value赋值,来指定运行哪个取样器;

作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器。有两种赋值方式:

· 第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。

· 第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。

当Value为空时,默认执行第1个子节点元素。

1. Switch Value:为采样器名称;执行采样器名称相应的请求
2. Switch Value:为空;默认为执行第一个
3. Switch Value:为索引;第一个为0


1.什么都不填写:此时,执行第一个节点 
2.填写数字:填写N,则会执行这个控制器下面的第N+1个Sampler 
3.填写字符:会进行sampler名称字符串全匹配     填写     sampler名称全匹配

作用:控制其下的子节点的执行次数与负载比例,别被名字迷惑了,跟TPS RPS等等没关系。也有两种方式:

  • Total Executions:设置运行次数,整个测试计划中总计执行次数
  • Percent Executions:设置运行比例(1~100之间),整个测试计划中总计执行百分比
  • Throughtput: 设计的数值
  • Per User: 依据网上的说明在选择Total Executions时,勾选时会在每个线程中执行的次数。但在3.0版本中尝试使用无效

1.17 模块控制器

· 模块控制器,用于跳转到选定的控制器位置并执行对应的控制器

· 应用场景: 业务逻辑的跳转

· 配制说明

· Module to Run: 选择需要跳转到的目标控制器


六、Critical Section Controller【临界部分控制器】


临界部分控制器:
1、确保它的子元素(取样器/控制器等)在执行控制器的子程序之前,只执行一个线程作为指定的锁。
2、确保其子节点下的取样器或控制器将被执行(只有一个线程作为一个锁)。
 
// ************************* 【临界部分控制器】 参数说明 ************************* //
1、名称:临界部分控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、Lock name:锁名
最好作为唯一值,这里可以填入其子节点下执行的线程的名称,这个线程作为一个全局锁存在
[默认填写:global_lock(全局锁)]
七、ForEach Controller 【ForEach 控制器】


ForEach 控制器:
1、即遍历循环控制器,顾名思义是定义一个循环规则。
2、用来遍历当前元素的所有可执行场景。
3、在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
4、这个控制器一般配合配置元件 → 正则表达式提取器来一起使用,可对页面上的某些元素进行重复处理。
 
// ************************* 【ForEach 控制器】 参数说明 ************************* //
1、名称:While 控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、输入变量前缀:
(1)在其中输入需要遍历的用户参数
(2)可以在"用户自定义的变量"中定义一组变量,ForEach 控制器可以从中获取到变量对应的值,
然后作为 ForEach 控制器的循环条件,还可以输出变量作为取样器的参数。
 
4、开始循环字段(不包含): 循环变量下标起点。
循环指数开始(唯一)→ 遍历查询的变量范围,开始的值
(这里如果不填写,默认从 1 开始,如果没有 1 开始的变量,执行时会报错)
 
5、结束循环字段(包含): 循环变量下标终点。 
循环指数结束(包含)→ 遍历查询的变量范围,结束的值
 
6、输出变量名称:ForEach 控制器生成的变量名称。
将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),然后就可以在控制器下的取样器使用,
格式为:${输出变量名}
 
7、Add "_" before number?: 
输入变量名称中,变量前缀后是否加 "_" 作为分隔符?
[默认勾选:是;不勾选:否]
八、Include Controller【Include 控制器】


Include 控制器:
1、包含控制器,用于引用外部的Jmx文件、导入外部的测试片段(非完整的测试计划);
从而控制多个测试计划组合,在执行时会执行导入的测试计划。
2、但是被导入的测试计划有特殊要求,它不能有线程组,只能包含简单控制器及控制器下的元件。
3、简单点说就是相当于加了一个执行单元,一个封装了的业务操作单元,类似我们程序开发中的函数一样。
4、比如一个查询订单的业务操作我们用取样器来模拟,然后放到简单控制器中作为一个执行单元,
别的地方也要用到时,我们可以不重写直接引用过来,这就类似我们 Java 开发中的方法封装。
 
// ************************* 【Include 控制器】 参数说明 ************************* //
1、名称:Include 控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、文件名:必输字段,如果没有则会报错。
包含测试计划的文件名,可以点击浏览,从文件夹保存的 JMX 文件夹目录下选择对应的 JMX 文件。
 
 
// ************************* 【Include 控制器】 使用方法 ************************* //
1、创建一个测试计划,下面可添加取样器/控制器等,然后保存测试计划,为了方便起见, 
线程组也可以添加外部JMX文件中用于调试;
 
2、如果测试使用Cookie或用户定义的变量,这些应放置在顶层(包括文件),否则无法正常工作;
此元素不支持变量/函数在文件名字段中;但是,如果属于包含控制器定义的内容,则使用前缀路径名。
 
3、当使用包含控制器中包含相同的JMX文件,则要确保文件名不同,以避免无法读取;
如果文件不能被发现,那么控制器会尝试打开文件名相对于JMX启动目录。
九、Interleave Controller【交替控制器】


交替控制器:交替控制器,其节点下的取样器会交替执行,使得该控制器包含的取样器步骤交错执行在每个循环中
 
// ************************* 【交替控制器】 参数说明 ************************* //
1、名称:交替控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、忽略资控制器块:jmeter 汉化错别字,应为——忽略子控制器模块
忽略子控制器,即子控制器失效,由交替控制器接管。
[勾选:如果勾选此项,交替控制器将子控制器像单一请求元素一样,一次只允许一个请求/控制器;
默认不勾选:否]
 
4、Interleave across threads:是否跨线程交错
[勾选:是;默认不勾选:否]
 
// ************************* 【交替控制器】 使用方法 ************************* //
假使该控制器下有2个取样器 A 和 B ,交替执行 A 和 B 2个请求,即每次传递一个子请求到这个测试,按子元件的排列顺序。
十、Once Only Controller【仅一次控制器】


仅一次控制器:
1、在多线程循环的时候,将使其子节点下的取样器请求只运行一次。
2、也就是此控制器下的子元件只运行一次,即使把仅一次控制器放在循环控制器下面,也只是运行一次。
3、我们在模拟请求时有时只需要登录一次,就可以把登录的部分放在仅一次控制器下。
 
// ************************* 【仅一次控制器】 参数说明 ************************* //
1、名称:仅一次控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
十一、Random Controller【随机控制器】


随机控制器:
1、类似交替控制器,但该控制器随机选取某一个取样器请求并执行。
2、随机控制器节点下的元件随机运行,与交替控制器不一样的是节点下的元件运行顺序不定。
 
// ************************* 【随机控制器】 参数说明 ************************* //
1、名称:随机控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、忽略资控制器块:jmeter 汉化错别字,应为——忽略子控制器模块
忽略子控制器,即子控制器失效,由随机控制器接管。
[勾选:如果勾选此项,随机控制器将子控制器像单一请求元素一样,一次只允许一个请求/控制器;
默认不勾选:否]
十二、Random Order Controller【随机顺序控制器】


随机顺序控制器:
1、类似于简单控制器,将执行每个子节点下的取样器请求一次,但是执行是随机的。
2、其节点下的元件随机执行,不过每个元件只执行一次。
 
// ************************* 【随机顺序控制器】 参数说明 ************************* //
1、名称:随机顺序控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
十三、Recording Controller【录制控制器】


录制控制器:
1、顾名思义是录制的时候用到的,类似代理服务器的作用,在测试执行期间记录测试样本。
2、实际上它是一个位置,当我们用 JMeter 代理进行录制时,录制的脚本默认放在此控制器的节点下面。
3、没有实际的逻辑作用,我们用简单控制器也可以代替它。
 
// ************************* 【录制控制器】 参数说明 ************************* //
1、名称:录制控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、Clear all the recorded samples:清除所有记录的样本
[点击可以清除所有已经记录的测试样本]
十四、Runtime Controller【Runtime 控制器】


Runtime 控制器:生命周期/运行周期控制器,用来控制其子元件的执行时长,时长的单位是秒。
 
// ************************* 【Runtime 控制器】 参数说明 ************************* //
1、名称:Runtime 控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、Runtime (seconds): 执行时长(运行时间)
[默认为 1 ;去掉 1 则默认为 0 ,此时不执行其节点下的元件;其他自定义修改数字。]
十五、Simple Controller【简单控制器】


简单控制器:
1、用来指定了一个执行单元,它不改变元件的执行顺序。
2、在简单控制器下面还可以嵌套其他控制器。
3、简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操作。
 
// ************************* 【简单控制器】 参数说明 ************************* //
1、名称:简单控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
十六、jp@gc - Parameterized Controller


jp@gc - Parameterized Controller:
1、jp@gc - 参数化控制器,可以通过JMeter插件来监控服务器CPU、内存、磁盘、网络等相关资源。
2、安装服务器监控插件后,此控制器才会出现:
其中 JMeterPlugins-Standard 和 JMeterPlugins-Extras 是客户端的,ServerAgent 是服务端的。
 
// ****************** 【jp@gc - Parameterized Controller】 参数说明 ****************** //
1、名称:jp@gc - Parameterized Controller名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。 
 
3、Help on this plugin :关于此插件的帮助
[点击查看官方说明文档]
 
4、用户定义的变量
(1)名称:用户定义的所有变量的总名称,可以随意设置,甚至可以为空。 
(2)注释:可以随意设置,可以为空。 
(3)列表:
● 名称:用户定义的变量名
● 值:用户定义的变量值
● Description:描述
[按钮:详细、添加、从剪切板添加、删除、向下、向上]
十七、Throughput Controller【吞吐量控制器】


吞吐量控制器:
1、应该译为:流量控制器,jmeter自带的翻译这里是错误的,因为它并不能控制吞吐量。
2、吞吐量控制器,用来控制其下元件的执行次数,并无控制吞吐量的功能,
其实质作用是允许用户控制执行的频率。
3、想要控制吞吐量可以使用定时器: Constant Throughput Timer 。
4、吞吐量控制器有两种模式: Total Executions 与 Percent Executions 。
 
// ************************* 【吞吐量控制器】 参数说明 ************************* //
1、名称:吞吐量控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。
 
3、下拉框:吞吐量控制器模式二选一
(1)Percent Executions [默认]:执行百分比
● 使控制器按一定比例执行迭代的测试计划
● 按执行次数的百分比来计算执行次数,此时“吞吐量”取值是 0~100 。
(2)Total Executions:总执行次数
● 使控制器停止执行一定数量的测试计划
● 按 Throughput 的值来指定执行次数,此时“吞吐量”可以是任意整数,如果小于等于零则一次也不执行。
 
4、吞吐量:流量
(1)Percent Executions 模式下:执行百分比,取值是 0~100
(2)Total Executions 模式下:总执行次数,任意整数
 
5、Per User:是否所有虚拟用户
(1)Percent Executions 模式下:Per User 是否勾选对此模式无影响。
(2)Total Executions 模式下:此时 Per User 与 Total Executions一起来影响执行次数。
[勾选:是,按虚拟用户数来计算执行次数;默认不勾选:否,按所有虚拟用户来计算执行次数]
十八、Module Controller【模块控制器】


模块控制器:可以通过模块控制器在当前测试计划中引入新的测试片段(也可以叫脚本片段,由控制器、
取样器及辅助元件构成,能够完成负载的模拟)。
 
// ************************* 【模块控制器】 参数说明 ************************* //
1、名称:模块控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。
 
3、Find target element:查找目标元素
寻找测试计划中需要特定测试的元素、模块,也可理解为该控制器可以控制已经封装好的模块元素
[点击此按钮,再点击 “Module To Run” 下的原件,模块控制器会直接切换跳转到该元件。
不点击此按钮,点击 “Module To Run” 下的原件,依旧停留在模块控制器。]
 
4、Module To Run: 模块运行下拉列表
列出了测试计划及工作台包含的控制器,在此选择需要引入其中的一个脚本片段。
 
 
// *************************** 【模块控制器】 作用 *************************** //
● 一个测试计划由一个控制器和所有的测试元素(取样器等)组成,测试计划可以位于任何线程组或工作台;
如果计划位于线程组,则可以禁用其他控制器,防止正在运行的测试计划被影响(除了模块控制器)
 
● 模块控制器的优势在于:当存在多个线程组时,该控制器可以轻松切换,只需要选择对应的取样器,
方便快捷,替代了创建很多测试计划的繁琐操作
 
● 任何一个模块所用的控制器名字必须唯一,因为其名字被用来找到目标控制器时重新加载;
出于这个原因,最好保证控制器名字不同,否则执行测试时候可能发生意外
 
● 模块控制器与远程测试不应使用或非gui测试与工作台部件,因为工作台测试元素并没有测试计划的
一部分 jmx 文件,任何这样的测试就会失败。
十九、Switch Controller【Switch 控制器】


Switch 控制器:
1、Switch 条件控制器,转换控制器,类似于高级语言中的 Switch 逻辑控制语句,
通过给该控制器中的 value 赋值,来指定运行哪个取样器(也可以理解为开关控制器)。
2、例如指定运行的取样器编号为 0 (JMeter 会给节点下的取样器顺序编号,第一个取样器 "Java 请求"编号为 0 ,
第二个取样器"Java 请求 2" 的编号就是 1 ,所以这里指定 0 就会运行第一个 Java 请求)。
3、如果指定的编号超出了下面的节点数或者不指定,则运行第 0 个取样器。
4、也可以指定取样器的名称,名称匹配时大小写及空格都敏感,如果匹配不上则不运行取样器。
 
// ************************* 【Switch 控制器】 参数说明 ************************* //
1、名称:Switch 控制器名称,可以随意设置,甚至可以为空。 
 
2、注释:可以随意设置,可以为空。
 
3、Switch Value:控制器具体赋值的 value 值字段
(1)第一种是数值:Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
(2)第二种是字符:直接指定子元素的名称,比如取样器名称来进行匹配。
● 当指定的名称不存在时,不执行任何元素。
● 当 Value 为空时,默认执行第 1 个子节点元素。
 

作用:条件成真,则执行控制器下所有取样器,根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断

判断if控制器里面的语句是否为真,如果为真继续执行

示例:

1. 条件:"${name}"=="百度"
2. 注意:
    1) 引用变量格式${name}需要被双引号括起来
    2) 两个等号
    3) 值需要被双引号括起来
    
1.Interpret Condition as Variable Expression?:这个选项勾选了之后,条件中,如果写“${a}" == "${b}”(及时变量a和变量b的值相等,也不会执行)。这个地方,就必须要填写一个返回True的表达式,比如${JMeterThread.last_sample_ok},这样的表达式。

2.Evaluate for all children:假如这个控制器下面,有3个HTTP请求。如果需要在执行每个HTTP请求前,进行判断是否满足控制器中的条件,则需要勾选该复选框。
 

debug Sampler  响应数据  JMeterThread.last_sample_ok=true

条件设置为${JMeterThread.last_sample_ok},这是判断boolean类型,true执行,false不执行

3. Jmeter分布式运行

在这里插入图片描述

分布式测试原理

1. 一台电脑作为控制机(Controller),其它电脑做为执行机(Agent);
2. 执行时,控制机会把脚本发送到每台执行机上,执行机拿到脚本后就开始执行
3. 执行机执行时不需要启动Jmeter界面,可以理解它是通过命令行模式执行的
4. 执行完成后,执行机会把结果回传给控制机,控制机会收集所有执行机的信息并汇总

分布式运行实现步骤

  • 控制机jmeter.properties设置

    • 本机mac系统
      • 修改apache-jmeter\bin目录里的jmeter.properties文件
      • 在260行新增remote_hosts配置,配置里配置的是执行机的ip和jmeter的端口号。
  • 执行机jmeter.properties设置

    • 虚拟机CentOS系统

      • 安装JDK和本机相同的Jmeter

      • 配置环境变量

        • vim /etc/profile
      • #java环境变量
        export JAVA_HOME=/software/jdk1.8.0_131/
        export PATH=$JAVA_HOME/bin:$PATH
        export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
        
        #jmeter环境变量
        export JMETER_HOME=/software/apache-jmeter-5.1.1
        export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
        export PATH=$JMETER_HOME/bin/:$PATH
        
      • 修改jmeter部分配置

        • 打开/ apache-jmeter/bin目录

        • 修改jmeter.properties文件

        • remote_hosts=192.168.0.132  #ip是这台slave主机的ip
          server_port=1098 #端口号是jmeter自定义的端口号,默认是1099
          server.rmi.localport=1098
          server.rmi.ssl.disable = true  #否则远程执行,会报一个ssl错误
          
          
      • 备注:该remote_hosts和server_port配置需要和本地master的jmeter.properties文件里新增的260行配置一致。

        • #防止响应回来的数据有中文乱码

        • jmeter.save.saveservice.response_data=true  jmeter.save.saveservice.samplerData=true
          
      • 修改jmeter-server文件

        • 配置这台slave主机的ip
          • RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.0.132
  • 执行机启动分布式监听服务程序

    • jmeter-server
  • 执行测试

    • 本地远程连接slave主机上的jmeter,并执行脚本(有两种启动方式)
    • 在这里插入图片描述

注意

  • windows和linux上的jmeter的版本一致会比较好,将windows和linux上的防火墙都关闭。

  • 解决jmeter进行分布式测试,远程机器来运行脚本,在察看结果树中的响应数据项为空白

    • 第一步:打开主控机的jmeter–bin目录下的jmeter.properties文件
    • 第二步:查找到mode=Standard 项
    • 第三步:将其前边的注释去掉,然后保存重启jmeter,再次运行远程机器,就可以看到数据了
  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值