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

相關文章
相關標籤/搜索