相較於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