首页 文章

尝试使用JMeter API生成JMeter测试计划(jmx):从代码创建的jmeter jmx文件与JMeter创建的文件之间不匹配

提问于
浏览
4

我正在尝试使用jmeter java api创建一个jmeter jmx文件 . 这就是我所做的,

  • gui.jmx

使用jmeter gui应用程序创建一个我可以比较的参考jmx文件 . 对于测试计划,我只在线程组中添加一个线程组和一个java采样器 . 所有值都是默认值 .

  • code.jmx

使用jmeter java api,我创建了一个包含测试计划,线程组和java sampler的jmx文件 . 所有值均根据情况1设置 .

从代码创建jmx文件后,我注意到以下差异,

1)gui.jmx中的节点由code.jmx中的以下内容替换

<org.apache.jorphan.collections.HashTree>

虽然这不是问题,但是可以以某种方式生成以下标记,因为GUI保存它

<hashTree>

2)测试元素节点包含gui.jmx中的属性'guiClass'和'testClass',例如这些属性不是在code.jmx中生成的,也没有找到任何显式设置它们的API -> Due to this the generated code.jmx does not open in the jmeter gui console. Which probably means that the generated jmx can be used in no console mode only. Is this by design? Is there some way by which these attributes can be added via code using the jmeter apis? (not using DOM as a hack)

3)gui.jmx的xml结构如下,

<hashTree>
    <TestPlan ...>
    ...
    </TestPlan>
    <hashTree>
    <ThreadGroup ...>
    ...
    </ThreadGroup>
    **<hashTree/>**
    </hashTree>
</hashTree>

请注意HashTree元素的嵌套 . 当在JMeter GUI中打开时,元素彼此嵌套 .

code.jmx的xml结构如下,

<org.apache.jorphan.collections.HashTree>
    <TestPlan ...>
    ...
    </TestPlan>
    **<org.apache.jorphan.collections.HashTree/>**
    <ThreadGroup ...>
    ...
    </ThreadGroup>
    **<org.apache.jorphan.collections.HashTree/>**
</org.apache.jorphan.collections.HashTree>

请注意标记位置的差异 . 没有筑巢 . 他们都处于同一水平 . 为什么会这样呢?使用jmx api添加测试元素的正确方法是什么,以便哈希树元素在第一种情况下彼此嵌套?

3 回答

  • 12

    最后在查看jmeter源代码之后,我想到除了我正在做的事情之外,我还需要显式设置guiClass和testClass参数

    testPlan.setProperty(TestElement.TEST_CLASS,TestPlan.class.getName()); testPlan.setProperty(TestElement.GUI_CLASS,TestPlanGui.class.getName());

    类似于其他测试元素,如ThreadGroup,JavaSampler等 .

    完整代码如下,

    package com.test;
    
    import java.io.FileOutputStream;
    
    import org.apache.jmeter.control.LoopController;
    import org.apache.jmeter.control.gui.LoopControlPanel;
    import org.apache.jmeter.control.gui.TestPlanGui;
    import org.apache.jmeter.protocol.java.control.gui.JavaTestSamplerGui;
    import org.apache.jmeter.protocol.java.sampler.JavaSampler;
    import org.apache.jmeter.save.SaveService;
    import org.apache.jmeter.testelement.TestElement;
    import org.apache.jmeter.testelement.TestPlan;
    import org.apache.jmeter.threads.ThreadGroup;
    import org.apache.jmeter.threads.gui.ThreadGroupGui;
    import org.apache.jmeter.util.JMeterUtils;
    import org.apache.jorphan.collections.HashTree;
    
    public class JMXCreator {
        public static void main(String[] argv) throws Exception {
            // Initialize the configuration variables
            String jmeterHome = "D:\\apache-jmeter-2.11";
            JMeterUtils.setJMeterHome(jmeterHome);
            JMeterUtils.loadJMeterProperties(JMeterUtils.getJMeterBinDir()
                    + "\\jmeter.properties");
            JMeterUtils.initLogging();
            JMeterUtils.initLocale();
    
            // TestPlan
            TestPlan testPlan = new TestPlan();
            testPlan.setName("Test Plan");
            testPlan.setEnabled(true);
            testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
            testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
    
            // ThreadGroup controller
            LoopController loopController = new LoopController();
            loopController.setEnabled(true);
            loopController.setLoops(5);
            loopController.setProperty(TestElement.TEST_CLASS,
                    LoopController.class.getName());
            loopController.setProperty(TestElement.GUI_CLASS,
                    LoopControlPanel.class.getName());
    
            // ThreadGroup
            ThreadGroup threadGroup = new ThreadGroup();
            threadGroup.setName("Thread Group");
            threadGroup.setEnabled(true);
            threadGroup.setSamplerController(loopController);
            threadGroup.setNumThreads(5);
            threadGroup.setRampUp(10);
            threadGroup.setProperty(TestElement.TEST_CLASS,
                    ThreadGroup.class.getName());
            threadGroup.setProperty(TestElement.GUI_CLASS,
                    ThreadGroupGui.class.getName());
    
            // JavaSampler
            JavaSampler javaSampler = new JavaSampler();
            javaSampler.setClassname("my.example.sampler");
            javaSampler.setEnabled(true);
            javaSampler.setProperty(TestElement.TEST_CLASS,
                    JavaSampler.class.getName());
            javaSampler.setProperty(TestElement.GUI_CLASS,
                    JavaTestSamplerGui.class.getName());
    
            // Create TestPlan hash tree
            HashTree testPlanHashTree = new HashTree();
            testPlanHashTree.add(testPlan);
    
            // Add ThreadGroup to TestPlan hash tree
            HashTree threadGroupHashTree = new HashTree();
            threadGroupHashTree = testPlanHashTree.add(testPlan, threadGroup);
    
            // Add Java Sampler to ThreadGroup hash tree
            HashTree javaSamplerHashTree = new HashTree();
            javaSamplerHashTree = threadGroupHashTree.add(javaSampler);
    
            // Save to jmx file
            SaveService.saveTree(testPlanHashTree, new FileOutputStream(
                    "d:\\test.jmx"));
        }
    }
    
  • 1

    只是评论

    <org.apache.jorphan.collections.HashTree>
    

    如果你在saveservice.properties文件中设置:

    hashTree = org.apache.jorphan.collections.HashTree

    代替:

    hashTree = org.apache.jorphan.collections.ListedHashTree

    你会得到

    <hashTree>
    
  • 0

    从Java Api创建JMeter测试不是真正支持的方法,您将测试计划公开给JMeter中的更改 .

    我不会这样做 .

    我似乎你这样做是为了根据一些选择的变量动态创建测试脚本,这不是正确的方法 .

    我JMeter做你想要你用的东西:

    还可以看看Jenkins和Maven的例子:

相关问题