Jmeter中多线程组的负载分布

Load Distribution for multiple thread group in Jmeter

在我的Jmeter 3.0 测试计划中,我有多个线程组。现在我想 按百分比分配用户。

我已经在用户定义的变量中声明了变量,然后在线程组中使用了以下语句

${__BeanShell(${__evalVar(threads)}*${__evalVar(WeightOfGroup1)}/100)}

但是我在这样做时遇到了以下异常

2017/09/20 19:25:39 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evaluation of: ``**ERROR - see log file*****ERROR - see log file**/100;'' Encountered "*" at line 1, column 1.

2017/09/20 19:25:39 WARN  - jmeter.functions.BeanShell: Error running BSH script org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval In file: inline evaluation of: ``**ERROR - see log file*****ERROR - see log file**/100;'' Encountered "*" at line 1, column 1.

您不能在线程组定义中使用变量,因为变量是线程的局部变量,因此在线程组启动其线程后被初始化。

您有 2 个选择:

  1. 使用属性,如this解决方案中所述。您尝试进行的计算也需要修改,例如:

    ${__javaScript(Math.max(1\,Math.round(props.get('threads')*props.get('WeightOfGroup1')/100)))}

    这里假设您同时定义了 threadsWeightOfGroup1 属性。另请注意,您需要将数字四舍五入为整数。为了避免以 0 个线程结束,我还采用了 1 和公式计算之间的最大值(因此它将 运行 至少一个线程)——这当然是可选的。

  2. 从您的用例来看,您实际上似乎不需要线程组。相反,您可以使用一个线程组,为每个以前是您的线程组的片段设置 Throughput Controller,并在吞吐量控制器参数中表达您的分配目标。在这种情况下,您不需要计算百分比,只需指定您需要的百分比即可,例如:

    我认为这个解决方案更优雅,所以除非有任何其他原因使用多个线程组,否则我会采用它。