【问题标题】:How can I read variables from a JMeter test plan in my code?如何在我的代码中从 JMeter 测试计划中读取变量?
【发布时间】:2015-12-02 03:01:22
【问题描述】:

在我的 java 代码中,如何访问存储在 JMeter 测试计划(jmx 文件)中的值?专门尝试获取 ThreadGroup.num_threads 以便我的测试代码可以知道测试中使用了多少线程。

感谢您的回复。这是我最终使用的代码:

    int testThreadCount = 0;
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document testPlanFile = builder.parse(new File("path/to/testplan.jmx"));
    NodeList nodes = testPlanFile.getElementsByTagName("stringProp");
    for (int i = 0; i < nodes.getLength(); ++i)
    {
        Node node = nodes.item(i);
        Element element = (Element)node;
        String propName = element.getAttribute("name");
        if (propName.equals("ThreadGroup.num_threads"))
        {
            testThreadCount = Integer.parseInt(element.getChildNodes().item(0).getNodeValue());
            break;
        }
    }

【问题讨论】:

  • 您的意思是在自定义 java 采样器中吗?

标签: java jmeter


【解决方案1】:
  1. Java 方式(如果您要使用 Java API and XPath 从 .jmx 文件中获取值)

    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    
    Document xmlDocument = builder.parse(new File("/path/to/test.jmx"));
    
    XPath xPath = XPathFactory.newInstance().newXPath();
    String expression = "//hashTree/ThreadGroup/stringProp[@name='ThreadGroup.num_threads']/text()";
    NodeList matches = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
    
    for (int i = 0; i < matches.getLength(); ) {
        System.out.println("Thread Group " + (i + 1) + " users = " + matches.item(i).getTextContent());
        i++;
    }
    
  2. JMeter 方式(如果您使用的是JMeter API to read .jmx file

    JMeterUtils.loadJMeterProperties("/path/to/jmeter.properties");
    JMeterUtils.setJMeterHome("/path/to/jmeter");
    JMeterUtils.initLogging();
    JMeterUtils.initLocale();
    
    
    SaveService.loadProperties();
    
    
    StandardJMeterEngine jmeter = new StandardJMeterEngine();
    
    HashTree testPlanTree = SaveService.loadTree(new File("/path/to/test.jmx"));
    
    JMeterTreeModel treeModel = new JMeterTreeModel(new Object());
    JMeterTreeNode root = (JMeterTreeNode) treeModel.getRoot();
    treeModel.addSubTree(testPlanTree, root);
    
    SearchByClass<ThreadGroup> threadGroups = new SearchByClass<>(ThreadGroup.class);
    testPlanTree.traverse(threadGroups);
    Collection<ThreadGroup> threadGroupsRes = threadGroups.getSearchResults();
    for (ThreadGroup threadGroup : threadGroupsRes) {
        System.out.println(threadGroup.getProperty("ThreadGroup.num_threads"));
    }
    

【讨论】:

    【解决方案2】:

    在扩展 AbstractJavaSamplerClient 的自定义 java 采样器中,您可以访问 JavaSamplerContext 对象,该对象公开了一堆运行时属性

    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        ...
        // get parameters:
        String urlString = context.getParameter( "paramName" );
        ...
    }
    

    您可以在运行时从JMeterContextService 获取线程信息。当前活动线程数为

    JMeterContextService.getNumberOfThreads()
    

    【讨论】:

    • 当我尝试JMeterContextService.getNumberOfThreads()JMeterContextService.getTotalThreads() 时,我只看到第一个为0,第二个为1 或0,即使我将jmeter 线程组配置为7 个线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多