如何从采样器脚本

时间:2016-06-16 13:17:21

标签: jmeter

从JSR223 Sampler,我可以使用sampler变量访问当前的测试元素。

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

背景:

我想使用Groovy从JSR223 Sampler动态创建JDBC连接配置元素。

从其他问题(例如here)和网络搜索(例如here),我知道如何从上到下创建测试计划元素(例如,如何创建测试计划和从那里建造树)。所以我知道如何new DataSourceElement() TestElement,但我不知道如何将新元素添加到测试计划中。在采样器脚本中,我可以访问samplerSampler)和ctxJMeterContext)变量,但我不知道如何导航测试元素树。

我尝试使用sampler.addTestElement,但配置元素在sampler元素下并不真正有效。尽管如此,我尝试在JDBC请求中使用它时找不到配置元素(错误:" 找不到名为:' myDatabaseThreadPool',确保变量名匹配JDBC连接配置的变量名称")。

我希望如果我可以获得TestPlan元素并将config元素添加到该元素,那么它就可以工作。

FWIW,我的测试计划如下:

  • 测试计划
    • 线程组1(可以是设置线程组)
      • JSR223 Sampler(这是我想要创建动态配置的地方)
    • 线程组2(多线程)
      • JDBC请求(使用动态配置中指定的池变量名称)
    • 查看结果树

我可以进一步详细说明我为什么要动态创建JDBC连接配置,但 如果有一个关于如何从我的sampler脚本中导航测试元素树的简单答案我喜欢无论如何要知道

1 个答案:

答案 0 :(得分:1)

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

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

private HashTree 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指南以获取更多信息。