当前位置: 首页 > news >正文

JMeter 执行流程

JMeter 执行流程源码解析(基于 JMeter 5.1)

本文基于 JMeter 5.1 源码,梳理其整体执行流程,涵盖从初始化到线程组生命周期、采样器/控制器的执行顺序,再到结果收集与汇报的完整过程,帮助理解 JMeter 内部架构与实现原理。


1. 初始化阶段

JMeter 的启动与测试计划初始化主要涉及以下步骤:

  1. 启动入口

    • 启动类为 org.apache.jmeter.NewDriver,负责加载环境配置、类路径与插件。
    • 随后进入 org.apache.jmeter.JMeter 类的 start() 方法。
  2. 测试计划加载

    • 通过 SaveService.loadTree(FileInputStream) 加载 .jmx 脚本,解析为 HashTree 结构。
    • HashTree 是 JMeter 的核心数据结构,树状存储测试元素(TestElement),如线程组、控制器、采样器、监听器。
  3. 初始化组件

    • 每个节点实现了 TestElement 接口,初始化时会调用其 setRunningVersion(true)recoverRunningVersion()
    • 测试元素通过 BeanShell、GUI 配置或 TestBean 方式进行属性注入。
  4. 监听器与结果收集器注册

    • 结果收集器(ResultCollector)在此阶段注册到运行环境,用于后续数据汇报。
用户NewDriverJMeterSaveService测试计划树启动 JMeter调用 start()loadTree(jmx)返回 HashTree初始化 TestElement用户NewDriverJMeterSaveService测试计划树

2. 线程组执行生命周期

线程组是 JMeter 测试执行的核心。源码关键类是 org.apache.jmeter.threads.ThreadGrouporg.apache.jmeter.threads.JMeterThread

  1. 线程组启动

    • 调用 ThreadGroup.start() 创建多个 JMeterThread 实例。
    • 每个线程对应一条独立的执行路径。
  2. JMeterThread 执行流程

    • 主方法在 JMeterThread.run()

      • 调用 threadStarted() 回调(实现了 ThreadListener 的组件会执行初始化逻辑)。
      • 进入循环,依次执行控制器与采样器。
      • 执行结束后调用 threadFinished() 进行清理。
  3. 生命周期管理

    • 线程运行过程中由 ThreadGroup 负责调度,支持 Ramp-up、循环控制、异常处理。
    • TestStateListener 会感知测试开始/结束状态,例如 ResultCollector 需要在测试结束时关闭文件。
StandardJMeterEngineThreadGroupJMeterThreadstart()创建多个 JMeterThreadstart()run()threadStarted()loop[每个线程]StandardJMeterEngineThreadGroupJMeterThread

3. 采样器与控制器的执行顺序

采样器(Sampler)用于发起请求,控制器(Controller)决定执行逻辑。

  1. 控制器执行

    • 基础接口为 org.apache.jmeter.control.Controller
    • 最常用的实现是 GenericController,其 next() 方法决定返回下一个要执行的采样器或子控制器。
    • 循环控制器、条件控制器等均继承自 GenericController,通过复写逻辑实现不同调度。
  2. 采样器执行

    • 采样器实现 org.apache.jmeter.samplers.Sampler 接口。
    • 核心方法为 SampleResult sample(Entry e),执行请求并返回 SampleResult
    • 例如:HTTPSamplerProxy 用于执行 HTTP 请求,内部通过 HttpClientHttpURLConnection 发起请求。
  3. 执行顺序机制

    • JMeterThread 在运行时会调用 controller.next(),拿到下一个 Sampler
    • Sampler 执行完毕后会将结果传递给监听器链路。
JMeterThreadControllerSamplerSampleResultnext()返回 Samplersample()返回 SampleResult处理结果loop[执行循环]JMeterThreadControllerSamplerSampleResult

4. 结果收集与汇报

测试结果的采集与汇报依赖于 SampleResultResultCollector

  1. 结果生成

    • 每个采样器执行完成后生成 SampleResult,包含请求/响应时间、成功与否、响应内容等。
    • 若存在子采样(如重定向),会在 SampleResult 中形成树状结构。
  2. 结果分发

    • JMeterThread 将结果传递给 SampleEvent,再通过 SampleListener 分发。
    • 典型的监听器实现是 ResultCollector,它会接收事件并写入文件或内存。
  3. 结果汇报

    • ResultCollector 持有 Summariser 或 GUI 组件,能实时显示统计信息。
    • 在非 GUI 模式下,结果通常保存为 JTL 文件(XML/CSV 格式),供后续分析。
JMeterThreadSampleEventResultCollectorJTL文件/GUI封装 SampleResultfireSampleOccurred()写入/展示数据JMeterThreadSampleEventResultCollectorJTL文件/GUI

总结

整体执行流程可以抽象为:

  1. 初始化 → 解析 JMX 脚本,构建测试计划树
  2. 线程组生命周期 → 创建并运行 JMeterThread
  3. 控制器/采样器调度 → 控制器决定执行路径,采样器发起请求
  4. 结果收集与汇报 → SampleResult 生成,ResultCollector 记录与汇报

JMeter 通过 树结构 + 线程模型 + 事件驱动 组合,形成灵活的测试执行与结果收集机制。这也是其能支持从简单 HTTP 压测到复杂分布式性能测试的核心原因。


http://www.dtcms.com/a/419527.html

相关文章:

  • 网站开发设计与实现云南楚雄网
  • Go 语言中映射(Map)使用场景
  • Go 中实现“面向对象”
  • 富阳做网站广州专业做网站多少钱
  • 威海网站开发公司电话手机软件怎么做出来的
  • 企业系统有哪些南通网站流量优化
  • nginx 的root跟alias的区别
  • 到底什么是智能网联汽车??第三期——汽车总线及车载网络系统
  • 网站做跳转影响排名吗wordpress在线考试插件
  • 网站开发行业推广网站开发合同是否专属管辖
  • 网站建设招聘启事太原城市建设招标网站
  • 做淘宝客为什么要做网站wordpress中文清爽博客主题:jishuzh主题分享
  • Vue表格多选后,将勾选数据返现到弹框中列表,部分数据出现丢失情况
  • CKAD-CN 考试知识点分享(16) 修改 container 名称
  • 东营优化网站中国石油大学网页设计与网站建设
  • 机器视觉:基于MTCNN与Caffe模型的人脸性别年龄统计系统实现
  • 手机网站开发升上去专门做消防器材的网站
  • Docker进程中的守护进程原理解析
  • ApplicationContext接口实现(四)
  • PyQt python 异步任务,多线程,进阶版
  • 磁盘物理坏块与逻辑坏块的区别
  • net asp网站开发长春哪有做网站公司
  • 【机器学习】监督学习 —— 决策树(Decision Tree)
  • (基于江协科技)51单片机入门:5.定时器
  • 怎么制作个人门户网站东莞常平中转场
  • 强化学习原理(四)
  • 做网站 毕业设计长沙企业网页设计哪家专业
  • 菊风可视化回溯解决方案,为金融业务合规打造全流程“可回溯”能力
  • 蜜度AI审校从技术到服务全面突破 为出版内容校对注入新活力
  • 单一索引,覆盖索引,联合索引