Jmeter實現百分比業務比例


      相較於LoadRunner,jmeter在復雜場景方式貌似略有欠缺。前一段時間,想實現一個功能,如有兩個采樣器a與b,a采樣器與b采樣器被執行的概率分別為1/4與3/4,那么應該怎么實現呢?

    在網上找了下資料,發現網上大多都是三種做法:

    1.多線程方式,比如a采樣器用20個線程,b線程用60個線程,這樣比例即為1:3

       但是這樣會產生一個問題,若按照時間維度執行,均執行10min,a采樣器與b采樣器的response時間不一樣,那么在這段時間內a與b的請求數無法做到1:3

 

    2.jmeter自帶一個計算函數,使用該函數則可達到效果。

      

   簡述一下該控制器的功能,這個控制器為每個請求計數,相當於給了他一個編號。

   當參數為true時,每個用戶有自己的計數器,比如10個線程組,100個loop,這是計數器的值為1-100.

   當選擇false,全局計算器,10個線程組,100個loop,計數器值為1-10000

   那么想使用1:3的比例時,則使用一個if控制器。

   條件分別為 ${__counter(true,)}%4==0 與${__counter(true,)}%4!=0

    詳見http://blog.csdn.net/selingchen/article/details/47844375

   

  3.使用JSR223 Sampler + Groovy

   在控制器中加入下面代碼

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,完全不需要寫那么復雜的數學表達式~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM