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

如何从采样器脚本中导航 JMeter 测试元素树

暴辰龙
2023-03-14

从JSR223采样器,我可以使用采样器变量访问当前测试元素。

从那里,我如何导航< code>TestElement对象的树?例如,我如何访问父测试元素(然后它是父的,等等)或者我如何访问< code>TestPlan测试元素?

背景:

我想使用Groovy从JSR223采样器中动态创建一个JDBC连接配置元素。

从其他问题(例如,这里)和网络搜索(例如,这里),我知道如何自上而下地创建测试计划元素(例如,如何创建测试计划并从那里构建树)。因此,我知道如何执行新的数据源元素(),这是一个测试元素,但我不知道如何将该新元素添加到测试计划中。在采样器脚本中,我可以访问采样器(采样器)和ctx(JMeterContext)变量,但我不知道如何导航测试元素树。

我尝试只使用< code > sampler . addtestelement ,但是配置元素在sampler元素下实际上是无效的。尽管如此,我还是做了尝试,但当我试图在JDBC请求中使用config元素时,找不到它(错误:“未找到名为:' myDatabaseThreadPool '的池,请确保变量名与JDBC连接配置的变量名匹配”)。

我希望如果我能得到TestPlan元素并添加配置元素,那么它就会起作用。

FWIW,我的测试计划是这样的:

    < li >测试计划 < ul > < li >线程组1(可能是设置线程组) < ul > < li>JSR223采样器(这是我想要创建动态配置的地方)
  • JDBC 请求(使用动态配置中指定的池变量名称)

我可以更详细地介绍为什么我要动态创建 JDBC 连接配置,但是如果有一个简单的答案,说明如何从我的采样器脚本中导航测试元素树,我无论如何都想知道。

共有1个答案

司空福
2023-03-14

正如您所提到的,您可以通过ctx速记访问JMeterContext。因此,您可以通过ctx访问StandardJMeterEngine类实例。获取引擎() 方法。

查看StandardJMeterEngine源代码,您可以看到测试计划被存储为HashTree结构:

private HashTree test;

因此,选择如下:

  • 将访问修饰符更改为公共,并从源重新编译 JMeter
  • 使用跟踪 - Java 反射 API 以访问测试

参考代码:

import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.collections.SearchByClass;

import java.lang.reflect.Field;
import java.util.Collection;

StandardJMeterEngine engine = ctx.getEngine();
Field test = engine.getClass().getDeclaredField("test");
test.setAccessible(true);
HashTree testPlanTree = (HashTree) test.get(engine);

SearchByClass testPlans = new SearchByClass(TestPlan.class);
testPlanTree.traverse(testPlans);
Collection testPlansRes = testPlans.getSearchResults();

TestPlan testPlan = (TestPlan)testPlansRes.toArray()[0];
//do what you need with "testPlanTree" and/or "testPlan"

查看How to Use BeanShell:JMeter’s Favorite Built-in Component指南,了解从脚本测试元素中使用JMeter和JavaAPI的更多信息。

 类似资料:
  • 我在jmeter中面临一个问题,我想知道我能否解决这个问题。我需要在远程计算机上运行一个脚本。当我在电脑上通过命令行运行脚本时,它正在工作。 我想在我的计算机上用Jmeter运行它(与脚本运行相同)。我尝试了ssh采样器,但没有成功。我想使用操作系统采样器。可以吗?我可以在远程计算机上运行脚本吗?我找到的唯一解释来自blazemeter网站,并提到:“同样,由于通过操作系统进程采样器运行“plin

  • 我想知道,如何在groovy脚本中对a做出反应。我正在使用While控制器迭代CSV中的所有行,并在实际测试计划之前生成JMeter变量。对于不同的CSV文件,我需要多次执行此操作,因此我不想在While控制器中停止线程。 我想象了这样的事情: CSV_VALUE1是JMeter变量的值,CSV_VALUE2是变量的名称。 测试计划 我也很欣赏更好的解决方案,它遍历CSV文件的每一行,并根据我的约

  • null 有什么主意吗?我该怎么做?我知道我不能只使用Once Controller,因为每个请求也是由每个线程执行的。

  • 但是根据目前的需求,我们需要从mongodb中获取数据,将这些动态值传递给HTTP请求采样器,我的意思是我们需要根据数据库中的动态值构建HTTP请求采样器? 你能不能请谁帮我一下。

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

  • 我可以点击每个请求,按“发送”,一次运行一个。我将。json从loadium导出到。jmx 测试计划-->线程组-->[采样器1,采样器2,..]这些采样器是我的每个请求,我希望一次只运行一个,但是当我按下“run”按钮时,所有的采样器/请求都开始运行。