JMeter中的Logic Controller用于為Test Plan中的節點添加邏輯控制器。
JMeter中的Logic Controller分為兩類:一類用來控制Test Plan執行過程中節點的邏輯執行順序,如:Loop Controller、If Controller等;另一類則與節點邏輯執行順序無關,用于對Test Plan中的腳本進行分組、方便JMeter統計執行結果以及進行腳本的運行時控制等,如:Throughput Controller、Transaction Controller。
一、控制Test Plan中的節點執行順序的Logic Controller
1、ForEach Controller:類似于編程語言中的for each語句。如下圖:
通常情況下,ForEach Controller常與Regular Expression Extractor配合使用。
2、If Controller:類似于編程語言中的if語句,根據給定表達式的值決定是否執行該節點下的子節點。如下圖:
注意:條件判斷語句如果是字符串一點要在參數前加引號,如:a."${foreach_city}"=="beijing" b."${foreach_city}"!="beijing"
如果選中“Evaluate for all Children”選項,則該Controller在每個子節點執行時執行一次,否則,該Controller僅在入口執行一次。
3、Interleave Controller:在每次迭代時,順序選取該節點下的一個子節點執行。如下圖:
如果選中“Ignore sub-controller blocks”選項,則該Controller將其下的子Controller當成單一元素處理,并僅允許每個子Controller一次發出一個請求。
在該示例中,設置迭代次數為4次,節點的執行順序是:Req1-HTTP Request –Req2—HTTP Request—Req3—HTTP Request.
4、Loop Controller:簡單地為其下的子節點運行指定次數。如下圖:
5、Once Only Controller:是為了讓Test Plan中的某些內容在整個Test Plan的執行期間對每個線程僅執行一次(例如,每個線程僅需要執行一次“登錄”操作)。如:將Once Only Controller作為Loop Controller的子節點,Once Only Controller在每次循環的第一次迭代時均會被執行。如下圖:
6、Random Controller:每次執行時,從其子節點中隨機選取一個來執行。如下圖:
7、Random Order Controller:每次執行時,按照隨機產生的順序執行其下的所有子節點。注意,該Controller與Random Controller的不同之處在于,Random Controller只選擇執行其所有子節點中的一個,而Random Order Controller則按照隨機順序全部執行該Controller下的所有子節點。
8、Switch Controller:類似程序語言中的switch函數,該Controller根據給定的值n(可以使用參數)選擇執行其下的第n+1個子節點。如下圖:
需要注意的是,Switch Controller只接受整數值,并且給定的值n是以0為基礎的,因此當給定的值“2”時,意味著該Controller下的第3個子節點會被執行。同時,Switch Controller接受參數作為其值。
9、While Controller:是另一個用于控制循環的Controller。可以為該Controller設置一個Condition.Condition的取值可以為以下三者之一:
空:如果Condition取值為空,則該Condition迭代執行
Controller下的所有子節點,直到最后一個子節點返回失敗為止。需要注意的是,如果不是最后一個子節點失敗,而是該Controller中的其他
子節點失敗,該Controller不會停止,而會繼續循環執行過程。
LAST:如果Condition取值為字符串LAST,則該
Controller迭代執行Controller下的所有子節點,直到最后一個子節點返回失敗為止(與Controller為空時的行為相同)。同時,
如果該Controller的上一個節點失敗,則Test Plan在執行時不會進入該Controlller。
表達式:除了為空和LAST外,Controller還可以取一個表達式。當Controller取值為表達式時,如果表達式的取值是字符串false,While Controller就退出循環。以下列出了幾個可用的表達式:
${VAR}:當參數VAR的值被設置成false時退出循環。
${__javascript(“${VAR}”==”dennis”)}:當參數VAR的值不為dennis時退出循環。
${_P(myproperty)}:當屬性myproperty的取值為false時退出循環。
二、其它Logic Controller
除了以上的9種Logic Controller外,JMeter還支持其他7種Logic Controller.
1、Include Controller:用于在Test Plan中包含一個外部的jmx文件。
在Test Plan運行時,被包含的jmx文件中測試計劃中不能有線程組,只允許有一個Simple Controller和該Simple Controller下的子節點(可添加任何采樣器,控制器),不允許有Cookie Manager、User Defined Variable等。
如果用戶需要使用Cookie Manager或者?用戶自定義變量,都應該在頂層的測試計劃中設置,不應該包含在外部文件中,否則不會它們不會起作用。
注意:被包含文件中的Simple Controller及其子節點將會替換Test Plan中的Include Controller.
外部jmx文件結構圖:
主測試計劃圖:
2、Simple Controller:如同該Controller的名稱,是JMeter中最簡單的一個Controller。該Controller僅用于對Test Plan中的元件進行分組,不具有任何的邏輯控制或運行時的功能。
3、Module Controller:為Test Plan提供了在運行時動態執行給定的Test Plan片段的能力。如下圖:
從圖中可以看出,無論是放在本Thread Group、其他的Thread Group,或是WorkBench下的Test Plan片段,都可以在Module Controller中被調用。
4、Runtime Controller:用于指定其子節點的運行時長。該Controller中指定的時間以秒為單位,僅對該Controller的子節點有效。
5、Throughput Controller:用于控制其下的子節點的執行次數與負載比例分配的。
Throughput Controller允許用戶使用兩種模式控制其下子節點的執行順序:比例模式和總數模式。總數模式指定該Controller下所有子節點的準確迭代次數,而比例模式允許負載在Controller下的子節點以某種比例進行分配。在比例模式下,設定的Throughput值為一個0-100之間的整數,表示該Controller迭代次數占總迭代次數的百分比。
可能你已經意識到,如果要在一個Test Plan中體現用戶場景,Throughput Controller應該是最合適的選擇。
圖A給出了總數模式下的Throughput
Controller,在這種模式下,每個線程最多運行Java
Request10次(具體的運行次數還取決于線程組中線程數和迭代次數的設置,如果設定的Total
Execution的次數大于線程組中設置的迭代次數,每個線程最多運行線程組中設定的迭代次數)。
圖B給出了比例模式下的Throughput
Controller,從圖中可以看出,該Test Plan包含了兩個Throughput
Controller,第一個設定的Percentage為70,也就是70%,第二個設定的Percentage為30,也就是30%。線程組的線程數
設置為10,迭代次數也設置為10.在這種模式下,req1被運行70次,req2被運行30次。如下圖:
6、Transaction Controller:用于將Test Plan中的特定部分組織成一個Transaction,JMeter中Transaction的作用在于,可以針對Transaction統計其響應時間、吞吐量等。
在有些情況下,一個用戶操作可能需要多個Sampler來模擬,此時,使用Transaction Controller,可以更準確地得到該用戶操作的性能指標,如響應時間等。
7、Recording Controller:唯一的用途是用于存放JMeter錄制得到的腳本。