JMeter源码解读 - HashTree(超详细)

🍅 视频学习:文末有免费的配套视频可观看

🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快

在 JMeter 中,HashTree 是一种用于组织和管理测试计划元素的数据结构。它是一个基于 LinkedHashMap 的特殊实现,提供了一种层次结构的方式来存储和表示测试计划的各个组件。

HashTree 的特点如下:

  • 层次结构:HashTree 使用树状结构来组织测试计划元素。每个节点都可以包含子节点,这样就形成了一个层次结构。树的根节点是测试计划本身,而叶子节点是具体的测试元素(如线程组、HTTP 请求等)。
  • 存储关联关系:HashTree 不仅存储了节点之间的层次关系,还存储了节点之间的关联关系。这意味着你可以在 HashTree 中方便地查找和获取节点之间的关联关系,而无需手动遍历整个树。
  • 快速访问:HashTree 使用了 LinkedHashMap 来存储节点,这使得访问和检索元素变得非常高效。通过哈希表的快速访问特性,你可以根据节点的名称或其他属性,快速地获取到对应的节点。

具体介绍内容参考官方文档:

http://jmeter.apache.org/api/org/apache/jorphan/collections/HashTree.html

jmx文件:

在 JMeter 中,JMX(Java Management Extensions)文件是测试计划的保存和加载文件格式。

JMX 文件以 XML 格式编写,它包含了测试计划的配置信息、测试元素、线程组、监听器等各个组件的设置和关系。而HashTree就是它在内存的一份映射。

由以上的结构可知,每一层都只有2个类型的节点:

  • Object 节点 - 代表一个 Test Component
  • HashTree - 一个HashTree 的子节点

hashtree定义:

public class HashTree implements Serializable, Map<Object, HashTree>, Cloneable {

    private static final long serialVersionUID = 240L;

    // Used for the RuntimeException to short-circuit the traversal

    private static final String FOUND = "found"; // $NON-NLS-1$

    // N.B. The keys can be either JMeterTreeNode or TestElement

    protected final Map<Object, HashTree> data; //

    /**

     * Creates an empty new HashTree.

     */

    public HashTree() {

        this(null, null);

    }

    ....... 

上述代码片段展示了 JMeter 中的 HashTree 类的定义。HashTree 类实现了 Serializable 接口和 Map 接口,并且可以进行克隆操作(Cloneable)。

HashTree 类的核心存储结构是一个名为 "data" 的受保护的最终类型的 Map,类型为 Map<Object, HashTree>。这个 Map 用于存储测试计划元素及其对应的 HashTree。

在 JMeter 中,HashTree 被用作测试计划元素的容器,它通过实现 Map 接口提供了对外的读写能力。具体来说,HashTree 可以通过调用 put 方法来添加键值对,其中键可以是 JMeterTreeNode 或 TestElement 类型的对象,值是对应的 HashTree。

通过调试可以确认,ListedHashTree 在内存中的结构就是 jmx 文件的映射。ListedHashTree 是 HashTree 的子类,实际上它使用了 ListedHashMap 数据结构,类似于 LinkedHashMap。ListedHashTree 保持了元素的添加顺序,并提供了方便的方法来遍历和访问元素。

综上所述,HashTree 是 JMeter 中用于存储测试计划元素的数据结构,它使用一个 Map 对象来实现存储和访问的功能。ListedHashTree 是 HashTree 的子类,使用了 ListedHashMap 来保持元素的顺序。这样的设计使得 HashTree 可以方便地映射和操作 JMX 文件中的测试计划元素。

HashTree 遍历获取元素过程:

在 JMeter 中,HashTree 使用了访问者模式来遍历数据节点。这是因为在测试执行过程中,JMeter 的 Engine 经常需要访问 JMX 文件中特定节点和子节点的数据。将这些访问方法放在 HashTree 本身会导致耦合度过高,不利于扩展和灵活性。通过使用访问者模式,可以解耦数据结构与操作,并提供更好的扩展性。

具体来说,访问者模式包含以下几个角色:

  1. 访问者(Visitor):定义了要对数据结构中的元素执行的操作接口。在 JMeter 中,访问者是一个接口,定义了可以在 HashTree 中访问不同类型的节点的方法。
  2. 具体访问者(Concrete Visitor):实现了访问者接口,提供了具体的操作实现。在 JMeter 中,具体访问者是 Engine,它实现了访问者接口,定义了在测试执行过程中对 HashTree 节点的具体访问操作。
  3. 数据结构(Element):定义了数据结构的接口,允许访问者访问它的元素。在 JMeter 中,数据结构是 HashTree,它实现了 Element 接口,允许访问者访问其中的节点。
  4. 具体数据结构(Concrete Element):实现了数据结构接口,提供了具体的数据结构实现。在 JMeter 中,具体数据结构是 HashTree 中的节点,例如 JMeterTreeNode 或 TestElement。

在 JMeter 中,Engine 作为具体访问者,通过访问者模式可以在测试执行过程中遍历 HashTree 中的节点和子节点。这样的设计提供了更好的扩展性,允许在不修改 HashTree 的情况下定义新的操作,并且可以根据需要将这些操作应用于 HashTree 中的元素。

遍历过程依赖的两个核心类:

/**

    * Allows any implementation of the HashTreeTraverser interface to easily

    * traverse (depth-first) all the nodes of the HashTree. The Traverser

    * implementation will be given notification of each node visited.

    *

    * @see HashTreeTraverser

    * @param visitor

    *            the visitor that wants to traverse the tree

    */

   public void traverse(HashTreeTraverser visitor) {

       for (Object item : list()) {

           visitor.addNode(item, getTree(item));

           getTree(item).traverseInto(visitor);

       }

   }

   /**

    * The recursive method that accomplishes the tree-traversal and performs

    * the callbacks to the HashTreeTraverser.

    *

    * 完成树遍历和执行的递归方法对HashTreeTraverser的回调。使用深度优先遍历hashTree

    *

    * @param visitor

    *            the {@link HashTreeTraverser} to be notified

    */

   private void traverseInto(HashTreeTraverser visitor) {

       if (list().isEmpty()) {

           visitor.processPath();

       } else {

           for (Object item : list()) {

               final HashTree treeItem = getTree(item);

               visitor.addNode(item, treeItem);

               treeItem.traverseInto(visitor);

           }

       }

       visitor.subtractNode();

   }

在 JMeter 中,HashTreeTraverser 类是用于遍历 HashTree 的工具类,它提供了一种简单的方式来访问和处理 HashTree 中的节点和子节点。它的主要作用是封装了 HashTree 的遍历逻辑,使得遍历过程更加便捷和灵活。

以下是 HashTreeTraverser 类的关键方法和作用:

  1. traverse(HashTree tree, HashTreeVisitor visitor) 方法:该方法用于遍历 HashTree,并调用访问者的相应方法进行访问。它接受两个参数,tree 表示要遍历的 HashTree 对象,visitor 表示实现了 HashTreeVisitor 接口的访问者对象。
  2. traverseIntoSubTree(Object key, HashTree tree, HashTreeVisitor visitor) 方法:该方法用于遍历指定节点的子树,并调用访问者的相应方法进行访问。它接受三个参数,key 表示节点的标识键,tree 表示节点的子树 HashTree,visitor 表示访问者对象。
  3. traverseCollections(Collection<?> collection, HashTreeVisitor visitor) 方法:该方法用于遍历集合对象,并调用访问者的相应方法进行访问。它接受两个参数,collection 表示要遍历的集合对象,visitor 表示访问者对象。

通过使用 HashTreeTraverser 类,可以更方便地遍历 HashTree 中的节点和子节点,并在访问者的方法中执行相应的操作。它封装了遍历的细节,使得访问者可以专注于实际的访问操作,而不需要关注遍历的具体实现。

public class SearchByClass<T> implements HashTreeTraverser {

    private final List<T> objectsOfClass = new LinkedList<>();

    private final Map<Object, ListedHashTree> subTrees = new HashMap<>();

    private final Class<T> searchClass;

    /**

     * Creates an instance of SearchByClass, and sets the Class to be searched

     * for.

     *

     * @param searchClass

     *            class to be searched for

     */

    public SearchByClass(Class<T> searchClass) {

        this.searchClass = searchClass;

    }

    /**

     * After traversing the HashTree, call this method to get a collection of

     * the nodes that were found.

     *

     * @return Collection All found nodes of the requested type

     */

    public Collection<T> getSearchResults() { // TODO specify collection type without breaking callers

        return objectsOfClass;

    }

    /**

     * Given a specific found node, this method will return the sub tree of that

     * node.

     *

     * @param root

     *            the node for which the sub tree is requested

     * @return HashTree

     */

    public HashTree getSubTree(Object root) {

        return subTrees.get(root);

    }

    /** {@inheritDoc} */

    @SuppressWarnings("unchecked")

    @Override

    public void addNode(Object node, HashTree subTree) { // 某一层HashTre 的数据访问

        if (searchClass.isAssignableFrom(node.getClass())) {

            objectsOfClass.add((T) node);

            ListedHashTree tree = new ListedHashTree(node);

            tree.set(node, subTree);

            subTrees.put(node, tree);

        }

    }

    /** {@inheritDoc} */

    @Override

    public void subtractNode() {

    }

    /** {@inheritDoc} */

    @Override

    public void processPath() {

    }

}

在 JMeter 中,SearchByClass 类是一个实现了 HashTreeVisitor 接口的辅助类,用于在 HashTree 中搜索指定类型的元素。它提供了一种便捷的方式来遍历 HashTree,并将符合指定类型的元素保存起来。

以下是 SearchByClass 类的关键方法和作用:

  1. 构造函数 SearchByClass(Class<?> searchClass):该构造函数用于创建 SearchByClass 对象,并指定要搜索的目标元素类型。参数 searchClass 表示要搜索的元素类型,它是一个 Class 对象。
  2. addNode() 方法的作用是在遍历 HashTree 的过程中,判断节点的类型是否与指定的目标类型兼容。如果兼容,将该节点添加到结果列表中,并创建一个新的 ListedHashTree 对象,将该节点作为根节点,并将其对应的子树添加到新创建的 ListedHashTree 中。最后,将新创建的 ListedHashTree 对象以节点为键,添加到 subTrees Map 中。
  3. getSearchResults() 方法:该方法用于获取搜索结果,即符合指定类型的元素列表。它返回一个 List 对象,其中包含了搜索结果。

通过使用 SearchByClass 类,可以方便地在 HashTree 中搜索指定类型的元素,并将符合条件的元素保存起来,以便后续使用。

使用例子:

SearchByClass searchByClass = new SearchByClass(TestPlan.class);

hashTree.traverse(searchByClass);

Object[] searchResults = searchByClass.getSearchResults().toArray();

创建一个实现了 HashTreeVisitor 接口的 SearchByClass 对象,用于指定要访问的元素类型。假设我们要访问的元素类型是 TestPlan.class,接下来,调用 HashTree 的 traverse() 方法,将 SearchByClass 对象传递给它,以进行元素的访问和遍历,最后通过调用searchByClass.getSearchResults().toArray() 来获取访问结果。这将返回一个数组,其中包含符合指定元素类型的所有元素。

hashtree常用操作方法:

  1. add(Object key, Object value):将一个键值对添加到 HashTree 中。键通常是元素对象,而值可以是另一个 HashTree 或其他对象。
  2. put(Object key, Object value):与 add() 方法类似,将一个键值对添加到 HashTree 中。不同之处在于,如果键已经存在于 HashTree 中,则会用新值替换旧值,  
  3. remove(Object key):从 HashTree 中删除指定的键及其关联的值。
  4. get(Object key):根据键获取与之关联的值。
  5. containsKey(Object key):检查 HashTree 中是否包含指定的键。
  6. containsValue(Object value):检查 HashTree 中是否包含指定的值。
  7. keySet():返回 HashTree 中所有键的集合。
  8. values():返回 HashTree 中所有值的集合。
  9. size():返回 HashTree 中键值对的数量。
  10. isEmpty():检查 HashTree 是否为空。
  11. clear():清空 HashTree,移除所有的键值对。
  12. entrySet():返回 HashTree 中所有键值对的集合。

同时,在这我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看就行,希望对你有所帮助!【公众号:互联网杂货铺】免费领取软件测试资料。

花了2万多买的自动化测试全套教程,现在分享给大家,入门到精通,全程干货无废话(软件测试全栈教程))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/522770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全意识也是基础防御中的关键一环

在当今数字化时代&#xff0c;网络安全已经成为企业和个人生活中不可或缺的一部分。网络攻击的不断演进和加剧使得保护个人隐私、商业机密和国家安全变得尤为重要。然而&#xff0c;网络安全并非仅仅是技术层面的问题&#xff0c;更是一个综合性的挑战&#xff0c;需要广泛的参…

场景文本检测识别学习 day01(传统OCR的流程、常见的损失函数)

传统OCR的流程 传统OCR&#xff1a;传统光学字符识别常见的的模型主要包括以下几个步骤来识别文本 预处理&#xff1a;预处理是指对输入的图像进行处理&#xff0c;以提高文字识别的准确率。这可能包括调整图像大小、转换为灰度图像、二值化&#xff08;将图像转换为黑白两色&…

Android视角看鸿蒙第十一课-鸿蒙的布局之层叠布局Stack

Android视角看鸿蒙第十一课-鸿蒙的布局之层叠布局 导读 在Android中我个人认为&#xff0c;最离不开的就是LinearLayout和FrameLayout了&#xff0c;RelativeLayout我都基本不用的。 所以我把层叠布局排在了第二位。 官方描述 如何定义层叠布局 Stack组件为容器组件&#x…

瑞登梅尔邀您参观2024第13届生物发酵展精彩不容错过

参展企业介绍 我们&#xff0c;瑞登梅尔(上海)纤维贸易有限公司 致力于研究、开发和生产以植物为原料的高品质有机纤维。我们让这些有价值的天然物质的许多特性&#xff0c;能够广泛应用于现代工业的各个领域。 JRS的纤维产品是由天然的、可再生的原料制成。例如&#xff1a;…

泛微OA 自定义多选浏览框

1、建模引擎-》应用建模-》表单 2、建模引擎-》应用建模-》模块 3、建模引擎-》应用建模-》查询 4、把查询页面挂到前端页面。 效果展示&#xff1a; 5、建模引擎-》应用建模-》浏览框 6、流程表单中字段应用

遥感影像处理利器:PyTorch框架下CNN-Transformer,地物分类、目标检测、语义分割和点云分类

目录 专题一 深度卷积网络知识详解 专题二 PyTorch应用与实践&#xff08;遥感图像场景分类&#xff09; 专题三 卷积神经网络实践与目标检测 专题四 卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】 专题五 Transformer与遥感影像目标检测 专题六 Transformer的遥…

中药配方颗粒备案信息数据库<2.5W+备案>

中药配方颗粒备案信息是指中药配方颗粒生产企业向国家药品监督管理局申报备案的相关信息。备案信息包括中药配方颗粒的名称、备案号、备案时间、备案状态、生产企业、生产地址、规格、包装、执行标准、保质期、不良反应检测、备案省局等信息。 通过对中药配方颗粒备案信息的查…

完成产品兼容互认,用KubeBlocks可实现OceanBase集群管理

本文转载自云猿生聊技术&#xff08;CloudNativeDataTech&#xff09; 前言 KubeBlocks&#xff08;简称 KB&#xff09;在最新发布的0.7版本中&#xff0c;通过组件扩展&#xff08;Addon&#xff09;的形式新增了对OceanBase的支持功能。这一更新为企业级和非企业级用户提供…

数据结构6.2:二叉树的前中后序遍历

二叉树前中后序遍历代码实现 二叉树的遍历 二叉树的前序遍历 先输出父节点,再遍历左子树和右子树 二叉树的中序遍历 先遍历左子树,再输出父节点,再遍历右子树 二叉树的后序遍历 先遍历左子树,再遍历右子树,最后输出父节点 代码实现 每个节点中包含一个数据域和两个地址…

【VTKExamples::Meshes】第五期 ClipFrustum

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ClipFrustum,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. ClipFrustum …

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…

简析数据安全保护策略中的十个核心要素

数据显示&#xff0c;全球企业组织每年在数据安全防护上投入的资金已经超过千亿美元&#xff0c;但数据安全威胁态势依然严峻&#xff0c;其原因在于企业将更多资源投入到数据安全能力建设时&#xff0c;却忽视了这些工作本身的科学性与合理性。因此&#xff0c;企业在实施数据…

1.2 接口测试之基本介绍

接口测试之基本介绍 1、接口测试啊 接口测试也叫api&#xff0c; 定义&#xff1a;测试系统和系统之间的数据交换&#xff0c;模块与模块之间的数据交互&#xff0c;程序与程序之间的数据交互&#xff1b; 如&#xff1a; http://cms.duoceshi.cn/manage/loginJump.do登录接…

CVPR 2024 | 拖拽P图又双叒升级了!DragNoise实现更快更准的拖拽编辑

前言 新加坡管理大学何盛烽团队联合华南师范大学在 CVPR 2024 上发表了工作《Drag Your Noise: Interactive Point-based Editing via Diffusion Semantic Propagation》。这一工作聚焦于利用扩散模型语义传播实现交互式点控制的图像编辑&#xff0c;只需点几个点&#xff0c;即…

JVM从1%到99%【精选】-初步认识

目录 &#x1f95e;1.什么是JVM &#x1f37f;2.JVM的功能 &#x1f953;3.常见的JVM &#x1f32d;4.JVM的位置 &#x1f9c2;5.JVM的整体结构 &#x1f383;6.JVM的生命周期 &#x1f388;7.JVM的架构模型 1.什么是JVM JVM本质上是一个运行在计算机上的程序,他的职责…

YOLOv7创新改进: 小目标 |新颖的多尺度前馈网络(MSFN) | 2024年4月最新成果

💡💡💡本文独家改进:多尺度前馈网络(MSFN),通过提取不同尺度的特征来增强特征提取能力,2024年最新的改进思路 💡💡💡创新点:多尺度前馈网络创新十足,抢先使用 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect…

【THM】Metasploit: Introduction(简介)-初级渗透测试

介绍 Metasploit是使用最广泛的开发框架。Metasploit是一个强大的工具,可以支持渗透测试的所有阶段,从信息收集到后利用。 Metasploit有两个主要版本: Metasploit Pro:商业版本,有助于任务的自动化和管理。该版本有图形用户界面( GUI)。Metasploit Framework:从命令行…

水库水位监测:从传统到现代的技术革新与数据应用

水库&#xff0c;作为水利工程的关键设施&#xff0c;在防洪、灌溉、发电和供水等多个领域具有不可替代的作用。而水库的水位变化&#xff0c;直接关联到其功能的发挥及周边生态环境的稳定。因此&#xff0c;对于水库水位的科学、精准监测显得尤为关键。 一、传统方法的局限 过…

使用ORDER BY进行排序

ASC&#xff1a;升序&#xff0c;默认 DESC&#xff1a;降序 SELECT employee_id, first_name, salary FROM employees ORDER BY salary ASC; SELECT employee_id, first_name, salary FROM employees ORDER BY salary DESC; 二级排序 按salary降序&#xff0c;employee_id升…

【智能排班系统】基于SpringSecurity实现登录验证、权限验证

文章目录 SpringSecurity介绍sss-security实现依赖工具类Jwt工具JSON响应工具加密工具类 用户上下文用户信息实体类用户上下文 自定义重写自定义无权限的报错自定义密码加密自定义用户类 过滤器登录过滤器权限过滤器 Service登录Service 配置类说明登录验证权限验证IP流量限制 …