如何从采样器脚本中导航JMeter测试元素树
从JSR223采样器中,我可以使用如何从采样器脚本中导航JMeter测试元素树,jmeter,Jmeter,从JSR223采样器中,我可以使用Sampler变量访问当前测试元素 从那里,我如何导航TestElement对象的树?例如,我如何访问父测试元素(然后是它的父测试元素等),或者如何访问TestPlan测试元素 背景: 我想使用Groovy从JSR223采样器动态创建JDBC连接配置元素 通过其他问题(例如)和网络搜索(例如),我知道如何自上而下创建测试计划元素(例如,如何创建测试计划并从那里构建树)。因此,我知道如何执行newdatasourceelement(),这是一个TestElemen
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请求(使用动态配置中指定的池变量名)
- 查看结果树
- 线程组1(可以是安装线程组)
我可以更详细地说明为什么我想动态创建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以及任何脚本语言访问私有字段和调用私有方法。