今天我们来谈谈Jmeter源码中关于界面GUI操作的相关类,用于对界面的操作进行定制开发。基于此,我们再来分析一个Java代码调整Jmeter GUI的案例。
【GUI相关的Java类分析】:
1.GuiPackage类:
首先得从GuiPackage类获取instance,后续的界面操作都要基于此instance来进行。
示例代码:GuiPackage guiInstance = GuiPackage.getInstance();
2.JmeterTreeModel类:
Jmeter界面左侧的测试计划树,都要基于JmeterTreeModel类来进行。
该类,要重点掌握getChild(Object parent, int index )方法,getChildCount(Object parent)方法,和getTestPlan()方法。
注意:
getChild方法,返回的Object类型,后续使用需要进行类型转换。
getTestPlan()返回的并非TestPlan类型,而是HashTree类型。
示例代码:
JMeterTreeModel jm = guiInstance.getTreeModel(); Object obTestPlan = jm.getChild(jm.getRoot(), 0); HashTree testPlanTree = jm.getTestPlan();
3. JmeterTreeNode类:
重点掌握getUserObject() 方法。
注意:
getUserObject()返回的虽然是Object类型,但全都可转换为TestElement类型,再根据需要转换成具体的测试对象,如HTTPSampler类型。
【案例分析】:
承接上一篇:Jmeter源码实现多请求关联压测-CSDN博客。我们知道Jmeter中如果有多个请求,界面中上面的请求会先执行,如下图。在界面操作时,我们可以直接拖拽来实现上下调整;而通过代码如何能是实现这样一个简单的操作呢。
【核心代码】:
1.通过GuiPackage类获取Instance,再获取JmeterTreeModel,进而获取TestPlan(注意是Object类型)。
GuiPackage guiInstance = GuiPackage.getInstance(); JMeterTreeModel jm = guiInstance.getTreeModel(); Object obTestPlan = jm.getChild(jm.getRoot(), 0);
2.遍历obTestPlan,以获取SetupThreadGroup(注意也是Object类型)。
int TP_childCount = jm.getChildCount(obTestPlan); Object obThreadGroup = new Object(); for(int i=0; i<TP_childCount; i++){ obThreadGroup = jm.getChild(obTestPlan, i); if(obThreadGroup.toString().contains("SetupThreadGroup")){ break; } }
3.继续遍历obThreadGroup,以获取各个HTTPSampler(注意也是Object类型)。
注意,这时可以通过类型转换将Object转换为JMeterTreeNode,再使用getUserObject()方法和类型转换得到TestElement,接着就可以判断具体类型如HTTPSampler了。
int TG_childCount = jm.getChildCount(obThreadGroup); Object obHTTPSampler; for(int i=0; i<TG_childCount; i++){ obHTTPSampler = jm.getChild(obThreadGroup, i); JMeterTreeNode JTN = (JMeterTreeNode) obHTTPSampler; TestElement testElement = (TestElement) JTN.getUserObject(); if(testElement instanceof HTTPSampler) { //此处可以将你想要的对象存储下来 } }
4.在得到具体的TestElement(或HTTPSampler)类后,就可以通过getName()等方法来获取对象标识,用于调整其上下顺序了。
5.界面上下顺序调整:
注意:index为int,也就是你想调整的位置;其他参数均可以是JmeterTreeNode类型,在第3步转换为JmeterTreeNode类型后,需要将对象存下来,在这里使用。
guiInstance.getTreeModel().removeNodeFromParent(child);
guiInstance.getTreeModel().insertNodeInto(child,(JMeterTreeNode) obThreadGroup, index);
【验证结果】:
如下图,不管代码运行多少遍,3个http请求都会按顺序生成。
【后续】:
在分析了Jmeter GUI相关的类的后,本文只是介绍了一个最简单案例。基于此,还可以继续进行源码的定制和扩展。。。