Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图用JMeterAPI生成JMeter测试计划(jmx):从代码创建的JMeter jmx文件与JMeter创建的文件不匹配_Jmeter_Jmx - Fatal编程技术网

试图用JMeterAPI生成JMeter测试计划(jmx):从代码创建的JMeter jmx文件与JMeter创建的文件不匹配

试图用JMeterAPI生成JMeter测试计划(jmx):从代码创建的JMeter jmx文件与JMeter创建的文件不匹配,jmeter,jmx,Jmeter,Jmx,我正在尝试使用JMeterJavaAPI创建JMeterJMX文件。这就是我所做的 gui.jmx 使用JMeterGUI应用程序创建一个参考jmx文件,我可以与之进行比较。在测试计划中,我只在线程组中添加了一个线程组和一个java采样器。所有值都是默认值 code.jmx 使用JMeterJavaAPI,我创建了一个包含测试计划、线程组和java采样器的jmx文件。所有值均按照案例1进行设置 从代码创建jmx文件后,我注意到以下差异 1) gui.jmx中的节点替换为code.jmx中的以下节

我正在尝试使用JMeterJavaAPI创建JMeterJMX文件。这就是我所做的

  • gui.jmx
  • 使用JMeterGUI应用程序创建一个参考jmx文件,我可以与之进行比较。在测试计划中,我只在线程组中添加了一个线程组和一个java采样器。所有值都是默认值

  • code.jmx
  • 使用JMeterJavaAPI,我创建了一个包含测试计划、线程组和java采样器的jmx文件。所有值均按照案例1进行设置

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

    1) gui.jmx中的节点替换为code.jmx中的以下节点

        <org.apache.jorphan.collections.HashTree>
    
    
    
    虽然这不是一个问题,但在GUI保存时是否可能以某种方式生成以下标记

        <hashTree>
    
    
    
    2) 测试元素节点包含gui.jmx中的属性“guiClass”和“testClass”,例如。 这些属性不是在code.jmx中生成的,我也没有找到任何API来显式设置它们->因此生成的code.jmx不会在jmeter gui控制台中打开。这可能意味着生成的jmx只能在非控制台模式下使用。这是故意的吗?是否有某种方法可以通过使用JMeterAPI的代码添加这些属性?(不使用DOM作为黑客)

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

        <hashTree>
        <TestPlan ...>
        ...
        </TestPlan>
        <hashTree>
        <ThreadGroup ...>
        ...
        </ThreadGroup>
        **<hashTree/>**
        </hashTree>
    </hashTree>
    
    <org.apache.jorphan.collections.HashTree>
        <TestPlan ...>
        ...
        </TestPlan>
        **<org.apache.jorphan.collections.HashTree/>**
        <ThreadGroup ...>
        ...
        </ThreadGroup>
        **<org.apache.jorphan.collections.HashTree/>**
    </org.apache.jorphan.collections.HashTree>
    
    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"));
        }
    }
    
    
    ...
    ...
    ****
    
    注意HashTree元素的嵌套。当这在JMeterGUI中打开时,元素彼此嵌套

    code.jmx的xml结构如下:

        <hashTree>
        <TestPlan ...>
        ...
        </TestPlan>
        <hashTree>
        <ThreadGroup ...>
        ...
        </ThreadGroup>
        **<hashTree/>**
        </hashTree>
    </hashTree>
    
    <org.apache.jorphan.collections.HashTree>
        <TestPlan ...>
        ...
        </TestPlan>
        **<org.apache.jorphan.collections.HashTree/>**
        <ThreadGroup ...>
        ...
        </ThreadGroup>
        **<org.apache.jorphan.collections.HashTree/>**
    </org.apache.jorphan.collections.HashTree>
    
    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"));
        }
    }
    
    
    ...
    ****
    ...
    ****
    

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

    从Java api创建JMeter测试实际上不受支持,您将测试计划暴露给JMeter中的更改

    我不会这么做

    我觉得您这样做是为了基于一些选择的变量动态创建测试脚本,这不是正确的方法

    我想做你想用的事情:

    • 它使您能够在命令行上传递属性

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


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

    testPlan.setProperty(TestElement.TEST_类,testPlan.CLASS.getName()); setProperty(TestElement.GUI_类,TestPlanGui.CLASS.getName())

    类似地,对于其他测试元素,如ThreadGroup、JavaSampler等

    完整代码如下:

        <hashTree>
        <TestPlan ...>
        ...
        </TestPlan>
        <hashTree>
        <ThreadGroup ...>
        ...
        </ThreadGroup>
        **<hashTree/>**
        </hashTree>
    </hashTree>
    
    <org.apache.jorphan.collections.HashTree>
        <TestPlan ...>
        ...
        </TestPlan>
        **<org.apache.jorphan.collections.HashTree/>**
        <ThreadGroup ...>
        ...
        </ThreadGroup>
        **<org.apache.jorphan.collections.HashTree/>**
    </org.apache.jorphan.collections.HashTree>
    
    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"));
        }
    }
    

    只是关于

    <org.apache.jorphan.collections.HashTree>
    
    
    
    如果在saveservice.properties文件中设置:

    hashTree=org.apache.jorphan.collections.hashTree

    而不是:

    hashTree=org.apache.jorphan.collections.ListedHashTree

    你会得到

      <hashTree>
    
    
    
    您能展示一下如何使用jmeter java api创建jmx吗?如果您一般询问如何创建jmx,您可以查看Blazemeter人员提供的示例代码,第1版)不是什么问题。在运行jmx时,它工作正常。问题3)现已解决。我将测试元素错误地添加到HashTree中。该结构现在与gui.jmx生成的结构相同。问题2)未得到解决。看起来,除非测试元素标记中不存在属性guiClass和testClass,否则jmx脚本甚至不会从命令行运行。在使用SaveService.saveTree保存测试元素时,我找不到添加这些属性的方法。是否有人成功地使用代码生成了jmx文件,然后从命令行运行它?最后,在查看jmeter源代码之后,我发现除了我正在做的事情之外,我还需要显式地设置GUI类和testClass参数
    testPlan.setProperty(TestElement.TEST_类,testPlan.CLASS.getName());setProperty(TestElement.GUI_类,TestPlanGui.CLASS.getName());你应该在一个新的答案中写下这一点并接受它。我们正在自动化我们的性能测试,并希望能够根据一些选择的变量动态创建测试脚本。我更新了我的答案,如果可以,你应该接受并接受。我检查了这一点。它让位于动态添加参数。我试图做的是动态添加采样器。根据选择的测试配置,我可能有2个java采样器或两个以上。每个采样器的参数也可能不同。采样器也可能涉及在它们之间传递数据。我需要为这个动态创建jmx文件。你可以用If控制器做第一件事,其余的用后处理器或CSV数据集,相信我你的方法是错误的,不会被维护PMD,我一定会研究你建议的方法。谢谢。你能发布这个例子的完整代码吗?我似乎仍然无法让它与您的更改一起工作。和/或您在哪些对象上设置了这些属性?我为每个TestElement设置了它们,并更改了“TestPlan”以匹配我设置它们的任何元素,但它似乎仍然没有执行我的HttpSampler。添加了代码。唯一的区别是我使用的是JavaSampler而不是HTTPSampler。