学了元件作用域,我终于对JMeter开窍了
引子
先看一下这个例子,测试计划“进入考场”下面有一个线程组,线程组下面有 3 个 HTTP 请求,分别是学生登录、考场 token和进入房间:

它们的处理逻辑是:
学生登录后,在响应中返回了登录后的 token,使用正则表达式提取器,提取登录 token
在登录以后,把登录 token 作为 header,去请求“考场token”这个接口,请求后的响应中,返回了考场 token,使用正则表达式提取,下图是“考场token”请求的 header,使用了 HTTP Header 管理器:

拿到考场 token 以后,把考场 token 作为 header,去请求“进入房间”接口,下图是“进入房间”请求的 header,Value定义的是 ${exam_token},就是考场 token,这个 token 是从第 2 个请求“考场token”的响应中,使用正则表达式提取出来的:

回顾一下,首先登陆,登陆后获取token,然后再获取考场token,最后进入房间。这个例子的问题就在于,第 2 个请求和第 3 个请求,都设置了 header,这 2 个 HTTP Header Manager 能按我们想的去工作吗?
运行顺序与作用域
运行顺序
先了解一下 JMeter 元件的运行顺序。JMeter 根据 2 个维度来决定元件的运行顺序,第 1 个维度是从上往下,第 2 个维度是元件类型。
从上往下,指的是从根节点->父节点->子节点->叶子节点。
元件类型,分为 3 类:
- 线程组、逻辑控制器。
- 取样器。
- 配置元件、前置处理器、定时器、后置处理器、断言、监听器。
最后这六个元件类型,都是为取样器服务的。它们的运行顺序如下:
配置元件(如果存在)
前置处理器(如果存在)
定时器(如果存在)
取样器(如果存在)
后置处理器(如果存在且取样器的结果不为空)
断言(如果存在且取样器的结果不为空)
监听器(如果存在且取样器的结果不为空)
我总结一下加强理解。假设我们新建了 1 个线程,想用这个线程去发请求。
首先是初始化配置,比如参数化、设置 Header、Cookie 等,配置元件。
接着可能需要给线程加点参数,比如用户参数,会用到前置处理器。
然后在发送请求前可能会等待一段时间,添加定时器。
准备好以后,就可以发送请求了,也就是取样器。
如果取样器什么数据也没有返回,那么就可以直接退出了。
如果返回了数据,使用后置处理器,比如正则表达式提取器,提取想要的数据。
提取之后还有要做验证,断言一把。
测试运行的怎么样呢,用监听器看一看。
示例
再结合示例感受一下,请看以下测试计划,添加了 1 个 线程组,包含 3 个 取样器(HTTP Request 1 2 3):

JMeter 会按以下步骤运行:
- 线程组(如果有多个线程组可以在测试计划设置是顺序执行还是同时执行)
- 简单控制器(父节点)
- HTTP Cookie 管理器(配置元件)
- 用户参数(前置处理器)
- Synchronizing Timer(定时器)
- HTTP 请求 1(取样器)
- 正则表达式提取器(后置处理器)
- 响应断言(断言)
- HTTP Cookie 管理器(配置元件)
- 用户参数(前置处理器)
- Synchronizing Timer(定时器)
- HTTP 请求 2(取样器)
- 正则表达式提取器(后置处理器)
- 响应断言(断言)
- HTTP 请求 3(取样器)
- 察看结果树(严格来讲是与第 6 步并行,也就是取样器之后)
作用域
第 9 ~ 14 步我用黑色斜体加粗了,因为从图中的位置来看,“HTTP 请求 2”,前后并没有元件,但是也被作用上了。
这是因为它们具有相同的作用域,在 JMeter 中,同一层级的元件具有相同的作用域。
示例中,添加了一个简单控制器,然后在下级添加了配置元件、前置处理器、定时器、后置处理器、断言,和 2 个取样器(HTTP Request 1 2 )。
简单控制器是一个执行单元,本身没有内容,它的作用是把元件进行分组运行:

所以简单控制器下面的这些同级元件,作用域相同,既会作用于 HTTP Request 1,也会作用于 HTTP Request 2。
配置元件、前置处理器、定时器、后置处理器、断言、监听器,这六个元件类型,会作用到范围内的所有取样器。
层级
在 JMeter 中,上级的作用域包含下级的作用域。
但是下级是不能作用到上级的。
比如示例中的 HTTP Request 3,和简单控制器是平级,那么简单控制器下级的元件,是不会作用到 HTTP Request 3 的。
使用建议
再看看开头的例子:

有 3 个取样器,用户自定义变量和 CSV Data Set Config,都是配置元件,跟取样器同级,会同时作用到这 3 个取样器上面。
HTTP Header Manager 也是配置元件,不会作用到学生登录取样器,因为根据从上往下的维度,它们都位于学生登录取样器之后。
图中有 2 个 HTTP Header Manager,你可能会认为它们会分别执行,实际上它们会一起执行!
在同一执行单元中,如果相同类型的元件有多个,会被当做一个一起执行。
我把第 2 个 HTTP Header Manager 稍微改了一下,可以看得很明显:

考场token的请求,在目录树中是第 2 个,但是从结果来看,它的 header,被添加上了我在后面第 3 个请求设置的 header了。
这个结果显然不是想要的。
所以为了避免混乱,建议在使用 JMeter 添加元件的时候,一是根据先后顺序,从上往下合理的放置元件的顺序。二是对于配置元件、前置处理器、定时器、后置处理器、断言这六类元件,因为它们都是为取样器服务的,如果只想作用于单个取样器,最好是放在这个取样器的下级,以避免由于同一作用域相互作用,导致意想不到的结果。
这个例子把 HTTP Header Manager 分别放到各自的取样器下级,就能按设想运行起来了:

简要回顾
本文首先引入了我工作中碰到的问题,接着结合示例讲解了运行顺序、作用域和层级,搞懂了 JMeter 目录树是怎么运行的,最后回到开头的例子进行了结果分析,给出了在使用时的两条建议。
学了元件作用域,我终于对JMeter开窍了的更多相关文章
- Jmeter入门--元件作用域和执行顺序
一.元件作用域 8类可被执行的元件(测试计划于线程组不属于可执行元件),这些元件中,取样器(Sampler)是典型的不与其他元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其他元件(配置 ...
- 性能测试工具Jmeter06-Jmeter元件作用域和执行顺序
元件作用域 8类可被执行的元件(测试计划与线程组不属于可执行元件),这些元件中,取样器(sampler)是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(配置元件 ...
- JMeter元件作用域实践指南
从一个问题说起 对于以下测试脚本: 为了能调用进入房间接口,需要从考场接口获取考场token.为了调用考场接口,需要从登陆接口获取登陆token.元件说明如下: 学生登录,提取登录${token}传入 ...
- Jmeter元件作用域
转载自飞测团队
- JMeter配置元件作用域
- JMeter基础【第三篇】JMeter5.1元件作用域及执行顺序
执行顺序,大家可以实践验证,加深印象. 最后,给大家说一个万能且保险的方法:放到对应的取样器下面即可.
- iOS边练边学--static(作用域),copy(深浅拷贝)
一.static作用 二.copy
- Jmeter的简单介绍
Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件 ...
- Jmeter介绍以及脚本制作与调试
目录 Jmeter介绍 Jmeter安装 Jmeter主要测试组件 Jmeter元件作用域与执行顺序 Jmeter运行原理 Jmeter脚本制作 Jmeter脚本调试 Jmeter介绍 Jmeter ...
随机推荐
- 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼
本文基于JDK-8u261源码分析 1 简介 ArrayList作为最基础的集合类,其底层是使用一个动态数组来实现的,这里"动态"的意思是可以动态扩容(虽然ArrayList可 ...
- mysql笔记--基础知识
SQL基础 SQL语句的分类: DQL: 数据库查询语句,基本的就是select查询命令,用于查询数据 DML: 数据操纵语句,用于插入,更新,删除数据,即INSERT, UPDATE,DELETE ...
- Linux下安装ZooKeeper-3.5.6
下载 官网下载地址是https://www.apache.org/dyn/closer.cgi/zookeeper,下载apache-zookeeper-3.5.6-bin.tar.gz. sta ...
- (转载)什么是B+树?
本文转载自网络. 如有侵权,请联系处理!
- 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)
一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...
- sublime text3配置Python2、Python3的编译环境
由于Python2.Python3使用量都很高,Python3虽然是未来趋势,但是目前个别库还是只支持Python2.所以,很多人会选择在电脑上安装两个版本的Python,那么使用sublime执行代 ...
- C/C++的二分查找
假设有一种温度传感器,已经测得它的电压和温度的对应关系,将电压值以ADC转换后的数字量的值表示,形成温度-AD值的对照表,如下. 大致成一条反比关系的曲线. ADC的底层驱动已经写好,对外有一个接口可 ...
- C#实现——十大排序算法之选择排序
选择排序法 1.工作原理(算法思路) 给定一个待排序数组,找到数组中最小的那个元素 如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换 在剩下的元素中,重复1.2过程,直到排序完成. 2. ...
- tmpwatch命令清除旧文件
我们知道系统里面常常会有一些忘记删除的长时间不用而且确实没有用处的文件,如果不去处理,这些无用的文件会越来越多,浪费许多系统资源.在不知道文件名的情况下,很难去检查某一目录下到底是哪些文件长时间没有被 ...
- dockerfile镜像设置中文
一.dockerfile镜像设置中文 centos镜像默认不支持中文,把下面的内容加到dockerfile即可 # 修改时区 RUN rm -rf /etc/localtime && ...