从JSR223 Sampler,我可以使用sampler
变量访问当前的测试元素。
从那里,我如何导航TestElement
对象的树?例如,如何访问父测试元素(然后是父元素等),或者如何访问TestPlan
测试元素?
背景:
我想使用Groovy从JSR223 Sampler动态创建JDBC连接配置元素。
从其他问题(例如here)和网络搜索(例如here),我知道如何从上到下创建测试计划元素(例如,如何创建测试计划和从那里建造树)。所以我知道如何new DataSourceElement()
TestElement
,但我不知道如何将新元素添加到测试计划中。在采样器脚本中,我可以访问sampler
(Sampler)和ctx
(JMeterContext)变量,但我不知道如何导航测试元素树。
我尝试使用sampler.addTestElement
,但配置元素在sampler元素下并不真正有效。尽管如此,我尝试在JDBC请求中使用它时找不到配置元素(错误:" 找不到名为:' myDatabaseThreadPool',确保变量名匹配JDBC连接配置的变量名称")。
我希望如果我可以获得TestPlan
元素并将config元素添加到该元素,那么它就可以工作。
FWIW,我的测试计划如下:
我可以进一步详细说明我为什么要动态创建JDBC连接配置,但 如果有一个关于如何从我的sampler脚本中导航测试元素树的简单答案我喜欢无论如何要知道 。
答案 0 :(得分:1)
正如您所提到的,您可以通过ctx
速记访问JMeterContext。因此,您可以通过ctx.getEngine();
方法访问StandardJMeterEngine类实例。
查看StandardJMeterEngine source您可以看到测试计划存储为HashTree结构:
private HashTree test;
所以选择是:
public
并从源test
值参考代码:
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查看How to Use BeanShell: JMeter's Favorite Built-in Component指南以获取更多信息。