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

如何从采样器脚本中导航JMeter测试元素树,jmeter,Jmeter,从JSR223采样器中,我可以使用Sampler变量访问当前测试元素 从那里,我如何导航TestElement对象的树?例如,我如何访问父测试元素(然后是它的父测试元素等),或者如何访问TestPlan测试元素 背景: 我想使用Groovy从JSR223采样器动态创建JDBC连接配置元素 通过其他问题(例如)和网络搜索(例如),我知道如何自上而下创建测试计划元素(例如,如何创建测试计划并从那里构建树)。因此,我知道如何执行newdatasourceelement(),这是一个TestElemen

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

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

背景:

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

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

我尝试只使用
sampler.addTestElement
,但在sampler元素下,config元素并不真正有效。尽管如此,我还是尝试了,但是当我尝试在JDBC请求中使用config元素时,没有找到它(错误:“没有找到名为‘myDatabaseThreadPool’的池,请确保变量名与JDBC连接配置的变量名匹配”)

我希望如果我能得到
TestPlan
元素并将config元素添加到其中,那么它就可以工作了

FWIW,我的测试计划如下:

  • 测试计划
    • 线程组1(可以是安装线程组)
      • JSR223采样器(我想在这里创建动态配置)
    • 线程组2(多线程)
      • JDBC请求(使用动态配置中指定的池变量名)
    • 查看结果树

我可以更详细地说明为什么我想动态创建JDBC连接配置,但是如果有一个简单的答案,关于如何从我的采样器脚本中导航测试元素树,我想知道,无论如何,正如您提到的,您可以通过
ctx
速记访问。因此,您可以通过
ctx.getEngine()访问类实例方法

查看您可以看到测试计划存储为HashTree结构:

private HashTree test;
因此,选择是:

  • 将访问修饰符更改为
    public
    ,并从源代码重新编译JMeter
  • 使用以访问
    测试
参考代码:

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"

查看指南,了解更多关于使用JMeter和Java API编写测试元素脚本的信息。

值得注意的是,groovy并不关心私有字段,因此如果您使用groovy脚本引擎(推荐使用),那么您只需访问ctx.getEngine().test字段。这是正常的机制功能,您可以从核心Java以及任何脚本语言访问私有字段和调用私有方法。