JMeter元件做用域实践指南

从一个问题提及

对于如下测试脚本:正则表达式

为了能调用进入房间接口,须要从考场接口获取考场token。为了调用考场接口,须要从登录接口获取登录token。元件说明以下:测试

  • 学生登陆,提取登陆${token}传入下个接口参数。线程

  • 添加HTTP Header Manager:3d

  • 考场token,提取考场${exam_token}传入下个接口参数。code

  • 添加HTTP Header Manager:blog

    image-20201102153752646

  • 进入房间token

貌似挺合理,HTTP Header Manager会给下方的接口添加请求头,运行结果然的如咱们所料么?接口

运行顺序

在回答这个问题以前,有必要搞懂JMeter元件的运行顺序,它是由2 个维度来决定的:从上往下和元件类型。作用域

从上往下,即目录树从上往下。元件类型,分为3类:io

  • 线程组、逻辑控制器。
  • 取样器。
  • 配置元件、前置处理器、定时器、后置处理器、断言、监听器。

它们的运行顺序以下:

  1. 配置元件(若是存在)

  2. 前置处理器(若是存在)

  3. 定时器(若是存在)

  4. 取样器(若是存在)

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

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

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

换句话说,假设咱们新建了1个线程,想用这个线程去发请求。

第一步,初始化配置,好比参数化、设置Header、Cookie等,用到配置元件。

第二步,可能须要给线程加点参数,好比用户参数,用到前置处理器。

第三步,在发送请求前可能会等待一段时间,用到定时器。

第四步,发送请求,用到取样器。

第五步,可能须要提取响应数据,好比正则表达式提取器、JMESPath提取器,用到后置处理器。

第六步,验证结果符合预期,用到断言。

第七步,查看请求响应数据和测试结果,用到监听器。

实践指南

对于如下所列元件:

image-20201102110655732

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 步并行,也就是取样器以后)

做用域

其中有个观察做用域实际效果的关键元件:HTTP请求2,它的先后并无元件,可是也被做用上了。在JMeter中,同一层级的元件具备相同的做用域!

简单控制器是一个执行单元,自己没有内容,它的做用是把元件进行分组:

image-20201102114047379

由于简单控制器经过分组给元件划分了层级,因此简单控制器下面的这些同层级元件,做用域相同,既会做用于 HTTP请求1,也会做用于HTTP请求2。注意了!配置元件、前置处理器、定时器、后置处理器、断言、监听器,这六个组件,会做用到范围内的全部取样器。

除了同级做用域,还有上下级,JMeter的上级做用域包含下级做用域,可是下级是不能做用到上级。好比HTTP请求3,简单控制器下级的元件,是不会做用到HTTP请求3的。

回答开头的问题

image-20201102153442568

HTTP Header Manager是配置元件,会做用到范围内的全部取样器。这里有2个HTTP Header Manager,都位于同一层级,它们会一块儿执行。在JMeter同一执行单元中,若是相同类型的元件有多个,那么它们会被当作一个一块儿执行!

测试一下,把最后一个HTTP Header Manager的authorization重命名为authorization2,查看考场接口的Headers:

image-20201103151208796

两个HTTP Header Manager都做用上了。

为了不混乱,在实际使用时建议:

  • 根据前后顺序,从上往下合理的放置元件的顺序。
  • 对于配置元件、前置处理器、定时器、后置处理器、断言这六类元件,它们都是为取样器服务的,若是只想做用于单个取样器,那么最好放在这个取样器的下级。

按照建议调整后的测试脚本以下:

image-20201103151848256

User Defined Variables和CSV Data Set Config,是配置元件,且跟取样器同级,会同时做用到这 3 个取样器上面。

小结

本文开头引入了我在实际工做中碰到的问题,为了解决,先搞懂了JMeter元件运行顺序,而后参考了实践指南,发现了同一层级做用域相同这个原理,总结出了使用建议,配置元件、前置处理器、定时器、后置处理器、断言这六类元件,最好放在取样器的下级,调整后脚本如期运行。