抓脑阔系列之Jmeter线程组之间的属性无法正常调用

这两天一直被一个问题所困扰,前两天研究了几个小时都没有处理好,颇为难受,下面就来讲讲是怎么回事。

众所周知,Jmeter中的全局变量和局部变量都只能在当前线程组中使用,跨线程是无法调用的,但不是没有办法,通过各种搜索,可以得到结论,有几种跨线程调用的方法,最为方便的一种就是使用函数助手的__setProperty和__P方法,但是当我自己上手使用时,才发现事情并不是那么简单。

操作过程如下:

1、线程组A中登录,提取token

2、将token值传入beanshell后置处理器,配合__setProperty函数传给线程组B要接收的token的参数名(假设为recv-token)

3、线程组B中使用用户参数结合__P函数接收recv_token

首先,这个方法用法没有错,可是,我的线程组B始终无法正确引用线程组A中的属性,结果如下:

可以看到,线程组B中的属性并未正确调用token的值,我们再来看看调式取样器,

调试取样器中竟然有token,说明线程组B已经正确拿到了线程组A中登录的token,可是为线程组B中却没有正确使用呢?

经过各种搜索无果后,无意间看到了测试计划中的一个选项,顿时恍然大悟,见下图,

勾选这个选项后,bingo....,

终于解决了上面所讲的问题。

原来不勾选这个选项时,测试计划下面的线程组并不是顺序执行完一个再执行一个,而是多线程运行机制,出现上述问题的原因在于线程组A登录后还没有到设置属性这一步时,线程组B的查询余额的请求已经开始发送,所以,线程组A不结束,线程组B是无论如何无法获取到A的属性的。

 

除了上述方法之外,还可以把设置属性函数直接放到调试取样器的名字当中,这样就不需要beanshell后置处理器了,并且Jmeter也建议不要使用beanshell后置处理器传属性,比如说在使用多个线程组的混合场景时,上面这个方法就无效了,并且beanshell的性能不高。

posted @ 2020-03-28 16:09  suanmiao  阅读(382)  评论(0编辑  收藏  举报