jmeter控制多接口压测执行比例

1、利用__counter()函数搭配if控制器

如果想用${__counter(参数1,参数2)}函数,那么就要首先了解这个函数的作用是什么。

参数1:只能是true,false。如果您希望每个模拟用户的计数器保持独立并与其他用户分开,则为TRUE。 False是对全局请求进行计数。如果=false就是统计全部执行的线程,不论这个线程执行那个取样器都被统计。

参数2:用于重用此函数创建的值的引用名称。存储的值的格式为$ {refName}。这允许您保留一个计数器并在多个位置引用其值。就是你把计数器的值保存到一个变量中,可以使用这个变量。

这个需要结合if控制器一起使用,每个取样器被执行前需要if控制器做判断,本次调用是否可以执行这个取样器,由于if控制器的表达式必须返回的true或者是false,所以需要结合函数__jexl3来使用,这个函数就是转换表达式为boolean值。

jmeter控制多接口压测执行比例

 

demo中期望取样器getUserAppToken-an-30%调用量:getUserAppToken-user-70%调用量的执行比例是3:7,那么if控制器的表达式分别是:

getUserAppToken-an-30%对应的if控制器表达式:${__jexl3(${__counter(false,threadNum)}%10<3,)}

getUserAppToken-user-70%对应的if控制器表达式:${__jexl3(${__counter(false,threadNum)}%10>=3,)}

表达式的解释:连个接口的执行比例是3:7那么就是分成10分第一个方法执行30,第二个方法执行70,那么根据计数器的当前的值取10的模如果小于3就执行方法1如果大于3就执行方法2,这个是个数学题了,如果多个方法,比例不同那么还是需要先计算好这个比例。根据上面的设置执行方法,执行完后的结果如下图:

jmeter控制多接口压测执行比例

 

2、利用逻辑控制器-switch控制器(switch Controller)

switch控制器能保证每次执行只有一个样本产生,至于是哪个样本被执行,需要取决于随机数的值就是switch控制器的Switch Value的值。所以在执行这个控制器之前需要先产生switchValue的值,比如,当switch value值为0时,执行HTTP请求–001,而不执行HTTP请求–002,当switch value值为1时,执行HTTP请求–002,而不执行HTTP请求–001。如果通过生成switchValue的值的形式来控制接口的执行比例那么就需要一个JSR223 Sampler来辅助产生这个随机数。

jmeter控制多接口压测执行比例

 

关于JSR223 Sampler随机数的生成脚本如下

jmeter控制多接口压测执行比例

 

Groovy脚本具体内如如下:

log.info("------switch controller start------");
int[] values = (int[])vars.getObject("RANDOM_VALUES");
//log.info("1、values:" + values);
if(values==null || values.size() ==0) {
values = [0,1,0,0,1,0,0,0,0,1] as int[];
vars.putObject("RANDOM_VALUES",values);
}
//log.info("2、values:" + values);
String increment = vars.get("step");
//log.info("3、increment:" + increment);
int index = 0;
if(increment==null) {
} else {
index = Integer.valueOf((Integer.parseInt(increment)+1)%values.length);
}
String value = Integer.toString(values[index.intValue()]);
vars.put("SWITCH_VALUE", value);
//log.info("4、value:" +value);
vars.put("step", String.valueOf(index));
SampleResult.setResponseData("SWITCH_VALUE from inside:"+value, null);
return "SWITCH_VALUE:"+value;

针对本次的demo,getUserAppToken-user-001接口:getUserAppToken-an-002的比例是7:3,所以数据values的值也是根据比例产生出来的,不是随便生成的一个数组。step是用来存放本次数据的下标值,用变量存放起来为了作为数组下标移动的指针。同时产生Switch控制器需要的switchValue的值。执行结果如下:

jmeter控制多接口压测执行比例

 

执行比例是7:3,如果有更多的方法那么久需要考虑脚本里面的数组的值,数组值对应的就是期望执行的样本编号。对应switch控制器的使用是需要脚本辅助的,但是使用脚本的缺点就是:脚本虽然有效,但是不高效,所以只有当你找不到元素时才编写脚本。

3、Throughput Contoller控制器

Throughput Contoller,直译是吞吐量控制器,它是用来控制该控制器下面元件的执行次数,与控制吞吐量的功能无关。(注:用Constant Throughput Timer可以控制吞吐量。)

Throughput Contoller有两种模式:Total Executions 和Percent Executions

参数说明如下:

  • Total Executions:按吞吐量值来指定执行次数。选择此模式,吞吐量值的单位为“次”。
  •  Percent Executions:按百分比来指定执行次数。选择此模式,吞吐量值的单位为“%”。
  • 吞吐量:该值可以是任意整数,如果小于等于0,则一次也不执行。
  • Per User:如果勾选该项则按虚拟用户数(线程数)来计算执行次数,如果没有选中该项则按所有虚拟用户数来计算执行次数。

jmeter控制多接口压测执行比例

 

具体demo如下图,方法001设置的权重是30%

jmeter控制多接口压测执行比例

 

方法002的权重是70%

jmeter控制多接口压测执行比例

 

执行结果如下所示:

jmeter控制多接口压测执行比例

 

注意点就是后面的选择不同,参数怎么写,具体可以参考https://www.cnblogs.com/luihengk/p/7407186.html

4、使用插件-Weighted Switch Controller

首先要安装插件Weighted Switch Controller,方法是点击菜单Options→Plugins Manager,如果发现你没有这个菜单那么是插件管理这个扩展jar包还没有下载,需要先下载扩展jar然后放到jmeter安装目录下的\lib\ext下面。然后在搜索框中搜索,然后安装。

jmeter控制多接口压测执行比例

 

这种方法就真的太简单了,没什么可说的,添加Weighted Switch Controller,在这个控制器下添加取样器,然后在Weighted Switch Controller中设置业务方法调用比例即可,如图:

jmeter控制多接口压测执行比例

 

执行后的结果如下:

jmeter控制多接口压测执行比例