【问题标题】:Jmeter ${__setProperty()} Not working across multiple threads in the same thread groupJmeter ${__setProperty()} 不能跨同一线程组中的多个线程工作
【发布时间】:2019-11-26 01:50:39
【问题描述】:

我正在尝试在同一线程组中的多个线程之间进行 setproperty,后处理器使用 setproperty 设置新变量,以便可以跨多个线程访问它。

在 Beanshell 预处理器中,我有以下代码行。

${__setProperty("url", "youtube")};

在线程组下,我有 Beanshell 后处理器,在后处理器中有一行以下。

${__setProperty("url", "google")};

在线程组下,我有 Http Sampler,在主机名字段中我给出了 ${__property(url)}.com

目标是,当它第一次执行时,URL 将是 google.com,当第一个线程完成时 网址变为 youtube.com 但是 setProperty 只设置了 google,而后处理器中的第二个不起作用。

详情请参考下图,它显示了我是如何在 Jmeter 中创建元素的。

enter image description here

注意:这只是一个示例用例,但我有复杂的示例,但回答这个问题将帮助我在复杂脚本中添加逻辑。

谢谢

【问题讨论】:

    标签: multithreading jmeter


    【解决方案1】:

    那么,第一个完成的线程将更改所有随后创建的线程的 URL 的目标是什么?

    我对文档的理解是,您不能更改线程组内属性的值: Properties can be referenced in test plans - see Functions - read a property - but cannot be used for thread-specific values. (见http://jmeter.apache.org/usermanual/test_plan.html#properties

    我的假设是线程组中的每个线程都会获得属性的副本。如果您更改线程组内的属性值,那么您实际上是在更改该特定线程的副本。由于您在后处理器中对其进行更改,因此线程很可能即将被释放,从而导致您的更改丢失。处理后会创建一个新线程,但使用属性的原始值。

    所以你需要做的是弄清楚如何改变线程组之外的值。

    我在自己的测试中做了类似的事情,我在测试中间更改属性的值,所有活动线程组立即获取该值,从而创建每个新线程从那时起,获得新的价值。我通过使用 Beanshell 服务器来做到这一点:https://jmeter.apache.org/usermanual/best-practices.html#beanshell_server

    在我的具体情况下,我使用 jenkins 作业,该作业调用一个 shell 脚本,该脚本连接到在本地主机上运行的 beanshell 服务:

    java -jar ${jmeter_home}/apache-jmeter-5.0/lib/bshclient.jar localhost 9000 ${test_plan_home}/update_Prop.bsh "${property}" "${value}"

    我的 update_prop.bash 文件在哪里:

    import org.apache.jmeter.util.JMeterUtils;
    JMeterUtils.getJMeterProperties().setProperty(args[0],args[1]);
    

    不过,您不需要使用 Jenkins 或类似的东西 - 如果您将 JMeter 进程设置为包含 Beanshell-server(请参阅上面的链接),那么您可以简单地替换后处理器中的代码: ${__setProperty("url", "google")};

    使用代码连接到 beanshell 服务器并在 there 执行该命令: exec("./updateprop.bash url google");

    【讨论】:

      【解决方案2】:
      1. JMeter 属性是全局的,因此一旦您设置了该属性,它就可用于所有线程
      2. 每个 JMeter 线程(虚拟用户)都执行采样器。前处理器和后处理器遵守JMeter Scoping Rules 查看您的测试计划,执行顺序如下:

        1. Beanshell 预处理器
        2. HTTP 请求采样器
        3. Beanshell 后处理器

          因此 HTTP 请求采样器将从不命中 youtube(除非由于并发而遇到 race condition),因为 PreProcessor 会将 URL 设置回 google

      3. It is recommended to use JSR223 Test Elements and Groovy language for scripting 自 JMeter 3.1 起

      4. 不建议将JMeter Functions and/or variables 内联到脚本中,您需要使用“参数”部分或使用基于代码的等效项,因此您需要替换此行:

        ${__setProperty("url", "youtube")};
        

        用这个:

        props.put("url", "youtube");
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多