专栏首页dongfanger学了元件作用域,我终于对JMeter开窍了

学了元件作用域,我终于对JMeter开窍了

引子

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

它们的处理逻辑是:

  1. 学生登录后,在响应中返回了登录后的 token,使用正则表达式提取器,提取登录 token
  2. 在登录以后,把登录 token 作为 header,去请求“考场token”这个接口,请求后的响应中,返回了考场 token,使用正则表达式提取,下图是“考场token”请求的 header,使用了 HTTP Header 管理器:
  1. 拿到考场 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 目录树是怎么运行的,最后回到开头的例子进行了结果分析,给出了在使用时的两条建议。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 接口自动化框架pyface详细介绍

    本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发。

    dongfanger
  • DRF终极封装ViewSet和Router附教程PDF源码

    在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容...

    dongfanger
  • 魔法方法推开Python进阶学习大门

    Python是Guido van Rossum设计出来的让使用者觉得如沐春风的一门编程语言。2020年11月12日,64岁的Python之父宣布由于退休生活太无...

    dongfanger
  • 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?

    理想的RESTful Web API采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型。但是理想和现实是有距离的,虽然HTTP协议提供了一系...

    蒋金楠
  • SAP Data Intelligence API返回错误消息 - Fordidden cross-site request

    添加HTTP field - X-Requested-With HTTP value - XMLHttpRequest

    Jerry Wang
  • CentOS7上使用bind9搭建DNS主从服务器

       Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(https://www.isc.org/downloads/bind/)维...

    三杯水Plus
  • php判断客户端UserAgent

    1 <?php 2 //echo $_SERVER['HTTP_USER_AGENT'];exit; 3 //var_dump(stripos($_SER...

    joshua317
  • Entity Framework简介

    Entity Framework (简称EF),是.NET的 Object/Relational Mapping 实体框架(简称ORM),可以在 SQL Ser...

    喵叔
  • 理解unittest测试框架(五)——加载模块

    前面一系列文章研究了unittest框架的一些最小单元,比如用例,结果,这次看的是加载模块,也就是测试用例,是如何被框架加载到的。

    点点寒彬
  • 力扣74——搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

    健程之道

扫码关注云+社区

领取腾讯云代金券