jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同。
jmeter的test plan通过图形化的方式表达脚本,域代码方式的脚本不同,图形方式表达的脚本中无法使用变量和函数等描述元件的作用域,因此jmeter主要依靠test plan中元件的相对位置、
父子关系以及元件本身的类型来决定test plan中各元件的执行顺序;原件在test plan中的位置不同,可能导致该元件的行为有很大差异。(新版jmeter都可以自主选择语言,对号入座即可)
1、元件的作用域
jmeter中共有8类可被执行的元件(test plan和thread group不属于元件),其中,sampler(取样器)是不与其他元件发生交互的作用的元件,Logic Controller
(逻辑控制器)只对其子节点的sampler有效,而其他元件需要与sampler等元件交互。
Config Elements(配置元件):影响其范围内的所有元件
Pre-porcessors(前置处理器):在其作用范围内的每一个sampler元件之前执行
Timer(定时器):对其作用范围内的每一个sampler有效
Post-porcessors(后置处理器):在其作用范围内的每一个sampler元件之后执行
Assirtions(断言):对其作用范围内的每一个sampler元件执行后的结果执行校验
Listener(监听器):收集其作用范围内的每一个sampler元件的信息并且呈现出来
在jmeter中,元件的作用域是靠test plan的树形结构中元件的父子关系来确定的,其原则如下:
1) sampler不与其他元件相互作用,因此不存在作用域问题
2) Logic Controller只对其子节点中的sampler和Logic Controller作用
3) 除sampler和Logic Controller外的其他元件,如果是某个sampler的子节点,则该元件仅对其父节点作用
4) 除sampler和Logic Controller外的其他元件,如果其父节点不是sampler,则其作用域是该元件父节点下的其他所有后带节点(包括子节点,子节点的子节点等)
2、元件的执行顺序
在同一作用域范围内,test plan中的元件按照以下顺序执行:
1) Config Elements
2) Pre-porcessors
3) Timer
4) Sampler
5) Post-porcessors(除非Sampler得到的返回结果为空)
6) Assirtions(除非Sampler得到的返回结果为空)
7) Listener(除非Sampler得到的返回结果为空)
注意:Pre-porcessors、Post-porcessors和Assirtions等元件仅对Sampler作用,如在它们作用域内没有任何Sampler,则不会被执行;
如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在test plan中的上下顺序依次执行。
我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器 是典型的不与其它元件发生交互作用的元件,逻辑控制器 只对其子节点的取样器有效,而其它元件(config elements 、timers 、post-processors、assertions、listeners)需要与取样器(sampler)等元件交互。
- 配置元件(config elements)
元件会影响其作用范围内的所有元件。
- 前置处理程序(Per-processors)
元件在其作用范围内的每一个sampler元件之前执行。
- 定时器(timers )
元件对其作用范围内的每一个sampler有效。
- 后置处理程序(Post-processors)
元件在其作用范围内的每一个sampler元件之后执行。
- 断言(Assertions)
元件对其作用范围内的每一个sampler元件执行后的结果执行校验。
- 监听器(Listeners)
元件收集其作用范围的每一个sampler元件的信息并呈现。
在JMeter中,元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:
-
取样器(sampler)元件不和其它元件相互作用,因此不存在作用域的问题。
-
逻辑控制器(Logic Controller)元件只对其子节点中的取样器 和 逻辑控制器作用。
-
除取样器和逻辑控制器元件外,其他6类元件,如果是某个sampler的子节点,则该元件会对其父子节点起作用。
-
除取样器和逻辑控制器元件外,其他6类元件,如果其父节点不是sampler ,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。
讲了这些,你可能迷糊了,到底是肿么个情况呀!?通过两个栗子(例子)来理解一下他们的作用域。
例一
注:下图只是为了说明作用域,无法正常运行。
取样器: HTTP请求 、FTP请求 、TCP取样器;逻辑控制器: 循环控制器;监听器: 图形结果、聚合报告。
-
HTTP请求、FTP请求、TCP取样器 元件没有作用域的概念。
-
循环控制器 元件作用域是其子节点FTP请求 、TCP取样器 。
-
图形结果 元件的作用域是FTP请求 、TCP取样器。
-
聚合报告 元作的作用域是HTTP请求 、FTP请求 、TCP取样器。
例二
注:下图只是为了说明作用域,无法正常运行。
这个例子稍微复杂一些,包含的元件较多。先来分分类。
取样器: HTTP请求 、FTP请求 、TCP取样器、 JDBC Request ;逻辑控制器: 循环控制器、随机控制器;定时器:定时器、Uniform Random Timer ;断言: 响应断言、XML断言;监听器: 图形结果、聚合报告。
根据作用域原则,这些元件的作用域分别为:
-
HTTP请求 、FTP请求 、TCP取样器、 JDBC Request 元件没有作用域名概念。
-
循环控制器 的作用域为 FTP请求 、TCP取样器和 随机控制器。
-
固定定时器 作用于 HTTP请求 、 Uniform Random Timer 作用于所有取样器。
-
响应断言 作用于JDBC Request 、 XML断言作用于FTP请求 、TCP取样和JDBC Request。
-
图形结果 作用于FTP请求 、TCP取样和JDBC Request 、聚合报告作用于所有取样器。
其实,通过上面的分析,并没有你想象的那么复杂,我们从各个元件的层次结构就可以判断每个元件的作用域。
Jmeter中的逻辑控制器(Config Elements)在其作用范围内的行为与其他元件相比稍有不同。逻辑控制器元件分两大类: 默认配置(HTTP默认请求、FTP默认请求等)和 管理(HTTP 头管理、HTTP cookie 管理等)。
其中默认配置(Configuration Defaults)元件中设置的值可以在作用域内叠加,例如,在一个测试计划中添加两个HTTP 默认请求,其中第一个默认设置 Server name or IP 为www.google.com ,第二个默认设置Path 为/page-not-exist, 则在这两个元件作用域内的所有HTTP 默认请求,其默认的Server name or IP 和Path 均为Server name or IP 和 /page-not-exist 。(你有一个故事,我有一个笑话,我们一交换,两个人都分别拥有了一个故事加一个笑话。)
管理(Manager)类逻辑控制器元件的效果则不能进行叠加。如果两个或两个以上相同的管理类元件作用域有重叠。则在重叠 作用域内的取样器元件只会随机受到其中一个的作用,这样会导致取样器行为的不确定性。因此,在使用管理类逻辑控制器时, 一定要注意保证相同的管理类元件的作用域不发生重叠。
元件的执行顺序
了解了元件有作用域之后,来看看元件的执行顺序,元件执行顺序的规则很简单,在同一作用域名范围内,测试计划中的元件按照如下顺序执行。
(1)配置元件(config elements )
(2)前置处理程序(Per-processors)
(3)定时器(timers )
(4)取样器(Sampler)
(5)后置处理程序(Post-processors)(除非Sampler 得到的返回结果为空)。
(6)断言(Assertions)(除非Sampler 得到的返回结果为空)。
(7)监听器(Listeners)(除非Sampler 得到的返回结果为空)。
关于执行顺序,有两点需要注意:
-
前置处理器、后置处理器和断言等元件只能对 取样器起作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
-
如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。