对于如下测试脚本:正则表达式
为了能调用进入房间接口,须要从考场接口获取考场token。为了调用考场接口,须要从登录接口获取登录token。元件说明以下:测试
学生登陆,提取登陆${token}
传入下个接口参数。线程
添加HTTP Header Manager:3d
考场token,提取考场${exam_token}
传入下个接口参数。code
添加HTTP Header Manager:blog
进入房间token
貌似挺合理,HTTP Header Manager会给下方的接口添加请求头,运行结果然的如咱们所料么?接口
在回答这个问题以前,有必要搞懂JMeter元件的运行顺序,它是由2 个维度来决定的:从上往下和元件类型。作用域
从上往下,即目录树从上往下。元件类型,分为3类:io
它们的运行顺序以下:
配置元件(若是存在)
前置处理器(若是存在)
定时器(若是存在)
取样器(若是存在)
后置处理器(若是存在且取样器的结果不为空)
断言(若是存在且取样器的结果不为空)
监听器(若是存在且取样器的结果不为空)
换句话说,假设咱们新建了1个线程,想用这个线程去发请求。
第一步,初始化配置,好比参数化、设置Header、Cookie等,用到配置元件。
第二步,可能须要给线程加点参数,好比用户参数,用到前置处理器。
第三步,在发送请求前可能会等待一段时间,用到定时器。
第四步,发送请求,用到取样器。
第五步,可能须要提取响应数据,好比正则表达式提取器、JMESPath提取器,用到后置处理器。
第六步,验证结果符合预期,用到断言。
第七步,查看请求响应数据和测试结果,用到监听器。
对于如下所列元件:
JMeter会按如下步骤运行:
其中有个观察做用域实际效果的关键元件:HTTP请求2,它的先后并无元件,可是也被做用上了。在JMeter中,同一层级的元件具备相同的做用域!
简单控制器是一个执行单元,自己没有内容,它的做用是把元件进行分组:
由于简单控制器经过分组给元件划分了层级,因此简单控制器下面的这些同层级元件,做用域相同,既会做用于 HTTP请求1,也会做用于HTTP请求2。注意了!配置元件、前置处理器、定时器、后置处理器、断言、监听器,这六个组件,会做用到范围内的全部取样器。
除了同级做用域,还有上下级,JMeter的上级做用域包含下级做用域,可是下级是不能做用到上级。好比HTTP请求3,简单控制器下级的元件,是不会做用到HTTP请求3的。
HTTP Header Manager是配置元件,会做用到范围内的全部取样器。这里有2个HTTP Header Manager,都位于同一层级,它们会一块儿执行。在JMeter同一执行单元中,若是相同类型的元件有多个,那么它们会被当作一个一块儿执行!
测试一下,把最后一个HTTP Header Manager的authorization重命名为authorization2,查看考场接口的Headers:
两个HTTP Header Manager都做用上了。
为了不混乱,在实际使用时建议:
按照建议调整后的测试脚本以下:
User Defined Variables和CSV Data Set Config,是配置元件,且跟取样器同级,会同时做用到这 3 个取样器上面。
本文开头引入了我在实际工做中碰到的问题,为了解决,先搞懂了JMeter元件运行顺序,而后参考了实践指南,发现了同一层级做用域相同这个原理,总结出了使用建议,配置元件、前置处理器、定时器、后置处理器、断言这六类元件,最好放在取样器的下级,调整后脚本如期运行。