JMeter 插件开发:以编程方式将标准 ThreadGroup 添加到 Testplan 中

JMeter Plugin development: add standard ThreadGroup to Testplan programmatically

提问人:Matthias 提问时间:11/15/2023 更新时间:11/15/2023 访问量:21

问:

我正在尝试自己实现一个新的 JMeter 插件。到目前为止,我所做的是添加一个顶级菜单条目,并在单击它以启动我的插件工作流程时。

我想实现将 deafult ThreadGroup 添加到根 Testplan 中。我是这样尝试的:

public void addNewThreadGroupWithSamplers() {
    GuiPackage guiPackage = GuiPackage.getInstance();
    JMeterTreeNode testPlanNode = (JMeterTreeNode) guiPackage.getTreeModel().getRoot();

    // Create a new Thread Group
    ThreadGroup threadGroup = new ThreadGroup();
    threadGroup.setName("New Thread Group");

    // Add the new Thread Group to the Test Plan and get its node
    JMeterTreeNode threadGroupNode;
    try {
        threadGroupNode = guiPackage.getTreeModel().addComponent(threadGroup, testPlanNode);
    } catch (IllegalUserActionException e) {
        e.printStackTrace();
    }

    // Refresh the JMeter GUI
    guiPackage.getMainFrame().repaint();
}

不幸的是,我从 那里得到一个空指针异常,该异常指出JMeterTreeModel

Uncaught Exception java.lang.NullPointerException: Cannot invoke "org.apache.jmeter.gui.JMeterGUIComponent.clearGui()" because "guicomp" is null in thread Thread[AWT-EventQueue-0,6,main]. See log file for details.

异常发生在 JMeter 的这一行:

JMeterGUIComponent guicomp = guiPackage.getGui(component);

addComponent()

UI的某些内容似乎未初始化,或者可能是什么原因。您能否通过示例将我精确定位到lcation或提供解决方案?

Java JMemeter

评论


答:

1赞 Dmitri T 11/15/2023 #1

你缺少一些明显的必需元素,如Loop Controller,它是Thread Group的一个组成部分,以及通过TestElement提供的属性。

如果这确实是你要找的,你可以使用以下代码:

import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.threads.gui.ThreadGroupGui;
import org.apache.jmeter.gui.GuiPackage
import org.apache.jmeter.gui.tree.JMeterTreeNode
import org.apache.jmeter.exceptions.IllegalUserActionException
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.gui.LoopControlPanel;
import org.apache.jmeter.testelement.TestElement;

GuiPackage guiPackage = GuiPackage.getInstance();
JMeterTreeNode testPlanNode = (JMeterTreeNode) guiPackage.getTreeModel().getRoot();


LoopController loopController = new LoopController();
loopController.setLoops(1);
loopController.setFirst(true);
loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
loopController.initialize();


ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName("Example Thread Group");
threadGroup.setNumThreads(1);
threadGroup.setRampUp(1);
threadGroup.setSamplerController(loopController);
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());



JMeterTreeNode threadGroupNode;
try {
   threadGroupNode = guiPackage.getTreeModel().addComponent(threadGroup, testPlanNode);
} catch (IllegalUserActionException e) {
   e.printStackTrace();
}

// Refresh the JMeter GUI
guiPackage.getMainFrame().repaint();

演示:

enter image description here

更多信息:

但是,最好看一下以编程方式构建测试计划用户手册一章

评论

0赞 Matthias 11/15/2023
这非常有帮助。我完全不知道 LoopController。但是,使用 JSR223 Sampler 进行快速试验的技巧对我来说也非常好,感谢您再次提醒它。我知道采样器,但没有考虑使用它来创建新的节点元素。也感谢您提供进一步的阅读材料。这是一个很好的答案。