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