引子

先看一下这个例子,测试计划“进入考场”下面有一个线程组,线程组下面有 3 个 HTTP 请求,分别是学生登录、考场 token和进入房间:

它们的处理逻辑是:

  1. 学生登录后,在响应中返回了登录后的 token,使用正则表达式提取器,提取登录 token

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

  3. 拿到考场 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. 配置元件(如果存在)

  2. 前置处理器(如果存在)

  3. 定时器(如果存在)

  4. 取样器(如果存在)

  5. 后置处理器(如果存在且取样器的结果不为空)

  6. 断言(如果存在且取样器的结果不为空)

  7. 监听器(如果存在且取样器的结果不为空)

我总结一下加强理解。假设我们新建了 1 个线程,想用这个线程去发请求。

首先是初始化配置,比如参数化、设置 Header、Cookie 等,配置元件

接着可能需要给线程加点参数,比如用户参数,会用到前置处理器

然后在发送请求前可能会等待一段时间,添加定时器

准备好以后,就可以发送请求了,也就是取样器

如果取样器什么数据也没有返回,那么就可以直接退出了。

如果返回了数据,使用后置处理器,比如正则表达式提取器,提取想要的数据。

提取之后还有要做验证,断言一把。

测试运行的怎么样呢,用监听器看一看。

示例

再结合示例感受一下,请看以下测试计划,添加了 1 个 线程组,包含 3 个 取样器(HTTP Request 1 2 3):

JMeter 会按以下步骤运行:

  1. 线程组(如果有多个线程组可以在测试计划设置是顺序执行还是同时执行)
  2. 简单控制器(父节点)
  3. HTTP Cookie 管理器(配置元件)
  4. 用户参数(前置处理器)
  5. Synchronizing Timer(定时器)
  6. HTTP 请求 1(取样器)
  7. 正则表达式提取器(后置处理器)
  8. 响应断言(断言)
  9. HTTP Cookie 管理器(配置元件)
  10. 用户参数(前置处理器)
  11. Synchronizing Timer(定时器)
  12. HTTP 请求 2(取样器)
  13. 正则表达式提取器(后置处理器)
  14. 响应断言(断言)
  15. HTTP 请求 3(取样器)
  16. 察看结果树(严格来讲是与第 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开窍了的更多相关文章

  1. Jmeter入门--元件作用域和执行顺序

    一.元件作用域 8类可被执行的元件(测试计划于线程组不属于可执行元件),这些元件中,取样器(Sampler)是典型的不与其他元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其他元件(配置 ...

  2. 性能测试工具Jmeter06-Jmeter元件作用域和执行顺序

    元件作用域 8类可被执行的元件(测试计划与线程组不属于可执行元件),这些元件中,取样器(sampler)是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(配置元件 ...

  3. JMeter元件作用域实践指南

    从一个问题说起 对于以下测试脚本: 为了能调用进入房间接口,需要从考场接口获取考场token.为了调用考场接口,需要从登陆接口获取登陆token.元件说明如下: 学生登录,提取登录${token}传入 ...

  4. Jmeter元件作用域

    转载自飞测团队

  5. JMeter配置元件作用域

  6. JMeter基础【第三篇】JMeter5.1元件作用域及执行顺序

    执行顺序,大家可以实践验证,加深印象. 最后,给大家说一个万能且保险的方法:放到对应的取样器下面即可.

  7. iOS边练边学--static(作用域),copy(深浅拷贝)

    一.static作用 二.copy

  8. Jmeter的简单介绍

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件 ...

  9. Jmeter介绍以及脚本制作与调试

    目录 Jmeter介绍 Jmeter安装 Jmeter主要测试组件 Jmeter元件作用域与执行顺序 Jmeter运行原理 Jmeter脚本制作 Jmeter脚本调试 Jmeter介绍 Jmeter ...

随机推荐

  1. Centos-bzip2压缩文件-bzip2 bunzip2

    bzip2 buzip2 对文件进行压缩与解压缩,类似 gzip gunzip命令,只能压缩文件,对目录则压缩目录下文件,生成以 .bz2为扩展名的文件 相关选项 -d 解压 -v 压缩或解压显示详细 ...

  2. 基于Excel参数化你的Selenium2测试-xlrd

    本篇文章转载至苦叶子:   前言 今天我们就如何使用xlrd模块来进行python selenium2 + excel自动化测试过程中的参数化进行演示说明,以解决大家在自动化测试实践过程中参数化的疑问 ...

  3. mysql-3-orderby

    #进阶3:排序查询 /* 语法: SELECT FROM WHERE ORDER BY ASC|DESC */ USE myemployees; #案例1:查询员工信息,按工资从高到低排 SELECT ...

  4. 【小白学PyTorch】18 TF2构建自定义模型

    [机器学习炼丹术]的炼丹总群已经快满了,要加入的快联系炼丹兄WX:cyx645016617 参考目录: 目录 1 创建自定义网络层 2 创建一个完整的CNN 2.1 keras.Model vs ke ...

  5. 【题解】[USACO19DEC]Milk Visits G

    题目戳我 \(\text{Solution:}\) 这题不要把思想局限到线段树上--这题大意就是求路径经过的值中\(x\)的出现性问题. 最开始的想法是值域线段树--看了题解发现直接\(vector\ ...

  6. 【题解】小M的作物

    题目戳我 \(\text{Solution:}\) 这题要求最大收获,可以转化为所有可能的收益减去最小割. 单个点很好连边 \((S\to pos\to T),\) 问题在于如何处理组合的点. 观察到 ...

  7. 虚拟主机和ECS的选择——有的坑你可以不躺,有的钱你可以不花(一)

    一直想做网站,由于最开始虚拟主机有优惠,所以三年前买了虚拟主机,后来一直续费,间歇性使用过,发现很多功能都不行​. 昨天准备买新的,然后想起学生购买有优惠,于是开始了学生认证之旅​. 首先,看一下之前 ...

  8. 8.Android-简单的登录案例编写

    本章来学习登录案例,由于还未学习自定义控件外观,所以ui界面先用最简单的,并保存登录账号密码到data/data/包名/files下 1.学习之前需要掌握的Context类(通过Context来往AP ...

  9. dict, hash

    dict: dictKey -- > dictVal example: dictEntry *dictFind(dict *d, const void *key)     Key is like ...

  10. FreeType2使用总结(转)

    一.FreeType2简介 1. 是一个免费.开源.可移植且高质量的字体引擎: 2. 支持多种字体格式文件,并提供了统一的访问接口: 3. 支持单色位图.反走样位图渲染,这使字体显示质量达到Mac的水 ...