从一个问题说起

对于以下测试脚本:

为了能调用进入房间接口,需要从考场接口获取考场token。为了调用考场接口,需要从登陆接口获取登陆token。元件说明如下:

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

  • 添加HTTP Header Manager:

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

  • 添加HTTP Header Manager:

  • 进入房间

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

运行顺序

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

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

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

它们的运行顺序如下:

  1. 配置元件(如果存在)

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

  3. 定时器(如果存在)

  4. 取样器(如果存在)

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

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

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

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

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

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

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

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

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

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

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

实践指南

对于以下所列元件:

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中,同一层级的元件具有相同的作用域!

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

因为简单控制器通过分组给元件划分了层级,所以简单控制器下面的这些同层级元件,作用域相同,既会作用于 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元件运行顺序,然后参考了实践指南,发现了同一层级作用域相同这个原理,总结出了使用建议,配置元件、前置处理器、定时器、后置处理器、断言这六类元件,最好放在取样器的下级,调整后脚本如期运行。

JMeter元件作用域实践指南的更多相关文章

  1. Jmeter元件作用域

    转载自飞测团队

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

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

  3. JMeter元件的作用域与执行顺序

    元件的作用域 先来讨论一下元件有作用域.<JMeter基础元件介绍>一节中,我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器 是典型的不与其它元件发生交互作用 ...

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

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

  5. jmeter元件作用及执行顺序

    jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同. jmeter的test pla ...

  6. Celery的实践指南

    http://www.cnblogs.com/ToDoToTry/p/5453149.html Celery的实践指南   Celery的实践指南 celery原理: celery实际上是实现了一个典 ...

  7. [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务

    转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...

  8. [CoreOS 转载] CoreOS实践指南(五):分布式数据存储Etcd(上)

    转载:http://www.csdn.net/article/2015-01-22/2823659 摘要:在“漫步云端:CoreOS实践指南”系列的前几篇,分别介绍了如何架设CoreOS集群,系统服务 ...

  9. [CoreOS 转载] CoreOS实践指南(四):集群的指挥所Fleet

    转载:http://www.csdn.net/article/2015-01-14/2823554/2 摘要:CoreOS是采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...

  10. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

随机推荐

  1. JavaScript的理解记录(1)

    1.JavaScript的数据类型分为两类:原始类型和对象类型: 原始类型包括:数字,字符串,布尔值,null和undefined; (都是不可变类型,值不可以修改) 对象类型:普通对象和函数: 函数 ...

  2. Python_Day1_基础1

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  3. hdu 4642 Fliping game(博弈)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4642 题意:给定一个棋盘,0表示向下,1表示向上,选一个x,y, 然后翻转从x,y 到n,m.的所有硬币, ...

  4. 【一通百通】c/php的printf用法

    1.先说说PHP printf()函数: printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); %d 十进制有符号整数  ...

  5. CentOS 通过yum安装web环境

    以前有过记录用过linux安装包来安装,但是需要手动配置环境.这次是用yum 来安装web环境,就可以不需要手动配置环境. 1,安装mysql 通过yum安装mysql 输入:rpm -qa | gr ...

  6. Spring对远程服务的支持

    Java程序有以下的远程调用技术选择: 远程过程调用(RPC)是同步的,客户端在服务器端返回结果之前将一直被阻塞. 各种技术适用的场景如下: 典型的RMI开发的过程如下: 定义一个接口,用于客户端和服 ...

  7. IDEA 配置datasource,提升编码效率,让你在 Mapper.xml 中编写sql可以飞起来~

    IDEA 2018 创建springboot工程后,如果你打开一个.sql文件,或者一个mybatis的mapper.xml文件,会提示: No data source are configured ...

  8. Git相关整理以及学习

    1.取消还未进入暂存区的修改 git checkout + 文件名 2.取消已经进入暂存区但是还未提交的修改 git reset HEAD + 文件名 3.清理在远程仓库已经被删除的本地分支 git ...

  9. JDK(九)JDK1.7源码分析【集合】HashMap的死循环

    前言 在JDK1.7&1.8源码对比分析[集合]HashMap中我们遗留了一个问题:为什么HashMap在调用resize() 方法时会出现死循环?这篇文章就通过JDK1.7的源码来分析并解释 ...

  10. 802.11bgn信道划分及WirelessMon规划频段

    一.802.11bgn模式支持14信道,第14信道一般不使用.对应频率范围如下: Channel Frequency range Central Frequency ----------------- ...