目录
前言
BeanShell作为JMeter的强大扩展,可以帮助我们实现很多JMeter内置组件无法完成的工作。但是,我接触性能测试仅仅一年的时间,在项目中似乎很少有不使用BeanShell的。尤其最近一次因使用BeanShell导致JMeter OOM,而使测试中断后,我开始反思,是否必须要使用BeanShell才能完成呢?或许正是因为我对JMeter的了解不够,而之前又有多年的编码经验,才使我更加习惯于直接编码来解决问题,反而忽略了对JMeter工具本身的探索。
而且,JMeter官网也一再提醒:使用BeanShell会有性能问题。
所以,我开始思考之前做过的案例中,哪些BeanShell是否有可能被替代。还真让我找到了:
JMeter案例分享:使用JMeter内置函数生成uuid,如何控制一次迭代中仅生成一次?
前情回顾
同一个线程组中有两个请求,需要同一个uuid,但是,不同迭代中,需要不同的uuid。之前的思路是:使用BeanShell生成一个uuid,保存在一个自定义变量pic_uuid中:
vars.put("pic_uuid","${__UUID}");
然后,两个请求分别引用该自定义变量${pic_uuid},而非各自调用内置函数${__UUID},以免每次调用都生成一个随机值,导致两个请求中的uuid不一致而出错。
不使用BeanShell,还能用什么呢?
其实,解决问题的核心在于:只能调用一次内置函数${__UUID},所以,需要把调用的结果存在一个自定义变量中,后续需要的时候使用这个自定义的变量。
那么,JMeter中如何自定义一个变量呢?对了,User Parameters和User Defined Variables,下面,我们分别试一下。
1、User Parameters
如图,添加User Parameters,添加变量pic_uuid,并设置其值为${__UUID}:
替换掉原来的BeanShell:
执行一次,两个请求的uuid相同,看起来没问题:
2个用户并发,迭代2次:共执行4次,4组请求都满足:
- 每组请求中的uuid是一致的
- 不同组之间的uuid是不同的
综上,使用User Parameters可满足需求。
2、User Defined Variables
如图,添加User Defined Variables,添加变量pic_uuid,并设置其值为${__UUID}:
替换掉原来的BeanShell:
执行一次,两个请求的uuid相同,看起来没问题。
2个用户并发执行一次:
问题来了,四个请求的uuid全都一样。。显然,这不符合需求。不可以。
但是,我们也意外地发现了,User Defined Variables中所定义的变量,其实,是一个常量。
小结
综上可知,想要使${__UUID}在每次迭代中仅运行一次,可以使用BeanShell和User Parameters。 这两种方法哪一种更好?我并没有实际经验,但是官网中提示了BeanShell的性能问题,却未提示User Parameters有性能问题,所以,大概后者更好一点吧。而且,从对于新手的友好程度上来讲,似乎也是后者更好一些吧。
想要使${__UUID}在整个测试计划执行过程中仅运行一次,可以使用User Defined Variables。
遗留问题
至于User Defined Variables和User Parameters为什么会产生这种差异,等我学会了再来分享吧。