当前位置: 首页 > 知识库问答 >
问题:

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

江衡
2023-03-14

我试图使用jmeter java API创建一个jmeter jmx文件。这就是我所做的,

  1. gui.jmx

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

    null
    <org.apache.jorphan.collections.HashTree>
    <hashTree>

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

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

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

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

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

共有1个答案

麹渊
2023-03-14

最后,在查看了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"));
    }
}
 类似资料:
  • 我正在使用JMeter API动态创建JMeter jmx文件。我能够在TestPlan中添加ThreadGroup,在ThreadGroup中添加JavaSampler。但是,当我在Java Sampler中添加CSVDataSet元素时,它无法正确保存。 以下代码用于创建新的CSVDataSet元素 使用SaveService保存时。saveTree,最终的jmx不包含所有设置的值。 如上所示

  • 我的应用程序将从用户那里获取jmx文件作为测试计划并执行它。我已经在我的应用程序后端(1个JMeter客户端和多个JMeter服务器)分发了JMeter设置。 我面临的挑战是执行测试计划所需的线程数。 < li >如果我从用户处显式获取#instances(执行测试的JMeter服务器)和#threads,如何在执行之前用该线程组配置用户提供的测试计划?这将允许我事先用我的集群和机器容量来验证这些

  • 我试图构建一个java应用程序,它可以读取一些访问文件,并动态地创建一些负载和/或功能测试场景。我使用的是jmeter API2.11。 应用程序将在CI(jenkins)中运行。现在,我听说过jmeter的一些Jenkins插件,它执行一些预定义的测试,并最终生成一个用户友好的图形化报告,但我还没有做到这一点。首先,我能够用httpSampler和一个线程/循环编写一个非常简单的测试。我可以使用

  • 继续这个问题-修改外部JMeter测试计划(JMX文件)的线程组 我的应用程序将从用户那里获取jmx文件作为测试计划并执行它。我已经在我的应用程序后端(1个JMeter客户端和多个JMeter服务器)分发了JMeter设置。 < li >是否有办法控制/限制该测试计划的RPS? < li >有没有办法在运行时修改这个用户提供的测试计划(不是我们创建的)的RPS?

  • 主要内容:第1步:启动JMeter窗口,第2步:添加/删除测试计划元素,第3步:加载并保存测试计划元素。,第4步:配置树元素。,第5步:保存JMeter测试计划。,第6步:运行JMeter测试计划。,第7步:停止JMeter测试计划。,第8步:检查JMeter测试计划执行日志。可以将测试计划可视化为用于运行测试的JMeter脚本。测试计划由测试元素组成,例如线程组,逻辑控制器,样本生成控制器,监听器,定时器,断言和配置元素。 每个测试计划中至少应有一个线程组。 我们可以根据要求添加或删除元素。

  • File jmeterHome=new File(system.getproperty(“jmeter.home”));String slash=System.GetProperty(“file.separator”);