邏輯控制器有可能會打破Jmeter的執行順序,Jmeter的邏輯控制器有:事務控制器、循環控制器、僅一次控制器、IF控制器、吞吐量控制器、ForEach控制器、隨機控制器、While控制器、Include控制器、Runtime控制器、臨界部分控制器、交替控制器、錄制控制器、簡單控制器、隨機順序控制器、Switch控制器、模塊控制器。下面介紹幾種控制器的使用。
一:事務控制器
Jmeter會將每個請求默認當為一個事務,但是由於實際業務中,一個事務可能需要好幾個請求組成,如轉賬的事務,需要轉出的接口請求正確且轉入的接口請求正確才算是事務成功,但凡其中有一個請求出錯,轉賬的事務都不會成功。如果某個事務需要好幾個請求組合完成,那么我們就可以拿事務控制器將這些請求包裝起來。被包裝起來的請求都是正確的,事務控制器才是正確的,其中任何一個請求出錯了,事務控制器就出錯。
例子:事務控制器下添加了4個Http請求,每個請求都是對百度發起請求,只有每個請求都是通過的,事務控制器才會通過,否則事務控制器都是失敗的。
(1)所有請求都正確的情況:
可以看到四個請求都是通過的情況下,事務控制器才是通過的
(2)事務控制器下存在有錯誤請求的情況:
可以看到只要其中有一個請求發生了錯誤,那么事務控制器也會錯誤。
二:循環控制器
我們希望對某個取樣器循環請求時,就可以使用到循環控制器。
例子:
(1)為請求添加個循環控制器,循環次數填3
可以看到請求被循環請求了3次。
(2)為請求添加個循環控制器,循環次數選擇永遠,那么請求就會無休止地不斷執行。
可以看到請求會持續不斷地執行。
(3)配合線程屬性設置,最終的循環次數為:線程數*循環次數*循環控制器次數,下面線程組設置3個線程,3次循環,為請求添加個循環控制器次數填3
可以看到總共執行了27次請求。
三:僅一次控制器
用於控制某個請求在一次腳本執行下只執行一次。
例子:在循環控制器下添加兩個請求,其中一個請求用【僅一次控制器】包裝起來,那么這個請求只會被執行一次。
可以看到被【僅一次控制器】包裹起來的“HTTP請求2”只被執行了一次。
四:IF控制器
用於控制滿足什么條件下,再去執行被包裹起來的請求。該控制器應用范圍比較廣泛,滿足我們日常開發中想要某個請求滿足什么條件才能執行的需求。比如:我們希望系統中的所有請求都需要成功登錄后才能執行對應請求,希望某個請求需要前一個請求是正確的情況下才執行等需求。
先來介紹下IF控制器的組成部分:
1、Expression:表示我們填入的條件表達式
2、Interpret Condition as Variable Expression:如果勾選,則我們填寫的Expression需要借助於__jexl3函數或者__groovy函數,如果不勾選,則直接填寫我們的條件表達式即可
3、Evaluate for all children:將該控制器作用域所有子項的取樣器,一般不勾選。
4、Use status of last sample:將執行該IF控制器前的最后一個取樣器作為判斷,如果是通過的就返回真,否則返回false
實例1:借助__jexl3()函數完成表達式編寫。先添加一個百度請求,添加后置處理器提取title變量:“百度一下,你就知道”,再添加一個被IF控制器包裹的請求,IF控制器填寫表達式:如果${title}變量包含“百度”,則執行,不包含則跳過:
表達式代碼:${__jexl3("${title}".contains("百度"),)}
通過該IF控制器,就可以判斷${title}變量是否包含“百度”關鍵字,如果包含則執行被包起來的請求,不包含則跳過,執行結果:
由於${title}包含了“百度”字符串,所以會執行被IF控制器包裹起來的“HTTP請求3”
下面將表達式結果改成false,如圖:
由於${title}變量沒有包含"百度222"字符串,所以被IF控制器包裹起來的“HTTP請求3”就不會執行,如圖:
實例二:不借助於__jexl3()或__groovy()編寫表達式,此種方式性能較低,所以我們一般都會借助於__jexl3()或__groovy()編寫我們的表達式。
執行結果跟實例一一致,只是性能有所下降:
實例三:使用Use status of last sample:使用執行該IF控制器前的最后一個取樣器結果作為判斷,如果最后一個取樣器通過就返回true,如果失敗就返回false。
執行結果:由於前面的取樣器是通過的,所以返回true,所以就會執行“HTTP請求3”:
五:while控制器
該控制器就類似於編程語言的while(Boolean boolean)循環控制,比較少用,了解即可。此處有三種情況:
1、什么都不填或者填true:那就相當於while(ture)死循環,請求會持續不斷一致執行。
2、填flase:沒有意義,永遠不會執行被包裹的請求
3、填寫具體的表達式,表達式同上面的IF控制器
實例1:表達式填寫true
可以看到請求會持續不斷執行。
實例2:借助jexl3函數助手填寫表達式
由於上面的條件表達式永遠都為true,所以也會一直不斷執行:
六:吞吐量控制器
該控制器主要用於按照指定比例或者次數執行請求
有兩個選項:1、Total Executions:設置請求執行指定次數,這里有幾種情況
(1)如果設置的Total Executions次數<線程組設置的線程數*循環次數,那么就會運行此處Total Executions設置的次數
(2)如果設置的Total Executions次數>線程組設置的線程數*循環次數,那么會運行線程數*循環次數
2、Percent Executions:設置請求按照指定比例執行,這里有幾種情況
(1)所有吞吐量控制器的比例加起來剛好等於100,則對應執行次數按照線程組*循環次數*Percent Executions次
(2)所有吞吐量控制器的比例加起來不等於100,則還是對應執行次數按照線程組*循環次數*Percent Executions次
(3)如果執行次數按照線程組*循環次數*Percent Executions為整數,則執行次數的請求,如果不為整數,則會向下取整
實例1:按照百分比執行對應請求,線程數設置為3,循環數設置為10,添加3個吞吐量控制器,分別設置的比例為15%,15%,70%
如圖:
請求1的執行次數為:3*10*15%=4.5,此處不為整數,要向下取整4次
請求2的執行次數為:3*10*15%=4.5,此處不為整數,要向下取整4次
請求3的執行次數為:3*10*70%=21,此處為整數21,執行21次
執行結果如圖:
實例2:按照執行指定次數設置,線程數設置為3,循環數設置為10,添加3個吞吐量控制器,分別設置的請求次數為10,30,40
請求1的吞吐量控制器次數:10<線程數(3)*循環數(10)=30次,所以會執行10次
請求2的吞吐量控制器次數:30=線程數(3)*循環數(10)=30次,所以會執行30次
請求3的吞吐量控制器次數:40>線程數(3)*循環數(10)=30次,所以只會執行30次
執行結果如下: