JMeter邏輯控制器完整介紹

自動化程式碼美學發表於2021-06-06

JMeter邏輯控制器可以對元件的執行邏輯進行控制,就像程式設計一樣,實現業務需求。

JMeter包括了以下邏輯控制器:

image-20210602125702490

一共17種。除了僅一次控制器外,其他控制器下可以巢狀別的種類的邏輯控制器。

If Controller

image-20210603114905093

控制此節點下的元件是否執行。

Expression:可以使用變數表示式或JavaScript。

勾選Interpret Condition as Variable Expression表示使用變數表示式,建議勾選上。

Use status of last Sample表示判斷上個取樣器是否成功,點選後會把${JMeterThread.last_sample_ok}新增到Expression輸入框中:

image-20210603123813310

Evaluate for all children:判斷條件是否針對所有的子節點,預設不勾選,只在If Controller入口處判斷一次,否則每次節點都會進行判斷。

Transaction Controller

image-20210603130929785

事務控制器能夠幫我們把一堆請求歸到一個大的事務中去,在報告分析時更方便。

Generate parent sample:是否生成父取樣結果,勾選後有兩個效果,一是Aggregate Report會看到Transaction Controller字樣,它把節點下的取樣器的執行結果(如消耗時間)累加在一起(注意事務控制器下如果有多個取樣器,全部取樣器都執行成功,整個事務控制器才算成功),比如:

image-20210603134736994

二是View Return Tree中會看到多一個結果,比如:

image-20210603134903626

Include duration of timer and pre-post processors in generated sample:包括定時器和前置-後置處理器的耗時,建議不用勾選,不然會影響統計結果。

Loop Controller

image-20210603130439893

跟執行緒組的Loop設定一樣。最終執行次數 = 執行緒組執行次數 x 迴圈控制器執行次數,比如執行緒組設定3次,迴圈控制器設定6次,那麼控制器下面的元件會執行18次。

While Controller

image-20210603102158130

其子節點下的元件將一直執行直到While條件為false。

Condition:接受變數表示式與變數,比如${inputVar}<10,當inputVar=7時,它的子節點將一直執行下去。

另外提供以下三個常量:

  • Blank:當迴圈中有取樣器失敗後停止。
  • LAST:當迴圈前有取樣器失敗則不進入迴圈。
  • Otherwise:當判斷條件為false時停止迴圈。

Critical Section Controller

image-20210603135042953

加鎖讓多執行緒順序執行。

比如,不加鎖,3個執行緒是並行執行的。:

image-20210603135645383

加鎖以後,變成順序執行了:

image-20210603135756370

ForEach Controller

image-20210602161433143

Input variable prefix:輸入變數字首。可以是使用者自定義變數裡面的多個變數如id_1, id_2, id_3(這裡就填寫id):

image-20210602162923818

也可以是正規表示式提取器匹配到的多個值(這裡就填寫varName):

image-20210602163146363

Start index for loop (exclusive):迴圈變數下標起點(不包括自己)。

End index for loop (inclusive):迴圈變數下標終點(包括自己)。

Output variable name:輸出變數名,比如returnVar,通過${returnVar}引用。

Add "_" before number:變數字首後是否加“_”作為分隔符。

示例:

image-20210602171152862

image-20210602163814127

Include Controller

image-20210602170315590

類似於程式中的函式,可以把其他.jmx檔案包含進來。

被匯入的測試計劃有特殊要求:不能有執行緒組,只能包含簡單控制器及控制器下的元件

比如一個查詢訂單的業務操作用Sampler來模擬,然後放到簡單控制器中作為一個執行單元,別的地方也要用到時,就可以不重寫直接引用過來。

Interleave Controller

其節點下的取樣器會交替執行。

image-20210603103110338

比如:

image-20210603104449388

1個執行緒迭代3次,執行順序是1 3, 2 3, 1 3。

Ignore sub-controller blocks:不執行子控制器,只執行當前這個交替控制器。比如:

image-20210603104638689

1個執行緒迭代4次,執行順序是1, 2, 3, 1,Loop Controller失效。注意,1 2 3是交替執行的,每次迭代只執行其中一個。(如果不勾選,Loop設定為2,那麼執行順序是:1, 2, 3 3, 1)

巢狀的例子:

image-20210603105406784

1個執行緒迭代5次,執行順序是:1, 3, 2, 4, 1。

Interleave across threads:跨執行緒交替執行。比如:

image-20210603110016555

3個執行緒2次迭代,不勾選的執行順序:1 2, 1 2, 1 2;勾選的執行順序:1 2, 2 3, 3 4。

Once Only Controller

image-20210603110413542

其子元件只執行一次。比如只登入一次,只讀取一次CSV,只連一次資料庫。

注意,子節點放個CSV Data Set Config,可以讓每個執行緒只讀一次,然後使用同一條資料進行反覆請求。

多個執行緒是一行一行取值的,不會重複。

比如:

image-20210603144054471

2個執行緒3次迭代,那麼:

  • 執行緒a只讀一次,取到尾號1845這條資料,然後用這條資料迭代請求3次。
  • 執行緒b只讀一次,取到尾號0740這條資料,然後用這條資料迭代請求3次。

Random Controller

image-20210603130054682

節點下的元件隨機執行,執行順序不定。

Ignore sub-controller blocks:不執行子控制器,只執行當前這個交替控制器。

Random Order Controller

image-20210603130320773

節點下的元件隨機執行,且每個元件只執行一次。

Recording Controller

image-20210603130826176

沒用。

Runtime Controller

image-20210602171326855

用來控制其子元件的執行時長。

Runtime單位為秒,預設為1,去掉1或者設定為0,它的子元件不執行。

Simple Controller

image-20210602165143999

簡單控制器很簡單,就是用來給Sampler分組的。它指定了一個執行單元,不會改變元件的執行順序。

示例:

image-20210602170154775

Throughput Controller

image-20210603112810046

控制子元件的執行次數(不能控制吞吐量,想控制吞吐量可以使用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

image-20210603125248483

在當前測試計劃中引入新的測試片段,測試片段由控制器、取樣器及輔助元件構成,能夠完成負載的模擬。

示例:

image-20210603125605964

把測試片段裡面的Loop Controller引了進來。

Module To Run:下拉選單,選擇引入哪一個指令碼片段(既包括測試片段也包括當前測試計劃的控制器)。

Switch Controller

image-20210602171831079

類似於高階語言中的Switch邏輯控制語句。

Switch Value:可以為數字,匹配取樣器編號(子節點中取樣器編號從0開始),不指定或指定編號超出了子節點數,則執行第0個取樣器;也可以為字元,匹配取樣器名稱,匹配不上就會預設查詢名稱為default的取樣器,如果沒有則不執行。

小結

本文對JMeter所有控制器進行了介紹,從這些控制器能感受到JMeter之所以這麼流行,是因為它實在太成熟了,這裡面的技術需要多少沉澱才能做得出來呀。有時間一定得看看JMeter的原始碼深度學習下。

參考資料:

《全棧效能測試修煉寶典JMeter實戰》

相關文章