试图用JMeterAPI生成JMeter测试计划(jmx):从代码创建的JMeter jmx文件与JMeter创建的文件不匹配
我正在尝试使用JMeterJavaAPI创建JMeterJMX文件。这就是我所做的试图用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中的以下节
<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中的更改 我不会这么做 我觉得您这样做是为了基于一些选择的变量动态创建测试脚本,这不是正确的方法 我想做你想用的事情:
- 它使您能够在命令行上传递属性
<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。