JMeter邏輯控制器可以對元件的執行邏輯進行控制,就像程式設計一樣,實現業務需求。
JMeter包括了以下邏輯控制器:
一共17種。除了僅一次控制器外,其他控制器下可以巢狀別的種類的邏輯控制器。
If Controller
控制此節點下的元件是否執行。
Expression:可以使用變數表示式或JavaScript。
勾選Interpret Condition as Variable Expression表示使用變數表示式,建議勾選上。
Use status of last Sample表示判斷上個取樣器是否成功,點選後會把${JMeterThread.last_sample_ok}
新增到Expression輸入框中:
Evaluate for all children:判斷條件是否針對所有的子節點,預設不勾選,只在If Controller入口處判斷一次,否則每次節點都會進行判斷。
Transaction Controller
事務控制器能夠幫我們把一堆請求歸到一個大的事務中去,在報告分析時更方便。
Generate parent sample:是否生成父取樣結果,勾選後有兩個效果,一是Aggregate Report會看到Transaction Controller字樣,它把節點下的取樣器的執行結果(如消耗時間)累加在一起(注意事務控制器下如果有多個取樣器,全部取樣器都執行成功,整個事務控制器才算成功),比如:
二是View Return Tree中會看到多一個結果,比如:
Include duration of timer and pre-post processors in generated sample:包括定時器和前置-後置處理器的耗時,建議不用勾選,不然會影響統計結果。
Loop Controller
跟執行緒組的Loop設定一樣。最終執行次數 = 執行緒組執行次數 x 迴圈控制器執行次數,比如執行緒組設定3次,迴圈控制器設定6次,那麼控制器下面的元件會執行18次。
While Controller
其子節點下的元件將一直執行直到While條件為false。
Condition:接受變數表示式與變數,比如${inputVar}<10
,當inputVar=7時,它的子節點將一直執行下去。
另外提供以下三個常量:
- Blank:當迴圈中有取樣器失敗後停止。
- LAST:當迴圈前有取樣器失敗則不進入迴圈。
- Otherwise:當判斷條件為false時停止迴圈。
Critical Section Controller
加鎖讓多執行緒順序執行。
比如,不加鎖,3個執行緒是並行執行的。:
加鎖以後,變成順序執行了:
ForEach Controller
Input variable prefix:輸入變數字首。可以是使用者自定義變數裡面的多個變數如id_1, id_2, id_3(這裡就填寫id
):
也可以是正規表示式提取器匹配到的多個值(這裡就填寫varName
):
Start index for loop (exclusive):迴圈變數下標起點(不包括自己)。
End index for loop (inclusive):迴圈變數下標終點(包括自己)。
Output variable name:輸出變數名,比如returnVar,通過${returnVar}
引用。
Add "_"
before number:變數字首後是否加“_”
作為分隔符。
示例:
Include Controller
類似於程式中的函式,可以把其他.jmx
檔案包含進來。
被匯入的測試計劃有特殊要求:不能有執行緒組,只能包含簡單控制器及控制器下的元件。
比如一個查詢訂單的業務操作用Sampler來模擬,然後放到簡單控制器中作為一個執行單元,別的地方也要用到時,就可以不重寫直接引用過來。
Interleave Controller
其節點下的取樣器會交替執行。
比如:
1個執行緒迭代3次,執行順序是1 3, 2 3, 1 3。
Ignore sub-controller blocks:不執行子控制器,只執行當前這個交替控制器。比如:
1個執行緒迭代4次,執行順序是1, 2, 3, 1,Loop Controller失效。注意,1 2 3是交替執行的,每次迭代只執行其中一個。(如果不勾選,Loop設定為2,那麼執行順序是:1, 2, 3 3, 1)
巢狀的例子:
1個執行緒迭代5次,執行順序是:1, 3, 2, 4, 1。
Interleave across threads:跨執行緒交替執行。比如:
3個執行緒2次迭代,不勾選的執行順序:1 2, 1 2, 1 2;勾選的執行順序:1 2, 2 3, 3 4。
Once Only Controller
其子元件只執行一次。比如只登入一次,只讀取一次CSV,只連一次資料庫。
注意,子節點放個CSV Data Set Config,可以讓每個執行緒只讀一次,然後使用同一條資料進行反覆請求。
多個執行緒是一行一行取值的,不會重複。
比如:
2個執行緒3次迭代,那麼:
- 執行緒a只讀一次,取到尾號1845這條資料,然後用這條資料迭代請求3次。
- 執行緒b只讀一次,取到尾號0740這條資料,然後用這條資料迭代請求3次。
Random Controller
節點下的元件隨機執行,執行順序不定。
Ignore sub-controller blocks:不執行子控制器,只執行當前這個交替控制器。
Random Order Controller
節點下的元件隨機執行,且每個元件只執行一次。
Recording Controller
沒用。
Runtime Controller
用來控制其子元件的執行時長。
Runtime單位為秒,預設為1,去掉1或者設定為0,它的子元件不執行。
Simple Controller
簡單控制器很簡單,就是用來給Sampler分組的。它指定了一個執行單元,不會改變元件的執行順序。
示例:
Throughput Controller
控制子元件的執行次數(不能控制吞吐量,想控制吞吐量可以使用Constant Throughput Timer)。
Percent Executions:按執行次數的百分比來計算控制的執行次數,此時Throughput取值是0~100。
Total Executions:按Throughput的值來指定執行次數。
Per User:只對Total Executions生效,勾選後每個執行緒單獨計算,不勾選則所有執行緒加起來計算。比如2個執行緒,每個執行緒迭代10次,Throughput值為6,,勾選Per User則分別計算分別執行6次共12次;不勾選Per User則加起來計算,共執行6次。
Module Controller
在當前測試計劃中引入新的測試片段,測試片段由控制器、取樣器及輔助元件構成,能夠完成負載的模擬。
示例:
把測試片段裡面的Loop Controller引了進來。
Module To Run:下拉選單,選擇引入哪一個指令碼片段(既包括測試片段也包括當前測試計劃的控制器)。
Switch Controller
類似於高階語言中的Switch邏輯控制語句。
Switch Value:可以為數字,匹配取樣器編號(子節點中取樣器編號從0開始),不指定或指定編號超出了子節點數,則執行第0個取樣器;也可以為字元,匹配取樣器名稱,匹配不上就會預設查詢名稱為default的取樣器,如果沒有則不執行。
小結
本文對JMeter所有控制器進行了介紹,從這些控制器能感受到JMeter之所以這麼流行,是因為它實在太成熟了,這裡面的技術需要多少沉澱才能做得出來呀。有時間一定得看看JMeter的原始碼深度學習下。
參考資料:
《全棧效能測試修煉寶典JMeter實戰》