Jmeter实现百分比业务比例 Jmeter实现百分比业务比例

Jmeter实现百分比业务比例

 

      相较于LoadRunner,jmeter在复杂场景方式貌似略有欠缺。前一段时间,想实现一个功能,若有两个采样器a与b,a采样器与b采样器被执行的几率分别为1/4与3/4,那么应该怎么实现呢?html

    在网上找了下资料,发现网上大多都是三种作法:java

    1.多线程方式,好比a采样器用20个线程,b线程用60个线程,这样比例即为1:3apache

       可是这样会产生一个问题,若按照时间维度执行,均执行10min,a采样器与b采样器的response时间不同,那么在这段时间内a与b的请求数没法作到1:3数组

 

    2.jmeter自带一个计算函数,使用该函数则可达到效果。多线程

      

   简述一下该控制器的功能,这个控制器为每一个请求计数,至关于给了他一个编号。分布式

   当参数为true时,每一个用户有本身的计数器,好比10个线程组,100个loop,这是计数器的值为1-100.ide

   当选择false,全局计算器,10个线程组,100个loop,计数器值为1-10000函数

   那么想使用1:3的比例时,则使用一个if控制器。oop

   条件分别为 ${__counter(true,)}%4==0 与${__counter(true,)}%4!=0post

    详见http://blog.csdn.net/selingchen/article/details/47844375

   

  3.使用JSR223 Sampler + Groovy

   在控制器中加入下面代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int [] values = ( int [])vars.getObject( "RANDOM_VALUES" );
if (values== null ) {
     values =  [ 0 , 1 , 2 , 3 , 2 , 3 , 1 , 3 , 2 , 3 ] as int [];
     vars.putObject( "RANDOM_VALUES" ,values);
}
// Increment that will be used in SwitchController value will be between 0 and 2
// because there are 3 TCs
Integer increment = (Integer)vars.getObject( "INCREMENT" );
if (increment== null ) {
     increment = Integer.valueOf( 0 );
} else  {
     increment = Integer.valueOf((increment.intValue()+ 1 )%values.length);   
}
String value = Integer.toString(values[increment.intValue()]);
 
vars.put( "SWITCH_VALUE" , value);
vars.putObject( "INCREMENT" , increment);
SampleResult.setResponseData( "SWITCH_VALUE from inside:" +value, null );
return  "SWITCH_VALUE:" +value;

  至关于每次都在给RANDOM_VALUES数组遍历,依次取里面的值,而后用if控制器判断,达到实现百分比的效果。

  详见:http://www.oschina.net/translate/jmeter-control-percentage-of-sampler?cmp

 

 

  针对上面三种方式进行比较:

  方案一不用说,有时候达不到百分比分发请求的效果,为下策。

  方案三通过试验,有一个很大的缺点,采用的是采样器,消耗就较大。尤为是遇到更加复杂的场景,好比有a,b两个场景,须要用一个JSR223采样器,a场景下面又有一个复合场景,须要按照比例分发请求(这种状况蛮常见的),这时又须要加一个采样器。这样的话,就显得太麻烦,若是用本地的jmeter,不用分布式,可能都会由于开销太大致使压力上不去。

  方案二:采用jmeter自己自带的计算器,倒不失为一个好的方法。可是针对一些复杂的场景,这个计算式有点难写,

  好比:3:2这个比例,我看到网上的实现都是${__counter(true,)}%2==1||${__counter(true,)}%3==0,

  这种计算方式就比较复杂了,那有没有简单一点实现方式呢?

  实际上是有的。

 

 好比下面场景:

  

 

那么表达式应该怎么写呢?

 上面有3的倍数,5的倍数,那么取其最小公倍数15,按照15分割。

均使用If控制器,表达式分别为:

a:  ${__counter(false,)}%15 <=5

b:  ${__counter(false,)}%15 >5

c:   ${__counter(false,)}%15==1

d:   ${__counter(false,)}%15>1&& ${__counter(false,)}%15<=5

总结规律:

按照最小的公倍数分割,每一个控制器取他们应占的份数。

上面的3:2的实现手段,就更容易了,一个占2/5,一个占3/5,彻底不须要写那么复杂的数学表达式~~~

 

 

转自:http://www.cnblogs.com/lzlfighter/p/5731300.html

相关文章
相关标签/搜索