本章节主要讲解"JMeter执行顺序与作用域"的内容,类似于运算符或操作符的优先级,当JMeter测试中包含多个不同的元素时,哪些元素先执行,哪些元素后执行,并不是严格按照它们出现的先后顺序依次有序执行的,而是会遵循一定的内部规则,我们称之为JMeter元素的执行顺序。
一.执行顺序
一般情况下JMeter元素按照如下顺序依次执行:
-
0、 配置元件(Config Element)
-
1、前置处理器(Pre Processors)
-
2、定时器(Timer)
-
3、取样器(Sampler)
-
4、后置处理器(Post Processors)
-
5、断言(Assertions)
-
6、监听器(Listener)
-
注意,只有取样器结果不为空的情况下才会执行4、5、6。
一个简单的例子:


二.组件作用域
1、JMeter测试树元素分类
- 在JMeter的GUI界面,测试计划就是一颗树,Test Plan是树的根节点,其他元素都是其子孙从作用域的角度来看,测试树中的元素可以分为两大类:
01、具有层次结构的元素
- 这类元素的作用域与其所处的层次有关.
- 这类元素包括:配置元件,前置处理器,定时器,后置处理器,断言,监听器这6大组件.
02、具有顺序结构的元素
- 这类元素一般严格按照其出现的先后顺序依次有序的执行.
- 这类元素不会对其他元素的功能有影响,只是起控制作用,没有作用域的概念.这类元素包括取样器与逻辑控制器.
另外,还有剩下的线程组比较特殊,线程组也不会影响其他元素的功能,但是线程组的执行顺序是可以配置的,若测试计划下包含多个线程组,默认是并行执行的,若要按照其出现的顺序依次执行,需要在测试计划下勾选"Run Thread Groups consecutively (i.e. one at a time)".
2、作用域
- JMeter组件作用域指的是JMeter组件(配置元件,前置处理器,定时器,后置处理器,断言,监听器)起作用的范围,在此范围内组件是有效的,可以影响取样器的行为.
- 从前面的内容可以看出,JMeter作用域是针对组件而言的,只有层次结构的组件才有作用域的概念.
3、JMeter组件作用域规则
- 按照组件的父节点不同,组件的作用域有如下类型:
(1)取样器作用域
- 父节点为取样器的组件具有的作用域,仅对该取样器起作用;
(2)逻辑控制器作用域
- 父节点为逻辑控制器的组件具有的作用域,对该逻辑控制器下的所有取样器起作用;
(3)线程组作用域
- 父节点为线程组的组件具有的作用域,对该线程组下的所有取样器起作用;
(4)测试计划作用域
- 父节点为测试计划的组件具有的作用域,对测试计划下的所有取样器起作用
特殊情况
1.配置元件(Config Elemnet)-->用户自定义变量组件(User Defined Variables):这个组件不管放在哪个位置,它定义的变量都会被整个线程组所共享。这个变量具有全局属性。因为属于配置元件,无论在哪里配置,脚本启动时总会第一个执行并只执行一次,只初始化一次;
2.jmeter beanshell vars.put 变量作用域 :局部变量,执行线程所有当前和未执行的取样器都可以访问。
jmeter变量可见性
jmeter中变量可见性只有两种 全局(所有线程组),局部(当前线程组);
这取决于变量声明位置,如果在线程组外部声明属于全局变量,在线程组内部任何位置声明属于局部变量(从声明位置到后续所有未执行的取样器都可访问,与声明层级无关);
局部变量转全局变量:{__setProperty(global_token, {token})}
使用转换得来的全局变量:${__property(token)}
用户定义的变量与用户参数区别
1.jmeter 中所有变量可见性至少是线程组级别的,所有变量至少是线程组内共用;用户定义的变量(配置元件)只运行一次赋值(初始化)操作;用户参数(前置处理器)根据其作用域,在元件作用域内的取样器每次运行前都执行一次赋值(初始化)操作,不在作用域内的取样器只可以使用不会执行初始化操作;用户定义的变量具有并发属性,也就是多线程并行不会创建变量副本,一个线程修改另一个线程也受影响;用户参数无并发属性,多线程并行会创建多个副本,一个线程修改不会影响另一个线程;
补充
-
前一个组件定义的变量,在后续所有组件的执行过程中有效
-
变量分为线程变量、线程组变量、全局共享变量
A:线程变量的修改一般只对本线程有效,只会影响本线程的下一次迭代,不会跨线程(重点)
B:线程组变量的修改会对整个线程组生效,在线程组内跨线程
(比如像 csv 配置元件中的线程组共享)
C:全局的变量的修改会对所有线程组生效
(比如像 csv 配置元件中的全局共享,全局 Counter 计数器等)
- 变量的定义尽量往外层放置,最好不要放置在业务逻辑中,理解起来比较反常 (动态变量除外)