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實戰》