1. 程式人生 > >[搬運工系列]-JMeter(十七)邏輯控制器

[搬運工系列]-JMeter(十七)邏輯控制器

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錄製得到的指令碼。