从一个问题说起

对于以下测试脚本:

为了能调用进入房间接口,需要从考场接口获取考场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. 苹果公布WWDC2016时间 并做了个程序员情怀网页

    新浪手机讯 4月19日上午消息,苹果公司今日正式确定2016年全球开发者大会(WWDC)开幕时间:6月13-17日,并做了个非常有意思的代码风格页面. 网友戏称这个页面只有程序员们才能看懂,它的首页是 ...

  2. iOS后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务

    我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UI ...

  3. 一些JavaScript的技巧、秘诀和最佳实践

    文章分享一些JavaScript的技巧.秘诀和最佳实践,除了少数几个外,不管是浏览器的JavaScript引擎,还是服务器端JavaScript解释器,均适用. 本文中的示例代码,通过了在Google ...

  4. 跟Bob大叔观OO原则

    上篇总结了经典的23种 设计模式,详细的解读后期会陆续的详细揭开.使用设计模式的根本原因就是为了增强代码的复用性和可维护性.而面向对象是实现代码复用的有效途径,所以这里有必要了解一下OO的基本思想和原 ...

  5. Android:如何实现更换主题

    关键代码:setTheme(int ID); 注意点: 1.设置主题必须要在setContentView() 之前调用,所以需要写个Intent去重新开启Activity. 2.为了切换主题保证流畅性 ...

  6. MySQL事务与锁

    MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...

  7. kafka学习笔记2:生产者

    这次的笔记主要记录一下kafka的生产者的使用和一些重要的参数. 文中主要截图均来自kafka权威指南 主要涉及到两个类KafkaProducer和ProducerRecord. 总览 生产者的主要架 ...

  8. Nginx开启gzip压缩解决react打包文件过大

    用create-react-app创建的react应用打包之后的build js有1M之多. 采用gzip打包传输,可以节约70%左右的带宽 nginx采用gzip打包方式 在nginx配置中添加如下 ...

  9. /etc/my.cnf

    [client] default-character-set=utf8 [mysqld] tmp_table_size = 2048M max_heap_table_size = 2048M max_ ...

  10. maven打包时跳过测试

    本文转载自:https://blog.csdn.net/thc1987/article/details/42458895 运行mvn install时跳过Test 方法一: <project&g ...