概述 HashTree 是 JMeter 执行测试依赖的数据结构,在执行测试之前进行配置测试数据,HashTree 将数据组织到一个递归树结构中,并提供了操作该结构的方法。 </ThreadGroup> **<hashTree/>** </hashTree> </hashTree> 请注意 HashTree 元素的嵌套。 /> </hashTree> </hashTree> </hashTree> </jmeterTestPlan> code.jmx 的 xml 结构如下: <org.apache.jorphan.collections.HashTree >Sampler-->ResultCollector 构造函数 构造函数有多种形式: HashTree(Map _map, Object key):若 HashTree 不为空则使用 HashTree, = null) { data.put(key, new HashTree()); } } HashTree():创建空 HashTree,实际调用 HashTree
><jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3"> <hashTree> <TestPlan guiclass="TestPlanGui elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree /> </hashTree> </hashTree> <ResultCollector guiclass="TableVisualizer" testclass /> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector /> </<em>hashTree</em>> </<em>hashTree</em>></jmeterTestPlan>
本地化的一些参数,比如设置本地语言以及一些资源等等 JMeterUtils.initLocale(); | 通过SaveService.loadTree解析本地的jmx文件来运行脚本 //加载本地jmx脚本 HashTree jmxTree = SaveService.loadTree(file); | 在hashtree里添加结果收集器 结果收集器是Jmeter用来收集运行日志摘要的。 中 jmxTree.add(jmxTree.getArray()[0], resultCollector); | hashtree转换 这一步主要是对我们之前构建的HashTree进行转换,作用是使得原来的 hashtree转换成jmeter可以运行执行的hashtree结构 JMeter.convertSubTree(jmxTree,false); | 根据HashTree执行测试用例 这一步主要是通过设置我们转换后的 HashTree,运行我们构建的测试用例。
简要解读: HashTree 是依赖的数据结构; SearchByClass 用来查找 HashTree 中的所有节点,并把节点实例化为真正的对象,例如图中TestPlan/ThreadGroup/JavaSampler /ResultCollector 在 HashTree 中本来都是只是配置,全部通过 SearchByClass 实例化的; 实例化出来的对象如果是 TestStateListener 类型,则会在有生命周期的函数回调 主要方法 void configure(HashTree testPlan); void exit(); boolean isActive(); void reset(); void runTest() testPlan) 配置引擎,HashTree 是 JMeter 执行测试依赖的数据结构,configure 在执行测试之前进行配置测试数据。 中 解析出 TestPlan , 获取 TestPlan 的 serialized 和tearDownOnShutdown 并保存为 local 属性,同时把整个 HashTree 也保存到 local
><jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3"> <hashTree> <TestPlan guiclass="TestPlanGui /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy /> </<em>hashTree</em>> </<em>hashTree</em>> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass /> </hashTree> </hashTree></jmeterTestPlan>
><jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3"> <hashTree> <TestPlan guiclass="TestPlanGui elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree /> </hashTree> </hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass /> </hashTree> <SyncTimer guiclass="TestBeanGUI" testclass="SyncTimer" testname="同步定时器" /> </hashTree> </hashTree></jmeterTestPlan>
> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.0 r1840935"> <hashTree> <TestPlan guiclass /stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree /> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="参数调优测试用例 /> </<em>hashTree</em>> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="异步 /> </<em>hashTree</em>> </<em>hashTree</em>> </<em>hashTree</em>> </jmeterTestPlan> ③ 测试效果windows 和linux 机制不一样 一台双核4g
> <jmeterTestPlan version="1.2" properties="3.2" jmeter="3.3 r1808647"> <hashTree> <TestPlan guiclass elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree /stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree /> </hashTree> </hashTree> <WorkBench guiclass="WorkBenchGui" testclass="WorkBench" testname ="工作台" enabled="true"> <boolProp name="WorkBench.save">true</boolProp> </WorkBench> <hashTree
> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.1"> <hashTree> <TestPlan guiclass= elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> </ThreadGroup> <hashTree CriticalSectionController.lockName">global_lock</stringProp> </CriticalSectionController> <hashTree /> </hashTree> </hashTree> </hashTree> </jmeterTestPlan> 脚本关键参数说明 -n:表示non gui mode,就是非图形化模式
> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.3"> <hashTree> <TestPlan guiclass="TestPlanGui /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname=" /> </<em>hashTree</em>> </<em>hashTree</em>> <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="调试取样器 /> </<em>hashTree</em>> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname /> </hashTree> </hashTree> </jmeterTestPlan> 顾翔凡言:AI时代,掌握已知的未知已非难事,关键在于如何发现未知的未知——而它往往就藏在探索已知之未知的过程中。
><jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3"> <hashTree> <TestPlan guiclass="TestPlanGui elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree /> </hashTree> </hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass /> </hashTree> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass /> </hashTree> </hashTree></jmeterTestPlan>
源码分析 构造函数 获取HashTree对象,这里存放的是ThreadGroup对象及其子节点列表 public TestCompiler(HashTree testTree) { TransactionController, SamplePackage> transactionControllerConfigMap = new HashMap<>(); private final HashTree before run starts synchronized (PAIRING) { PAIRING.clear(); } } addNode 被HashTree public void addNode(Object node, HashTree subTree) { stack.addLast((TestElement) node); } subtractNode 被HashTree的traverseInTo方法调用,当执行完addNode()方法后,执行subtractNode方法。
><jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3"> <hashTree> <TestPlan guiclass="TestPlanGui /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy /> </<em>hashTree</em>> </<em>hashTree</em>> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass /> </hashTree> </hashTree></jmeterTestPlan>
JMeterUtils.initLogging(); JMeterUtils.initLocale(); // JMeter测试计划,基本上是JOrphan HashTree HashTree testPlanTree = new HashTree(); // 第一个 HTTP Sampler - 打开 baidu.com )); // 从以上初始化的元素构造测试计划 testPlanTree.add(testPlan); HashTree JMeterUtils.initLogging(); JMeterUtils.initLocale(); // JMeter测试计划,基本上是JOrphan HashTree HashTree testPlanTree = new HashTree(); // 设置jmx脚本文件的工作目录,可以根据这个来找到参数化文件及实现其文件流
><jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3"> <hashTree> <TestPlan guiclass="TestPlanGui /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy /> </<em>hashTree</em>> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy /> </<em>hashTree</em>> </<em>hashTree</em>> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass /> </hashTree> </hashTree></jmeterTestPlan>
> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.1"> <hashTree> <TestPlan guiclass= boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> </ThreadGroup> <hashTree readTimeout">6000</stringProp> </eu.luminis.jmeter.wssampler.OpenWebSocketSampler> <hashTree "></stringProp> </eu.luminis.jmeter.wssampler.RequestResponseWebSocketSampler> <hashTree /> </hashTree> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>
HashTree 是 JMeter 执行测试依赖的数据结构,在执行测试之前进行配置测试数据,HashTree将数据组织到一个递归树结构中,并提供了操作该结构的方法 StandardJMeterEngine are replaced) // For GUI runs this is done in Start.java // 将测试文件(.jmx文件)解析成HashTree HashTree clonedTree = convertSubTree(tree, true); Summariser summariser = null Set to false at end of test */ boolean isActive(); } JMeterEngine 依赖于 HashTree,而 HashTree 是由 HashTree testPlanTree = new HashTree(); // 第一个 HTTP Sampler - 打开 baidu.com
API地址: API地址:https://jmeter.apache.org/api/org/apache/jmeter/engine/StandardJMeterEngine.htm 简要解读: HashTree 是依赖的数据结构; SearchByClass 用来查找 HashTree 中的所有节点,并把节点实例化为真正的对象,例如TestPlan/ThreadGroup/Sampler/ResultCollector 在 HashTree 中本来都是只是配置,全部通过 SearchByClass 实例化的; 实例化出来的对象如果是 TestStateListener 类型,则会在有生命周期的函数回调,测试前调 testStarted testTree) 配置引擎,HashTree 是 JMeter 执行测试依赖的数据结构,configure 在执行测试之前进行配置测试数据。 // 从HashTree中解析出TestPlan,并创建 SearchByClass<TestPlan> testPlan = new SearchByClass<>(TestPlan.class
红黑树 问我有什么区别 还有复杂度 稍微一深入讨论 我就废掉了 先亡羊补牢一下 文章目录 引子 1)、使用层次上的区别: HashMap: TreeMap: 2)、底层数据结构 HashMap: HashTree ,value允许重复 元素应当实现Comparable接口或者实现Comparator接口,元素进行自动排序 线程非安全 2)、底层数据结构 HashMap: 1.8之前数组+链表,1.8加入红黑树 HashTree
简要解读: HashTree是依赖的数据结构; SearchByClass 用来查找 HashTree 中的所有节点,并把节点实例化为真正的对象,例如图中TestPlan/ThreadGroup/JavaSampler /ResultCollector 在 HashTree 中本来都是只是配置,全部通过 SearchByClass 实例化的; 实例化出来的对象如果是 TestStateListener 类型,则会在有生命周期的函数回调 testTree) 配置引擎,HashTree 是 JMeter 执行测试依赖的数据结构,configure 在执行测试之前进行配置测试数据。 // HashTree是JMeter执行测试依赖的数据结构,configure在执行测试之前进行配置测试数据 // 从HashTree中解析出TestPlan, 获取TestPlan的serialized 和tearDownOnShutdown并保存为local属性,同时把整个HashTree也保存到local。