性能测试工具 关于 Jmeter ${__setProperty (x,${x},)} ,${__property (x)} 函数不能实时取值问题

Mr.Wang · 2017年08月14日 · 最后由 zxqin 回复于 2019年07月23日 · 5230 次阅读

业务场景
一、登录系统后进行商品购买,进行做接口并发。

1、首先分了两个线程组 login、pay_buy_finish 如图:

2、获取接口 A 正则表达式提取的 session_sid 作为全局变量,login 线程只运行 1 次。如图:

3、把获取的 sid 作为全局变量传递给线程组 pay_buy_finish 中的请求使用:如图:

4、运行结果是这样:
线程组 login 运行 1 次

pay_buy_finish 运行 5 次
4 次错误结果:

1 次正确结果:

线程组 pay_buy_finish 总共运行 5 次,其中 4 次取值都不正确,只有 1 次取值正确。 如果有同学知道原因的请留言!

共收到 12 条回复 时间 点赞

图形界面没关闭过的情况下,上次运行时的__setProperty 会一直在,比如设置了属性 A=11;下次运行的时候初始 A 就=11,然后才是被重新赋值,看你的查看结果树是在 2 个线程组下的,你可以把它拉到外面,看下 login、pay_buy_finish 的执行顺序,如果是这个原因,可以把 login 改成 setup 的

北溟 回复

我在 nogui 下运行也是如此,貌似和关闭图形界面没关系

北溟 回复

正好也解决了我的疑问 十分感谢!

Mr.Wang 回复

另外我还有一个问题想要请教:设置全局变量后,在其他线程组中可以使用使用__property 获取到该全局变量,可是该全局变量如何在 beanshell 中使用呢?

Mr.Wang 关闭了讨论 08月15日 12:50
Mr.Wang 重新开启了讨论 08月15日 13:22

${__property (x)}也可以直接用在 beanShell 中的,但是就是简单的替换,我觉得用 props.get("x") 会更加安全,否则 x 属性值有特殊字符时,遇到一些逻辑处理可能就会有问题,比如字符串相加等,beanShell 窗口最下面有说明的有哪些可以用的内置对象

北溟 回复

setup 中定义全局变量 x,然后在其他线程组中 beanshell 里直接使用 ${__property (x)}会报错: Attempt to access property on undefined variable or class name ,使用 props.get("x"),提示 “ Undefined argument: x”

之前遇到过这个问题,我的解决方式是:在 beanshell 中设置参数:${__property(x)},然后在 beanshell script 中使用 bsh.args[0] 进行获取,可是我不是很喜欢这种方式~~

props.get("x") 你这个报错的话 Undefined argument: x
检查下是不是没加引号?

北溟 回复

哈哈~~果真 tks!!!

谢楼主帖子!

Mr.Wang 关闭了讨论 08月15日 19:14
Mr.Wang 重新开启了讨论 03月08日 10:46

User Defined Variables 控件作用域 ${__property(你的变量名称 NpushName,,)}

String pushName="u"+imei_4;
vars.put("pushName",pushName);
String pushName = bsh.args[4];
print("======pushName======== "+vars.get("pushName"));
${setProperty(NpushName,${pushName},)};
print("========NpushName====== "+${
P(NpushName,)});
print("========${property(NpushName,,)}====== "+" xxxxx __property xxxxx "+"${property(NpushName,,)}");

这样子就可以直接实时取值

北溟 回复

楼主你好。我这边关闭图形界面后,依然取到之前的值,请问要怎么才能取到现在的值啊

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册