【问题标题】:How can I navigate the JMeter test element tree from within a sampler script如何从采样器脚本中导航 JMeter 测试元素树
【发布时间】:2016-10-18 01:04:53
【问题描述】:

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

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

背景:

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

通过其他问题(例如,here)和网络搜索(例如,here),我知道如何自上而下创建测试计划元素(例如,如何创建测试计划并向下构建树从那里)。所以我知道如何执行new DataSourceElement(),即TestElement,但我不知道如何将新元素添加到测试计划中。在采样器脚本中,我可以访问 sampler (Sampler) 和 ctx (JMeterContext) 变量,但我不知道如何导航测试元素树。

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

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

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

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

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

【问题讨论】:

    标签: jmeter


    【解决方案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"
    

    查看How to Use BeanShell: JMeter's Favorite Built-in Component 指南以获取更多信息,了解如何通过脚本测试元素使用 JMeter 和 Java API。

    【讨论】:

    • 值得注意的是,groovy 并不关心私有字段,因此如果您使用的是 groovy 脚本引擎(推荐),那么您只需访问 ctx.getEngine().test 字段就像这不关任何人的事。
    • 这是正常的Java Reflection机制功能,您可以从核心Java以及任何脚本语言访问私有字段和调用私有方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多