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

Avi*_*Avi 5 jmx jmeter

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

  1. gui.jmx

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

  1. code.jmx

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

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

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

    <org.apache.jorphan.collections.HashTree>
Run Code Online (Sandbox Code Playgroud)

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

    <hashTree>
Run Code Online (Sandbox Code Playgroud)

2)测试元素节点在gui.jmx中包含属性'guiClass'和'testClass',例如,这些属性不是在code.jmx中生成的,我也没有找到任何API来显式设置它们- >由此生成的code.jmx没有在jmeter gui控制台中打开.这可能意味着生成的jmx只能在无控制台模式下使用.这是设计的吗?有没有办法通过代码使用jmeter apis添加这些属性?(不使用DOM作为黑客)

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

    <hashTree>
    <TestPlan ...>
    ...
    </TestPlan>
    <hashTree>
    <ThreadGroup ...>
    ...
    </ThreadGroup>
    **<hashTree/>**
    </hashTree>
</hashTree>
Run Code Online (Sandbox Code Playgroud)

请注意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>
Run Code Online (Sandbox Code Playgroud)

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

Avi*_*Avi 13

最后在查看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"));
    }
}
Run Code Online (Sandbox Code Playgroud)