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

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

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.1if Controller

在實際工作中,當使用 Jmeter 進行介面測試或者效能測試時,有時需要根據不同條件做不同的操作,為了解決這個問題,Jmeter 提供了 IF 控制器。顧名思義,IF 控制器實現了程式碼中 IF 的功能,透過判斷表示式的 True/False 來判定是否執行相應的操作。透過條件判斷下邊的節點執行不執行。

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

2、關鍵引數說明如下:

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

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

Expression (must evaluate to true or false) : 表示式 (值必須是 true 或 false),也就是說,在右邊文字框中輸入的條件值必須是 true 或 false,(預設情況下)

Interpret Condition as Variable Expression?: 預設勾選項,將條件解釋為變數表示式(需要使用__jexl3 or __groovy 表示式)

Evaluate for all children?: 條件作用於每個子項(具體理解宏哥會在後邊實戰篇列舉例子說明),判斷條件是否針對所有子節點,預設不勾選,只在 if Controller 的入口處判斷一次。

注意:敲黑板!!!敲腦殼啦!!!

1、文字框上的黃色感嘆號,就是提示你,建議採用__jexl3 or __groovy 表示式,以提高效能,也就是預設的方式。

2、if 控制器 只能作用於其下的子項

4.1.1 預設用法

1、預設用法,就是採用__jexl3 or __groovy 表示式 if 控制器下有一個 訪問北京宏哥的部落格園首頁的取樣器,只有 if 條件滿足時,才會執行該取樣器。採用預設方式,將條件'北京宏哥'=='北京宏哥',放入 __jexl3 表示式中。如下圖所示:

2、如果不知道表示式如何使用,可使用 Jmeter 的函式助手,*函式助手圖示 > 選擇_jexl3 > 在值的輸入框輸入'北京宏哥'=='北京宏哥' > 點選 ‘生成’ > 全選 Ctrl+C 複製 > Ctrl+V 貼上到表示式處 *如下圖所示:

3、配置好以後,執行 JMeter,選擇 HTML,然後檢視結果樹,如下圖所示:

4.1.2 直接輸入條件

1、直接輸入只需要去掉 “ Interpret Condition as Variable Expression? ” 前面核取方塊,直接輸入條件: ** '北京宏哥'=='北京宏哥' ** 。訪問北京宏哥的部落格園的首頁的取樣器將被執行。如下圖所示:

2、配置好以後,執行 JMeter,選擇 HTML,然後檢視結果樹,如下圖所示:

4.13 條件中使用變數

我們在日常工作中在很多的測試場景下,需要根據使用者變數或者上一個取樣器的返回值來進行條件判斷,從而決定是否需要執行某一個的取樣器。

1、首先我們新增一個使用者變數:北京宏哥。條件:北京宏哥 的值為 宏哥 的時候,才執行訪問北京宏哥部落格園的首頁的取樣器。如下圖所示:

使用者變數及配置,如下圖所示:

2、IF Controller 及配置,或者可以用表示式: ${__jexl3('${北京宏哥}'=='宏哥' ,)} 。如下圖所示:

4.1.4Evaluate for all children? 的用法

1、宏哥在上面的小節中講解和分享了在條件中如何使用變數,我們假設一種測試場景:如果 if 控制器下的取樣器執行後,改變了該變數的值,if 控制器下 其後的取樣器還會被繼續執行嗎?跟隨宏哥一起來看看下面的列子:

2、改變 “ 北京宏哥 ” 變數的值為 “ 北京宏哥 ”,如下圖所示:

3、JMeter 執行過程的邏輯分析:

(1)if 控制器下 有 3 個取樣器,變數 北京宏哥 的初始值為 宏哥 ,if 控制器的條件為: ${__jexl3("${北京宏哥}"=="宏哥",)}

(2)開始執行的時候滿足條件,那麼按理說應該執行 訪問部落格園首頁訪問北京宏哥的部落格園首頁訪問宏哥的 JMeter 系列文章 3 個取樣器,

(3)但是 訪問北京宏哥的部落格園首頁 執行後,將 北京宏哥 的值變了 北京宏哥 ,已經不能滿足 *"${北京宏哥}"=="宏哥" *條件。

(4)所以 訪問宏哥的 JMeter 系列文章 這個取樣器不會被執行。

4、執行 JMeter,檢視結果樹,對比執行結果和宏哥分析的一致,如下圖所示:

5、如果這個時候,去掉 Evaluate for all children? 的勾選,會發生什麼呢,大家可以自己動手試試。修改後記得點選 “儲存”。下邊是宏哥的執行結果,如下下圖所示:

另外,如果時字串必須要用引號,變數都認為是字串的形式,如:${__jexl3("${北京宏哥}"=="宏哥",)}。

4.2Transaction Controller

  事務響應時間是我們衡量業務效能的主要指標,事務控制器可以把其他節點下的取樣器執行消耗時間累加在一起,便於統計。同時對每一個取樣器的執行時間進行統計。
  如果事務控制器下的取樣器有多個,只有當所有的取樣器都執行成功,整個事務控制器定義的事物才算成功。
  用於將 Test Plan 中的特定部分組織成一個 Transaction,JMeter 中 Transaction 的作用在於,可以針對 Transaction 統計其響應時間、吞吐量等。比如說,一個使用者操作可能需要多個 Sampler 來模擬,此時使用 Transaction Controller,可以更準確地得到該使用者操作的效能指標,如響應時間等。這個時間包含該控制器範圍內的所有處理時間,而不僅僅是取樣器的。

這個就非常有用了。我們前面有提到過事務的概念,有時候我們不關心單個請求的響應時間,而是關心一組相關請求的整體響應時間,怎麼來統計呢?就需要藉助事務這個概念,把這組請求,放到一個事務控制器下面。

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

2、關鍵引數說明如下:

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

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

generate parent sample: 選擇是否生成一個父取樣器;

include duration of timer and pre-post processors in generated samle: 是否包含定時器,選擇將在取樣器前與後加上延時。(宏哥建議大家不要勾選,否則統計就比較麻煩了,還需要你扣除延時)

4.2.1generate parent sample 用法

1、宏哥列舉一個測試場景:我們需要了解 訪問部落格園首頁 訪問北京宏哥的部落格園首頁這兩個請求的單個請求的響應時間,那麼就來看看如下例項。

(1)單個請求,那麼不勾選 generate parent sample,如下圖所示:

2、執行 JMeter,檢視聚合報告的單個請求的響應時間,如下圖所示:

1、宏哥列舉一個測試場景:我們需要了解 訪問部落格園首頁 訪問北京宏哥的部落格園首頁這兩個請求作為一組請求的響應時間,那麼就來看看如下例項。

(1)一組請求,那麼勾選 generate parent sample,如下圖所示:

2、執行 JMeter,檢視聚合報告的一組請求的響應時間,如下圖所示:

4.3Loop Controller

迴圈控制器可以控制在其節點下的元件的執行次數,可以是具體數字,也可以是變數。

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

2、關鍵引數說明如下:

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

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

Forever: 勾選上這一項表示一直迴圈下去。

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

如果同時設定了執行緒組的迴圈次數和迴圈控制器的迴圈次數,那迴圈控制器的子節點執行的次數為兩個數值相乘的結果。

4.3.1Thread Group 和迴圈控制器的區別

1、現在宏哥準備兩個請求,設定執行緒組 1 個執行緒,5 次 loop,下邊有一個請求:訪問北京宏哥的部落格園首頁 ** 一個 Loop Controller(設定 2 次 loop),下邊有一個請求:訪問部落格園首頁 **

(1)執行緒組,如下圖所示:

(2)迴圈控制器,如下圖所示:

2、執行 JMeter,檢視結果樹,為了清楚地看出結果,宏哥將第一個請求故意配置成失敗的;如下圖所示:

從上邊的結果可以看出:

(1)如果同時設定了執行緒組的迴圈次數和迴圈控制器的迴圈次數,那迴圈控制器的子節點執行的次數為兩個數值相乘的結果。

(2)執行順序是:先執行執行緒組裡的迴圈,再執行迴圈控制器裡的迴圈。

4.4While Controller

While 條件控制器,其節點下的元件將一直執行直到 While 條件為 false。

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

2、關鍵引數說明如下:

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

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

Condition: 接受變數表示式與變數。條件為 Flase 的時候,才會跳出 While 迴圈,否則一直執行 While 控制器下的元件。

3、While 控制器提供三個常量

(1)Blank:當迴圈中最後一個取樣器失敗後停止

(2)LAST:當循換前有取樣器失敗,不進入迴圈

(3)Otherwise:當判斷條件為 false 時,停止迴圈

4.4.1Blank

1、不填(空):當 While 控制器下最後一個樣例執行失敗後 跳出迴圈,如下圖所示:

2、執行 JMeter,檢視結果樹,(你可以透過滑鼠拖動最後失敗的取樣器,移動到第一個或者第二個位置的時候,執行 JMeter 後,會發現在一直執行);如下圖所示:

4.4.2LAST

LAST :當 While 控制器下最後一個樣例執行失敗後 跳出迴圈,如果 While 控制器 前一個樣例執行失敗,則不會進入 While 迴圈,也就是不會執行 While 控制器下的樣例。

1、取樣器樹還是上邊的位置和順序。這次我們在 While 控制器表示式處填寫:LAST,如下圖所示:

2、執行 JMeter,檢視結果樹,(你可以透過滑鼠拖動最後失敗的取樣器,移動到第一個或者第二個位置的時候,執行 JMeter 後,會發現在一直執行);細心的你可以發現迴圈只跑一遍,與不填 的結果是一樣的如下圖所示:

3、但是輸入 LAST 的時候,還會出現一個結果,那就是:如果 While 控制器 的前一個樣例執行失敗,則不會進入 While 控制器

在 While 控制器 前面 新增兩個取樣器:取樣器 1 訪問百度 ,取樣器 2 訪問北京宏哥 使取樣器 2 訪問北京宏哥 執行失敗。取樣器 2 必須在 While 控制器前邊且執行失敗。如下圖所示:

4、執行 JMeter,檢視結果樹,執行結果發現,取樣器 1、取樣器 2 執行了,但沒有進入 While 控制器,如下圖所示:

4.4.3Otherwise

自定義條件:值為 True 或 False 的函式/變數/屬性 表示式;類似前邊講解的 IF 控制器,宏哥這裡就照貓畫虎的舉個例子。

1、使用者自定義變數,變數名:北京宏哥,變數值:true,如下圖所示:

2、While 控制器配置,取到變數的值:${北京宏哥},填寫到表示式的地方,如下圖所示:

3、JMeter 執行過程的邏輯分析:

(1)北京宏哥使用者(執行緒組)下 有 1 個使用者自定義變數,變數 北京宏哥 的值為 true ,While 控制器的條件為:${北京宏哥} *取到的值始終是 * true

(2)所以一旦開始執行始終滿足條件,那麼按理說就應該一直執行 訪問部落格園首頁訪問北京宏哥的部落格園首頁訪問宏哥的 JMeter 系列文章 3 個取樣器,

4、執行 JMeter,檢視結果樹,(執行 JMeter 後,會發現在一直執行),對比一下,與宏哥的分析是不是高度一致哈;如下圖所示:

5.小結

好了,今天關於邏輯控制器的上篇就講解到這裡,這一篇主要介紹了 IF 控制器Transaction ControllerLoop ControllerWhile 控制器

相關文章