【问题标题】:Jmeter Include controller external script execution getting skipped when invoking it from TestNG test从TestNG测试调用时,Jmeter包括控制器外部脚本执行被跳过
【发布时间】:2019-10-18 05:08:46
【问题描述】:

我们有 JMeter 脚本,其中包含许多测试元素,例如测试片段,包括控制器、beanshell 采样器、ssh 采样器、JDBC 等。当我们尝试使用 Java 代码(如下)运行 JMX 脚本时,脚本的包含控制器部分被跳过。我们通过提及绝对路径和相对路径来使用包含控制器运行测试片段。请建议我们如何使用下面的 Java 代码在 JMX 文件中制作测试片段。

我们有一个 JMeter 脚本,比如 xyz.jmx,它是使用包含控制器从 ABC.jmx jemeter 脚本调用的。

public class Test_INV_TI_001_XML extends BaseClass {
StandardJMeterEngine jmeter = new StandardJMeterEngine();
Summariser summer = null;
JMeterResultCollector results;

@Test()
public void INV_TI_001_XML() throws Exception {
    File JmxFile1 = new File("/Path/To/JMX/File/ABC.jmx");
    HashTree testPlanTree = SaveService.loadTree(JmxFile1);

    JMeterTreeModel treeModel = new JMeterTreeModel();
    JMeterTreeNode root = (JMeterTreeNode) treeModel.getRoot();
    treeModel.addSubTree(testPlanTree, root);

    SearchByClass<ReplaceableController> replaceableControllers =
            new SearchByClass<>(ReplaceableController.class);
    testPlanTree.traverse(replaceableControllers);
    Collection<ReplaceableController> replaceableControllersRes = replaceableControllers.getSearchResults();
    for (ReplaceableController replaceableController : replaceableControllersRes) {
        replaceableController.resolveReplacementSubTree(root);
    }
    HashTree clonedTree = JMeter.convertSubTree(testPlanTree,true);
    jmeter.configure(clonedTree);


    String summariserName = JMeterUtils.getPropDefault("summariser.name", "TestSummary");
    if (summariserName.length() > 0) {
        summer = new Summariser(summariserName);
    }
    results = new JMeterResultCollector(summer);
    testPlanTree.add(testPlanTree.getArray()[0], results);

    jmeter.runTest();

    while (jmeter.isActive())
    {
        System.out.println("StandardJMeterEngine is Active...");
        Thread.sleep(3000);
    }

    if (results.isFailure())
    {
        TestAutomationLogger.error("TEST FAILED");
        Assert.fail("Response Code: " + JMeterResultCollector.getResponseCode() + "\n" + "Response Message: " + JMeterResultCollector.getResponseMessage() + "\n" + "Response Data: " + JMeterResultCollector.getResponseData());
    }
}

}

当使用上述代码执行 ABC.jmx 脚本时,在 ABC.jmx 脚本中调用的 xyz.jmx 也应该被调用并成功执行。

【问题讨论】:

    标签: jmeter testng


    【解决方案1】:
    1. 如果这是您的完整代码,它将无法正常工作,因为您需要调用 JMeterUtils.loadJMeterProperties() 函数
    2. 调用JMeterUtils.setJMeterHome()函数也是必不可少的
    3. 您的 .jmx 和测试片段脚本与什么相关?目前 JMeter 将在当前的 user.dir 文件夹中查找它们,如果脚本位于 JMeter 的“bin”文件夹中 - 您需要调用指向您的 ABC.jmx 脚​​本的 FileServer.setBaseDir() 函数并确保在包含控制器路径中相对于这个ABC.jmx

    查看Five Ways To Launch a JMeter Test without Using the JMeter GUI 文章以获取有关启动 JMeter 测试的各种方式的更多信息,很可能它更容易使用,即Apache Maven 用于协调您的测试执行,但是您将能够找到一些关于程序执行的信息的 JMeter 测试。

    【讨论】:

    • 感谢德米特里的评论。它开始工作了。我正在做的错误是我在下面的代码“testPlanTree”而不是“clonedTree”中调用。 testPlanTree.add(testPlanTree.getArray()[0], 结果);感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多