Jmeter执行流程分析

一、使用 Jmeter GUI 进行测试配置

我们在使用Jmeter做性能测试时,通常需要使用 GUI 来配置脚本,生成 .jmx 文件,然后使用命令来执行。脚本的配置通常需要有以下几个步骤:

测试计划 → 线程组 → 循环控制器 → Java请求 → 结果统计

通过以上配置生成 jmx 文件后,再使用命令行执行,生成结果文件,如:jmeter -n -t testscript\Baidu.jmx -l testresult\01-reslut.jtl

二、运行机制 && 源码分析

  • NewDriver 是 Jmeter 程序的入口类,通过反射调用 JMeter 类的 start() 方法;
  • JMeter 类的 start() 方法根据不同的命令来执行不同的启动方法,startGui() 和 startNonGui();
  • startNonGui() 方法又调用了 runNonGui() 方法来执行脚本
    1. 获取脚本文件,
    2. 配置脚本文件,
    3. 将脚本文件解析成 HashTree,
    4. 实例化一个JMeterEngine来对付脚本,JMeterEngine本质就是一个线程,
    5. 调用runTest方法。
  • HashTree 是 JMeter 执行测试依赖的数据结构,在执行测试之前进行配置测试数据,HashTree将数据组织到一个递归树结构中,并提供了操作该结构的方法
  • StandardJMeterEngine 执行JMeter 测试 ,直接用于本地 GUI 和非 GUI 调用,或者在服务器模式下运行时由 RemoteJMeterEngineImpl 启动
  • JMeterEngine 接口被运行 JMeter的测试类实现,此接口共8个方法,JMeterEngine本质就是一个线程,
  • JMeter类还有其他重要的职责,比如监听所有的 JMeterEngine ,当接收到 GUI 的 StopTestNow / Shutdown 等命令时候来调用JMeterEngine接口相应的方法。

三、Jmeter扩展实现

  从上面的分析我们发现:JMeterEngine 依赖于 HashTree,而 HashTree 是由 jmx 文件解析而来,每一个 JMeter 测试计划都会对应一个 jmx 文件。所以我们只要生成合理的 jmx 文件,就可以通过 JMeterEngine 压测引擎去执行测试任务。但是仔细一想发现,我们通过 Jmeter GUI生成一个 jmx 文件,然后 Jmeter 内部又把 jmx 文件解析成了一个 HashTree,再通过 JMeterEngine 来执行,那我们应该能够直接来创建这个 HashTree,并把这个 HashTree需要的内容添加进去,最后就能通过 JMeterEngine 来执行,这样我们就不必去生成 jmx 文件了,可以全部用代码来实现了,如下:

public class JmxCodeDemo {

  /**
   * 使用GUI的方式,做完各种配置之后, 会生成一个jmx文件
   *
   * 实际上这个Jmx文件在给到jmeter进程去执行时,JMeter类去负责将jmx文件解析成hashTree
   *
   * 这个hashTree的内容就跟我们在GUI中配置的关系是一致的, 各种层次的包裹关系
   *
   * 最终去调StandardJMeterEngine,将配置关系设置进去(jmeterEngine.configure(tree))
   *
   * 最后启动(执行)
   */
  public static void main(String[] args) {

    // 1、启动初始化配置
    URL resourceUrl = getResource("jmeter.properties");
    JMeterUtils.loadJMeterProperties(resourceUrl.getPath());
    JMeterUtils.setLocale(Locale.ENGLISH);

    // 2、创建一个测试计划
    TestPlan testPlan = new TestPlan();
    testPlan.setName("local perf test plan");

    // 3、创建一个javaSampler
    JavaSampler javaSampler = new JavaSampler();
    javaSampler.setName("local perf java sampler");
    javaSampler.setClassname(CaseDemo.class.getName());

    // 4、创建一个循环控制器
    LoopController controller = new LoopController();
    controller.setName("local perf loop controller");
    controller.setLoops(5);
    controller.addTestElement(javaSampler);
    controller.initialize();

    // 5、创建threadGroup
    ThreadGroup threadGroup = new ThreadGroup();
    threadGroup.setName("local perf thread group");
    threadGroup.setNumThreads(3);
    threadGroup.setDelay(100);
    threadGroup.setSamplerController(controller);
    threadGroup.initialize();

    // 6、创建结果收集器
    ResultCollector resultCollector = new ResultCollector();
    resultCollector.setName("local perf result collector");

    // 7、构建同级tree
    HashTree subTree = new HashTree();
    subTree.add(javaSampler);
    subTree.add(controller);
    subTree.add(threadGroup);
    subTree.add(resultCollector);

    // 8、构建层次tree
    HashTree tree = new HashTree();
    tree.add(testPlan,subTree);

    // 9、创建Jmeter引擎并将配置的tree赋值进去
    StandardJMeterEngine jmeterEngine = new StandardJMeterEngine();
    jmeterEngine.configure(tree);

    // 10、执行引擎
    try {
      jmeterEngine.runTest();
    } catch (JMeterEngineException e) {
      e.printStackTrace();
    }
  }
}

后面我们介绍性能测试平台时将会使用这种方式来实现。

原文地址:https://www.cnblogs.com/L-Test/p/12198713.html

时间: 2024-10-05 22:38:43

Jmeter执行流程分析的相关文章

转 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇) 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession的重要性了吧, 没错,从表面上来看,

Hive SQL执行流程分析

转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command line interface) bin/hive或bin/hive –service cli 命令行方式(默认) hive-server/hive-server2 bin/hive –service hiveserver 或bin/hive –service hiveserver2 通过JDBC/

wget www.baidu.com执行流程分析

通过GDB分析程序的执行流程如下: main.c(main) url_parse:解析url,获取url相关信息,返回结构体 struct url 的指针,存于 url_parsed retrieve_url:主要参数 url_parsed ,下载文件,下载网页的关键函数 retr.c(retrieve_url) http_loop,通过 HTTP 下载指定文件 http.c(http_loop) gethttp, 获取文档 http.c(gethttp) connect_to_host:给定域

ThinkPHP 框架执行流程分析

总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode/common.phpReadHtmlBehavior.class.phpRoute.class.phpHook.class.phpContentReplaceBehavior.class.phpWriteHtmlCacheBehavior.class.php ThinkPHP框架开发的应用的标准执

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

原文地址:http://www.cnblogs.com/dongying/p/4142476.html 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession

spark-sql执行流程分析

spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生成抽象语法树 变量替换,通过正则表达式找出符合规则的字符串,替换成系统缓存环境的变量 SQLConf中的`spark.sql.variable.substitute`,默认是可用的:参考` SparkSqlParser` parser:将antlr的tree转成spark catalyst的Logi

SpringMVC执行流程分析

SpringMVC执行流程图: 流程分析: 1.客户端发送request请求到DispatcherServlet(前端控制器): 2.DispatcherServlet(前端控制器)收到请求后调用HandlerMapping(处理器映射器): 3.HandlerMapping(处理器映射器)根据请求url找到具体的Handler(处理器),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet(前端控制器): 4.DispatcherServlet(前端控制器)

Java Servlet(十二):Servlet、Listener、Filter之间的执行流程分析

时隔几年后,看到本系列文章讲解的内容缺少了不少内容:周末无事分析了Spring Security是如何被集成到Web Servlet(SpringMVC)时,需要重新理清Filter.Listener.Servlet(SpringMVC#DispatcherServlet)之间的执行顺序,于是就有了本篇文章.这个话题是Web Servlet学习中的一个重点,弄清它们之间的执行流程,有助于理解SpringMVC.Spring Security这些框架是否如何与Web Servlet集成到一起. 原

配置Linux Kernel时make menuconfig执行流程分析

   在编译内核前,一般是根据已有的配置文件(一般在内核根目录下的arch/arm/configs/文件夹下,把该目录下的xxx_defconfig文件拷贝到内核根目录下,并重命名为.config)来进行编译; 或者需要先配置裁剪内核. 假设我们要基于一块ARM芯片的开发板配置裁剪内核时,在内核的根目录下运行:make ARCH=arm menuconfig命令后,会弹出如下配置界面: 当我们在内核的根目录下运行make ARM=arm menuconfig这条命令时,内核根目录下的Makefi