multithreading - 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 中创建元素。
注意:这只是一个示例用例,但我有复杂的示例,但回答这个问题将帮助我在复杂的脚本中添加逻辑。
谢谢
解决方案
那么第一个完成的线程的目标是改变所有随后创建的线程的 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");
推荐阅读
- featherlight.js - 在灯箱中创建第二个关闭按钮
- php - for循环的PHP超时问题
- android - Android中心的图像里面match_parent
- laravel - laravel 应用程序在部署到 AWS 时停止工作
- c# - 如何通过 C# 中的 onclick 值访问 html 元素?
- java - 即使用户不再触摸按钮,是否可以延长 android 上的按钮触摸效果?
- java - 如何使用函数返回 Iterable?
- java - 如何从字符串图像中获取像素 RGB 值?.get 不适用于 imageLoader(处理中)
- swift - 在这种情况下,“Promise”对于类型查找是模棱两可的
- php - 如何添加具有不同whenLoaded关系的相同数组键?