天天看點

Jmeter學習筆記(十四)——邏輯控制器

一、邏輯控制器簡單介紹

Jmeter中邏輯控制器(Logic Controllers)的作用域隻對其子節點的sampler有效,作用是控制采樣器的執行順序。放在邏輯控制器下面的所有的采樣器都會當做一個整體,執行時也會一起被執行。

JMeter邏輯控制器有17種

JMeter中的Logic Controller分為兩類:

1、控制測試計劃執行過程中節點的邏輯執行順序,如:Loop Controller(循環控制器)、If Controller(如果if控制器)等;

2、對測試計劃中的腳本進行分組、友善JMeter統計執行結果以及進行腳本的運作時控制等,如:Controller(吞吐量控制器)、Transaction Controller(事務控制器)。

二、各種邏輯控制器詳細介紹

1、簡單控制器(Simple Controller)

作用:這是Jmeter裡最簡單的一個控制器,它可以讓我們組織我們的采樣器和其它的邏輯控制器(分組功能),提供一個塊的結構和控制,并不具有任何的邏輯控制或運作時的功能。 

Jmeter學習筆記(十四)——邏輯控制器

 2、僅一次控制器(Once Only Controller)

作用:在測試計劃執行期間,該控制器下的子結點對每個線程隻執行一次,登入場景經常會使用到這個控制器。

Jmeter學習筆記(十四)——邏輯控制器

3、循環控制器(Loop Controller)

作用:指定其子節點運作的次數,可以使用具體的數值(如下圖,設定為1次),也可以使用變量

  1、永遠(Forever)選項:勾選上這一項表示一直循環下去

  2、如果同時設定了線程組的循環次數和循環控制器的循環次數,那循環控制器的子節點運作的次數為兩個數值相乘的結果。

Jmeter學習筆記(十四)——邏輯控制器

 注意:将Once Only Controller作為Loop Controller的子節點,Once Only Controller在每次循環的第一次疊代時均會被執行。

4、交替控制器(creatleave controller)

作用: 交替控制,使得該控制器包含的取樣器步驟交錯執行在每個循環中

Jmeter學習筆記(十四)——邏輯控制器

 忽略子控制器子產品(Ignore sub-contorller blocks):如果勾選此項,交錯控制器将sub-controllers像單一請求元素一樣,一次隻允許一個請求/控制器

使用方法:假使該控制器下有2個取樣器A和B,交替執行A和B2個請求,即每次傳遞一個子請求到這個測試,按子元件的排列順序

執行個體1:

線程組的循環次數為5次,有一個交替控制器,下面有11、22兩個sample

Jmeter學習筆記(十四)——邏輯控制器
 執行結果:
Jmeter學習筆記(十四)——邏輯控制器

 執行個體2:

線程組循環次數設定為5次,交替控制器下嵌套一個循環控制器,循環次數3;交替控制器設定不忽略子控制器

Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器

 執行個體3:

線程組循環次數設定為5次,交替控制器下嵌套一個循環控制器,循環次數3;交替控制器設定為忽略子控制器

Jmeter學習筆記(十四)——邏輯控制器
執行結果:
Jmeter學習筆記(十四)——邏輯控制器

5、随機控制器(Random Controller)

作用:類似交替控制器,但該控制器随機選取某一個取樣器請求并執行

Jmeter學習筆記(十四)——邏輯控制器

 忽略子控制器子產品(Ignore sub-controller blocks):如果勾選此項,交錯控制器将sub-controllers像單一請求元素一樣,一次隻允許一個請求/控制器

線程組的循環次數為5次,有一個随機控制器,下面有11、22兩個sample

Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器
線程組循環次數設定為5次,随機控制器下嵌套一個循環控制器,循環次數3;随機控制器設定不忽略子控制器
Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器
線程組循環次數設定為5次,随機控制器下嵌套一個循環控制器,循環次數3;随機控制器設定為忽略子控制器
Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器

6、随機順序控制器(Random Order Controller)

作用:類似于簡單控制器,将執行每個子節點下的取樣器請求一次,但是執行是随機的

Jmeter學習筆記(十四)——邏輯控制器

執行個體:

線程組循環次數設定為5次,随機順序控制器下面有11、22sample

Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器

 7、吞吐量控制器(throughput controller)

作用:控制其下的子節點的執行次數與負載比例配置設定,也有兩種方式:

  • Total Executions:設定運作次數
  • Percent Executions:設定運作比例(1~100之間)
Jmeter學習筆記(十四)——邏輯控制器

吞吐量(Throughput):對應上面的執行數量或者比例

每個使用者(Per User):每個使用者

如果勾選此項,将導緻控制器計算是否應該執行在每個使用者(每個線程)的基礎上;如果不加以控制,那麼将計算全球所有使用者

(1)線程組設定的循環次數為5次

Jmeter學習筆記(十四)——邏輯控制器

(2)該吞吐量控制器設定的是總執行數為3

Jmeter學習筆記(十四)——邏輯控制器

 (3)該吞吐量控制器設定的是40%執行率,即(40% * 線程組循環次數5)= 2次

Jmeter學習筆記(十四)——邏輯控制器

 (4)執行結果:11執行了3次,22執行了2次

Jmeter學習筆記(十四)——邏輯控制器

 8、IF控制器(If Controller)

作用:根據給定表達式的值決定是否執行該節點下的子節點

Jmeter學習筆記(十四)——邏輯控制器
  • Expression(must evaluate true or false)輸入框:此處需要寫入需要進行判斷的表達式,從must evaluate true or false可知,實際使用時,隻能填入true或者false這樣的值,是以我們需要借助其他子產品或者函數将需要進行判斷的表達式(如 ${var}== 5)轉換成true或false,判斷才能生效,直接将${var}== 5這樣的表達式寫入Expression中是無效的。從該控制器提示的資訊中,可以借助__jexl3或者__groovy函數來計算表達式的值。
  • Interpret Condition as Variable Expression?:

          不勾選:直接輸入我們需要判斷的表達式即可,判斷表達式為真時,執行if控制器下的請求,例如“1!=2”,則一定會執行下面的http請求

          勾選:這時expression中不能直接填寫條件表達式,需要借助函數将條件表達式計算為true/false,可以借助的函數有_jexl3和_groovy,例如:直接填寫${modelId}==5,是不能識别的。

         表達式支援:

                             ==         是否等于,如${__jexl3(${VAR}==1,)},判斷${VAR}變量是否等于1

                             !=         不等于,如${__jexl3(${VAR}!=1,)},判斷${VAR}變量是否不等于1

                            !         非,如${__jexl3(!(${VAR}!=1),)}對${VAR}!=1的結果取反

                             &&或||    且與或,如  ${__jexl3(${VAR}==1 && ${name} != "heima",)}

                             > 或者>==   大于等于,如${__jexl3(${count}>=10,)}

  • Evaluate for all children:如果選中這一項,在每個子結點執行前都會計算表達式 

不勾選Interpret Condition as Variable Expression?

直接寫表達式,表達式為true,執行下面的11sample。

Jmeter學習筆記(十四)——邏輯控制器

勾選Interpret Condition as Variable Expression?

不能直接寫表達式,需要轉化為_jexl3和_groovy函數。

我們可是使用jmeter的函數助手:

(1)打開函數助手對話框

Jmeter學習筆記(十四)——邏輯控制器

 (2)選擇jexl3或者_groovy,輸入表達式,點選生成,這個時候會生成對應的函數表達式

Jmeter學習筆記(十四)——邏輯控制器

 (3)複制結果到條件中:

Jmeter學習筆記(十四)——邏輯控制器

9、事務控制器(transaction controller)

這個控制器在在業務控制上并沒有什麼特殊邏輯,可以了解為在簡單控制器的基礎上添加了統計的功能,當所有子節點全部成功則成功,由任意一個失敗結果就為失敗。

事務控制器不會對其子節點的執行邏輯産生影響,其效果為在監聽器生成統計的時,以一個單獨的統計點來統計,可各項名額為控制器子節點的名額之和。

當事務控制器下的任意一子節點執行失敗,事務控制器的執行結果就會被以失敗統計。

Jmeter學習筆記(十四)——邏輯控制器

 參數:

Generate parent sample:如果事務控制器下有多個取樣器,勾選它,那麼在“察看結果樹”中我事務控制器以父節點存在,下面取樣器作為子節點,并且事務控制器定義的事務是否成功取決于子事務是否都成功,子事務其中任何一個失敗即代表整個事務失敗。

Include duration of timer and pre-post processors in generated sample:是否包括定時器、預處理和後期處理延遲的時間

事物控制器下面有取樣器11、22,勾選Generate parent sample

Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器

 10、當/判斷控制器(While Controller)

作用:運作其子節點下的取樣器/控制器,直到條件為“假”

Jmeter學習筆記(十四)——邏輯控制器

 Condition(function or variable):條件(函數或變量):裡面可填入判斷依據的條件,參照

使用方法:可能的條件值有:

①.空白:最後一個示例循環失敗時退出循環

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

③.自定義條件:值為True 或 False的函數/變量/屬性 表達式

 執行個體1:空白

Jmeter學習筆記(十四)——邏輯控制器

 執行結果:執行到最後 一個示例22時失敗,退出了循環

Jmeter學習筆記(十四)——邏輯控制器

執行個體2:LAST

Jmeter學習筆記(十四)——邏輯控制器

 如果隻是循環裡面的22執行失敗,執行結果和空白的時候一樣,跳出循環:

Jmeter學習筆記(十四)——邏輯控制器

 但是如果控制器前一個取樣器44執行錯誤,将不會進入循環:

Jmeter學習筆記(十四)——邏輯控制器

執行個體3:自定義變量

比如一個簡單的例子,定義一個變量test,它的值為true

Jmeter學習筆記(十四)——邏輯控制器
Jmeter學習筆記(十四)——邏輯控制器

那麼while裡面的取樣器一直循環執行。

11、轉換控制器(Switch Controller)

作用:通過給該控制器中的value指派,來指定運作哪個取樣器(也可以了解為開關控制器)

Jmeter學習筆記(十四)——邏輯控制器

Switch value:控制器具體指派的value值字段

有兩種指派方式:

①.第一種是數值,Switch控制器下的子節點從0開始計數,通過指定子節點所在的數值來确定執行哪個元素。

②.第二種是直接指定子元素的名稱,比如采樣器的Name來進行比對。當指定的名稱不存在時,不執行任何元素。

當Value為空時,預設執行第1個子節點元素。

設定為1,那麼執行的就是1+1的test2取樣器

Jmeter學習筆記(十四)——邏輯控制器

執行個體2:

設定為取樣器的名稱test1,那麼執行的就是test1取樣器

Jmeter學習筆記(十四)——邏輯控制器

12、臨界區控制器(critical section Controller)

作用:臨界區控制器確定它的子元素(samplers /控制器等)在執行控制器的子程式之前隻執行一個線程作為指定的鎖。根據鎖名來控制并發,同一個鎖名之下,在同一時間點隻能存在一個運作中,适用于控制并發的場景。

Jmeter學習筆記(十四)——邏輯控制器

名稱和注釋很簡單,就是給控制器添加一個備注,使人明白這個控制器的解釋含義的意思

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

鎖名類型:

    鎖名為空,認為每個鎖為不同的鎖

    鎖名相同,多個鎖認為是同一個鎖,同一個時間點隻能存在一個運作中

    鎖名為變量,根據變量值來判斷是不是屬于同一個鎖,變量值為相同時,則認為是同一個鎖

  示範腳本: Demo_臨界部分控制器

13、周遊循環控制器(ForEach Controller)

作用:用來周遊目前元素的所有可執行場景;在使用者自定義變量中讀取一系列相關的變量,該控制器下的采樣器或控制器都會被執行一次或多次,每次讀取不同的變量值;

Jmeter學習筆記(十四)——邏輯控制器

輸入變量字首:在其中輸入需要周遊的使用者參數(User Parameter)

Start index for loop(exclusive):循環指數開始(唯一)→ 周遊查詢的變量範圍,開始的值(這裡如果不填寫,預設從1開始,如果沒有1開始的變量,執行時會報錯)

End index for loop(inclusive):循環指數結束(包含)→ 周遊查詢的變量範圍,結束的值

輸出變量名稱:将周遊查詢到的符合條件的使用者參數指派給輸入變量(Vname),然後就可以在控制器下的取樣器使用,格式為${輸出變量名}

Add”_”before number:輸入變量名稱中是否使用“_”進行間隔

PS:這個控制器一般配合配置元件→ 正規表達式提取器來一起使用,可對頁面上的某些元素進行重複處理。

14、包含控制器(Include Controller)

作用:用于引用外部的Jmx檔案;進而控制多個測試計劃組合

Jmeter學習筆記(十四)——邏輯控制器

 include Test Plan:包含測試計劃的檔案名,可以點選浏覽,從檔案夾儲存的JMX檔案夾目錄下選擇對應的JMX檔案

使用方法:建立一個測試計劃,下面可添加取樣器/控制器等,然後儲存測試計劃,為了友善起見, 線程組也可以添加外部JMX檔案中用于調試;

如果測試使用Cookie或使用者定義的變量,這些應放置在頂層(包括檔案),否則無法正常工作;此元素不支援變量/函數在檔案名字段中;但是,如果屬于包含控制器定義的内容,則使用字首路徑名。

當使用包含控制器中包含相同的JMX檔案,則要確定檔案名不同,以避免無法讀取;如果檔案不能被發現,那麼控制器會嘗試打開檔案名相對于JMX啟動目錄。

15、生命周期/運作周期控制器(Runtime Controller)

作用:用于控制該控制器下的取樣器/控制器的運作時間

Jmeter學習筆記(十四)——邏輯控制器

 Runtime(seconds):運作時間,機關為:秒

16、子產品控制器(Module Controller)

作用:測試控制器子節點下的某一個子產品,而不是整個測試計劃

Jmeter學習筆記(十四)——邏輯控制器

 尋找目标元素(Find target element):尋找測試計劃中需要特定測試的元素,子產品;也可了解為該控制器可以控制已經封裝好的子產品元素

△ :一個測試計劃由一個控制器和所有的測試元素(取樣器等)組成,測試計劃可以位于任何線程組或工作台;如果計劃位于線程組,則可以禁用其他控制器,防止正在運作的測試計劃被影響(除了子產品控制器)

     子產品控制器的優勢在于:當存在多個線程組時,該控制器可以輕松切換,隻需要選擇對應的取樣器,友善快捷,替代了建立很多測試計劃的繁瑣操作

△ :任何一個子產品所用的控制器名字必須唯一,因為其名字被用來找到目标控制器時重新加載;出于這個原因,最好保證控制器名字不同,否則執行測試時候可能發生意外

△ :子產品控制器與遠端測試不應使用或非gui測試與工作台部件,因為工作台測試元素并沒有測試計劃的一部分 jmx 檔案。 任何這樣的測試就會失敗

17、錄制控制器(Recording Controller)

作用:類似代理伺服器的作用,在測試執行期間記錄測試樣本

Jmeter學習筆記(十四)——邏輯控制器

 清除所有記錄的樣本(Clear all the recorded samples):點選可以清除所有已經記錄的測試樣本

一般情況下,在測試執行時候,它沒有效果,但是在執行HTTPS測試腳本時,會記錄下所有測試樣本

Jmeter學習筆記(十四)——邏輯控制器