首页 > 解决方案 > Jmeter ${__setProperty()} 不能跨同一线程组中的多个线程工作

问题描述

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

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

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

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

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

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

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

有关详细信息,请参阅下图,它显示了我如何在 Jmeter 中创建元素。

在此处输入图像描述

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

谢谢

标签: multithreadingjmeter

解决方案


那么第一个完成的线程的目标是改变所有随后创建的线程的 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 作业,该作业调用连接到本地主机上运行的 beanshell-service 的 shell 脚本:

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 服务器并在那里执行该命令: exec("./updateprop.bash url google");


推荐阅读