🔥Jmeter(十) - 從入門到精通 - JMeter 邏輯控制器 - 中篇(詳解教程)

北京-宏哥發表於2025-02-27

1.簡介

Jmeter 官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。

意思是說,邏輯控制器可以控制取樣器 (samplers) 的執行順序。由此可知,控制器需要和取樣器一起使用,否則控制器就沒有什麼意義了。放在控制器下面的所有的取樣器都會當做一個整體,執行時也會一起被執行。

JMeter 邏輯控制器可以對元件的執行邏輯進行控制,除僅一次控制器外,其他可以巢狀別的種類的邏輯控制器。

2.邏輯控制器分類

JMeter 中的 Logic Controller 分為兩類:
(1)控制測試計劃執行過程中節點的邏輯執行順序,如:Loop Controller、If Controller 等;
(2)對測試計劃中的指令碼進行分組、方便 JMeter 統計執行結果以及進行指令碼的執行時控制等,如:Throughput Controller、Transaction Controller。

3.預覽邏輯控制器

首先我們來看一下 JMeter 的邏輯控制器,路徑:執行緒組(使用者)->新增->邏輯控制器(Logic Controller);我們可以清楚地看到 JMeter5 中共有 17 個邏輯控制器,如下圖所示:

如果上圖您看得不是很清楚的話,宏哥總結了一個思維導圖,關於 JMeter5 的邏輯控制器型別,如下圖所示:

透過以上的瞭解,我們對邏輯控制器有了一個大致的瞭解和認識。下面宏哥就給小夥伴或則童鞋們分享講解一些通常在工作中會用到的邏輯控制器。

4.常用邏輯控制器詳解

  這一小節,宏哥就由上而下地詳細地講解一下常用的邏輯控制器。

4.1Critical Section Controller

我們先來看一下,官方原汁原味的解釋:The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will be executed by only one thread as a named lock will be taken before executing children of controller.

宏哥這個二把刀的翻譯,給你們翻譯一下這段鳥語看看到底是什麼意思,大致意思是: Critical Section Controller(臨界區控制器),確保它的子元素 (samplers /控制器等) 在執行控制器的子程式之前只執行一個執行緒作為指定的鎖。呵呵!看到這句話是不是覺得一頭霧水啊,摸一摸自己所剩無幾的頭髮陷入沉思中.....沒有關係的,不要糾結了,宏哥後邊會用具體例項講解一下,看完例項後,再回過頭來閱讀這句話,你就會恍然大悟了。

1、我們先來看看這個 Critical Section Controller 長得是啥樣子,路徑: 執行緒組 > 新增 > 邏輯控制器 > 臨界部分控制器 ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Lock name: 鎖名稱,這裡可以填入其子節點下執行的執行緒的名稱,這個執行緒作為一個全域性鎖存在

4.1.1 例項講解

這部分主要是透過配合例項我們來理解一下開始那句話到底什麼意思。

1、宏哥這裡先說一個訪問宏哥部落格園的 JMeter 系列文章的測試場景:我們第一步首先要訪問部落格園的首頁,第二步找到宏哥的訪問宏哥部落格園的首頁,第三步點選 JMeter 類別。按順序完成三步,才能完成這個測試場景。那麼我們根據這個場景用 JMeter 來新增多個請求的取樣器。如下圖所示:

2、指令碼除錯是通了,執行 JMeter,檢視結果樹,如下圖所示:

3、從上個圖,檢視結果樹中顯示請求結果資料不是按照順序請求,不符合預期,這個時候增加一個 critical section controller(臨界部分控制器),增加一個鎖,就能控制執行順序。如下圖所示:

4、指令碼除錯是通了,執行 JMeter,檢視結果樹,可以清楚地看出來是按預期的順序執行請求的。但是這樣響應時間會過長,這個後邊再做講解。如下圖所示:

4.1.2 鎖名分類

(1)鎖名為空,認為每個鎖為不同的鎖

1、宏哥透過具體例項,來看一下,建立鎖名為空的臨界部分控制器,如下圖所示:

2、執行 JMeter,檢視結果樹,如下圖所示:

(2)鎖名相同,多個鎖認為是同一個鎖,同一個時間點只能存在一個執行中

1、宏哥透過具體例項,來看一下,建立鎖名相同的臨界部分控制器,如下圖所示:

2、執行 JMeter,檢視結果樹,如下圖所示:

(3)鎖名為變數,根據變數值來判斷是不是屬於同一個鎖,變數值為相同時,則認為是同一個鎖

1、宏哥透過具體例項,來看一下,建立鎖名為變數的臨界部分控制器,如下圖所示:

2、執行 JMeter,檢視結果樹,如下圖所示:

4.2ForEach Controller

ForEach 控制器:一般搭配使用者變數使用。依次呼叫使用者定義的變數,直到最後一個,結束迴圈。為了滿足 ForEach Controller 提取資料,變數命名的格式一般為 “變數名_數字”,其中數字從 1 開始。
1、即遍歷迴圈控制器,顧名思義是定義一個迴圈規則。
2、用來遍歷當前元素的所有可執行場景。
3、在使用者自定義變數中讀取一系列相關的變數,該控制器下的取樣器或控制器都會被執行一次或多次,每次讀取不同的變數值。
4、這個控制器一般配合配置元件 → 正規表示式提取器來一起使用,可對頁面上的某些元素進行重複處理。

1、我們先來看看這個 ForEach Controller 長得是啥樣子,路徑: 執行緒組 > 新增 > 邏輯控制器 > ForEach 控制器 ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Input variable prefix: 輸入變數字首,可以在 “使用者自定義變數” 中定義一組變數,迴圈控制器可以從中獲取到變數對應的值,然後作為迴圈控制器的迴圈條件,還可以輸出變數作為取樣器的引數。

Start index for loop: 迴圈變數下標起點。迴圈指數開始(唯一)→ 遍歷查詢的變數範圍,開始的值(這裡如果不填寫,預設從 1 開始,如果沒有 1 開始的變數,執行時會報錯)

End index for loop: 迴圈變數下標終點。迴圈指數結束(包含)→ 遍歷查詢的變數範圍,結束的值

Output variable name: 輸出變數名稱,迴圈控制器生成的變數名稱。後續可透過 ${}引用

*Add "_" before number ?: *變數字首後是否加 “_” 作為分隔符。如果定義的變數名中有下劃線的話就要勾選此項,否則找不到;反之,沒有的話不要勾選,否則同樣找不到變數

4.2.1 例項講解

1、首先在自定義 5 個字首為 北京宏哥 的變數,值分別為 a b c d e。並且 北京宏哥 後面的數字是連續的,如果不連續,則不會被迴圈到,如下圖所示:

2、配置 ForEach 控制器,如下圖所示:

3、新增請求 訪問部落格園首頁 + 輸出值:${宏哥},輸出值是在控制器的輸出變數 宏哥,透過 ${宏哥} 取到輸出變數的值,如下圖所示:

4、新增檢視結果樹,執行 JMeter,檢視結果樹,如下圖所示:

注意:敲黑板,敲腦袋!!!

1、輸入變數的字尾數值一定要連續,比如 北京宏哥_1, ** 北京宏哥 _2, 北京宏哥 _3 ... 這樣,如果中間有不連續的,迴圈會中斷 **

2、迴圈開始的設定:如果變數為 ** 北京宏哥 _1, 北京宏哥 _2, 北京宏哥 _3,而設定的開始為 1,則會從 北京宏哥 _2 開始迴圈 **

3、迴圈結束的設定:如果變數有 3 個 ** 北京宏哥 _1, 北京宏哥 _2, 北京宏哥 _3,而設定的結束為 5,則只會迴圈 ** 北京宏哥 _1, 北京宏哥 _2, 北京宏哥 _3** ,如果設定的結束為 2,則會迴圈 ** 北京宏哥 _1, 北京宏哥 _2 。****

4.3Include Controller

Include 控制器用來匯入外部的測試片段(非完整的測試計劃),在執行時會執行匯入的測試計劃,但是被匯入的測試計劃有特殊要求,它不能有執行緒組,只能包含簡單的控制器及控制器下的元件。換句話說就是相當於加了一個執行單元,一個封裝了的業務操作單元,類似我們程式開發中的函式(方法)一樣。例如一個查詢學生資訊的業務操作我們用取樣器來模擬,然後放到簡單控制器中作為一個執行單元,別的地方也要用到時,我們可以不用重複造輪子直接引用過來。

一般來說,Include 控制器和測試片段(Test Fragment)配合使用的比較常見。

1、我們先來看看這個 include Controller 長得是啥樣子,路徑: 執行緒組 > 新增 > 邏輯控制器 > Include 控制器 ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Filename: 檔名,必輸欄位,如果沒有,就會報錯。透過 Filename 的路徑和檔名引用外部的 jmx 檔案。

宏哥推薦小夥伴或者童鞋們可以將 Include 控制器 ** 與 **Module 控制器(傳送門)一起對比著學習,Include 控制器 ** 是從外部檔案引用,只能引用整個測試片段的內容,Module 控制器 ** 是從內部檔案中引用,引用上相對比較靈活,可以只引用部分測試片段或模組內容。這樣一內一外不僅容易理解也容易記憶和學習。

4.3.1 例項

(1)當 Filename 路徑的值為空,程式執行報錯,指令碼執行中止,不會繼續執行下面的指令碼內容。

1、首先建立一個 Filename 路徑為空的測試計劃,如下圖所示:

2、執行 JMeter,檢視結果樹(程式執行報錯,指令碼執行中止,不會繼續執行下面 訪問部落格園首頁 的取樣器),如下圖所示:

(2)當 Filename 路徑中的檔案不存在,程式直接彈窗報錯並停止執行。

1、首先建立一個 Filename 路徑中的檔案不存在的測試計劃,點選 “儲存” 按鈕的時候,就會直接彈窗報錯。如下圖所示:

(3)當 Filename 路徑的檔案中不包含測試片段,跳過控制器,繼續向下執行。

1、首先建立一個外部引用沒有測試片段的測試計劃,如下圖所示:

2、建立一個 Filename 路徑的檔案中不包含測試片段的測試計劃,將上邊的外部引用 - 無測試片段檔案新增到 Include 控制器中,如下圖所示:

3、執行 JMeter,檢視結果樹(跳過控制器,繼續向下執行 訪問部落格園首頁 的取樣器),如下圖所示:

(3)當 Filename 路徑的檔案中包含測試片段,執行完控制器,再繼續向下執行。

1、首先建立一個外部引用有測試片段的測試計劃,如下圖所示:

2、建立一個 Filename 路徑的檔案中包含測試片段的測試計劃,將上邊的外部引用 - 有測試片段檔案新增到 Include 控制器中,如下圖所示:

3、執行 JMeter,檢視結果樹(執行完控制器裡的測試片段,再繼續向下執行 訪問部落格園首頁 的取樣器),如下圖所示:

到這裡,大家應該理解了 Include Controller 和 T*est Fragment* 了吧。宏哥的理解就是,Test Fragment 相當於一個獨立的部分,可以被其他測試計劃引用,實現 樣例的片段化,模組化,遇到重複需要的,比如登入、註冊之類的,就可以用Test FragmentInclude Controller 了。這樣可以避免重複造輪子,做許多無用功。

5.小結

  好了,今天關於邏輯控制器的上篇就講解到這裡,這一篇主要介紹了 Critical Section ControllerForEach ControllerInclude 控制器

相關文章