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
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 Controller、Loop Controller和While控制器。
您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得隨手點波 推薦 不要忘記哦!!!
別忘了點 推薦 留下您來過的痕跡