首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试用JMeter API生成jmx测试计划(jmx):由代码创建的jmx文件与由JMeter创建的jmx文件之间不匹配

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

Stack Overflow用户
提问于 2014-08-26 17:40:04
回答 3查看 9.3K关注 0票数 7

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

  1. gui.jmx

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

  1. code.jmx

使用jmeter,我创建了一个包含测试计划、线程组和java采样器的jmx文件。所有的值都是按照情况1设置的。

在根据代码创建jmx文件之后,我注意到以下不同之处,

1) gui.jmx中的节点在code.jmx中被替换为

代码语言:javascript
复制
    <org.apache.jorphan.collections.HashTree>

虽然这不是一个问题,但是否有可能在GUI保存时生成以下标记

代码语言:javascript
复制
    <hashTree>

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

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

代码语言:javascript
复制
    <hashTree>
    <TestPlan ...>
    ...
    </TestPlan>
    <hashTree>
    <ThreadGroup ...>
    ...
    </ThreadGroup>
    **<hashTree/>**
    </hashTree>
</hashTree>

注意HashTree元素的嵌套。当这在JMeter GUI中打开时,元素相互嵌套。

code.jmx的xml结构如下,

代码语言:javascript
复制
<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添加测试元素的正确方法是什么,以便像第一种情况一样,哈希树元素相互嵌套?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-30 18:22:55

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

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

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

完整的代码如下,

代码语言:javascript
复制
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"));
    }
}
票数 18
EN

Stack Overflow用户

发布于 2017-03-15 16:24:52

只是评论一下

代码语言:javascript
复制
<org.apache.jorphan.collections.HashTree>

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

hashTree=org.apache.jorphan.collections.HashTree

而不是:

hashTree=org.apache.jorphan.collections.ListedHashTree

你会得到

代码语言:javascript
复制
  <hashTree>
票数 2
EN

Stack Overflow用户

发布于 2014-08-27 16:53:32

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

我不会这么做的。

我认为您这样做是为了根据一些选定的变量动态创建测试脚本,这不是正确的方法。

我JMeter去做你想用的东西:

  • 用户定义变量
  • 性质函数,它允许您在命令行上传递属性。

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

  • http://anttikoivisto.blogspot.fi/2014/04/real-world-jmeter-03-running-with-jenkins.html
  • http://www.stevefenton.co.uk/Content/Blog/Date/201408/Blog/Switching-JMeter-Between-Integration-And-Load-Testing/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25511949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档