Jmeter之邏輯控制器(Logic Controller)
前言:
1、 Jmeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”。意思是說,邏輯控制器可以控制采樣器(samplers)的執行順序。由此可知,控制器需要和采樣器一起使用,否則控制器就沒有什么意義了。放在控制器下面的所有的采樣器都會當做一個整體,執行時也會一起被執行。
2、JMeter中的Logic Controller分為兩類:
a) 控制測試計划執行過程中節點的邏輯執行順序,如:Loop Controller、If Controller等;
b) 對測試計划中的腳本進行分組、方便JMeter統計執行結果以及進行腳本的運行時控制等,如:Throughput Controller、Transaction Controller。
3、Jmeter提供如下這么多的控制器:
一、簡單控制器(Simple Controller):
作用:這是Jmeter里最簡單的一個控制器,它可以讓我們組織我們的采樣器和其它的邏輯控制器(分組功能),提供一個塊的結構和控制,並不具有任何的邏輯控制或運行時的功能。
二、循環控制器(Loop Controller):
作用:指定其子節點運行的次數,可以使用具體的數值(如下圖,設置為5次),也可以使用變量
1、Forever選項:勾選上這一項表示一直循環下去
2、如果同時設置了線程組的循環次數和循環控制器的循環次數,那循環控制器的子節點運行的次數為兩個數值相乘的結果。
三、僅一次控制器(Once Only Controller):
作用:在測試計划執行期間,該控制器下的子結點對每個線程只執行一次,登錄場景經常會使用到這個控制器。
注意:將Once Only Controller作為Loop Controller的子節點,Once Only Controller在每次循環的第一次迭代時均會被執行。
四、ForEach控制器(ForEach Controller):
作用:ForEach控制器一般和用戶自定義變量一起使用,其在用戶自定義變量中讀取一系列相關的變量。該控制器下的采樣器或控制器都會被執行一次或多次,每次讀取不同的變量值。如下圖:
參數:
- Input Variable Prefix:輸入變量前綴
- Output variable name:輸出變量名稱
- Start index for loop(exclusive):循環開始的索引(這里如果不填寫,默認從1開始,如果沒有1開始的變量,執行時會報錯)
- End index for loop(inclusive):循環結束的索引
- Add”_”before number:輸入變量名稱中是否使用“_”進行間隔。
用戶自定義變量:
變量名前綴為ForEach Controller中Input variable prefix定義的name + 下划線(上圖中我們勾選了下划線)+數字編號
執行結果:
總共執行了3次,每次執行時會把獲取到的變量值賦值給輸出變量outNmae,其它地方可以通過${outNmae}進行調用。
五、事務控制器(Transaction Controller):
作用: 事務控制器會生產一個額外的采樣器,用來統計該控制器子結點的所有時間。
參數:
- Generate parent sample:(選中這個參數結果展示如下圖紅框,否則顯示為下圖藍框)
- Include duration of timer and pre-post processors in generated sample:選中這一項會統計定時器(timer)的時間,否則只統計采樣器(sample)的時間
六、If 控制器(If Controller):
作用:根據給定表達式的值決定是否執行該節點下的子節點,默認使用JavaScript的語法進行判斷(如下圖紅框內的文字)。
參數:
- Interpret Condition as Variable Expression?:選中這一項時表示:判斷變量值是否等於字符串true(不區分大小寫)
- Evaluate for all children:如果選中這一項,在每個子結點執行前都會計算表達式
示例一:使用變量的方式進行判斷:
示例二:選中Interpret Condition as Variable Expression?
七、Switch控制器(Switch Controller):
作用:Switch控制器通過給該控制器中的Value賦值,來指定運行哪個采樣器。有兩種賦值方式:
- 第一種是數值,Switch控制器下的子節點從0開始計數,通過指定子節點所在的數值來確定執行哪個元素。
- 第二種是直接指定子元素的名稱,比如采樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。
當Value為空時,默認執行第1個子節點元素。
示例:
1、Switch Controller選擇的值為login page
2、執行結果:
八、吞吐量控制器(Throughput Controller):
作用:控制其下的子節點的執行次數與負載比例分配,也有兩種方式:
- Total Executions:設置運行次數
- Percent Executions:設置運行比例(1~100之間)
示例:
1、設置線程組循環5次:
2、Throughput Controller1的子結點執行3次:
3、Throughput Controller2的子結點執行(40% * 線程組循環次數5)= 2次:
執行結果:
九、隨機控制器(Random Controller):
作用:隨機執行其下的所某個子結點
十、隨機順序控制器(Random Order Controller):
作用:隨機執行其下的所有子結點
下面是另外一篇文章介紹 jmeter邏輯控制器
下面是另外一篇文章介紹 jmeter邏輯控制器
1、ForEach控制器
ForEach控制器在用戶自定義變量中讀取一系列相關的變量。該控制器下的采樣器或控制器都會被執行一次或多次,每次讀取不同的變量值。所以ForEach總是和User Defined Variables一起使用。下面會以實例的形式介紹它的用法。
控制面板
參數
Name:控制器名稱
Comments:備注
Input Variable Prefix:輸入變量前綴
Output variable name:輸出變量名稱
Add”_”before number:輸入變量名稱中是否使用“_”進行間隔。
示例
該示例中在ForEach控制器中添加了一個HTTP請求(登錄頁面),需要輸入用戶名,密碼。我們這里把用戶名作為變量在用戶自定義變量中設置。
User Parameter面板中設置
ForEach控制器面板中設置
HTTP請求采樣器面板中設置
這樣執行測試計划時,ForEach控制器會遍歷User Parameter查找符合設置條件的變量名,這里就是”Name”+”_”+”循環次數”。查到符合的變量后就把值賦給輸出變量(Vname)。然后就可以在ForEach控制器下的采樣器或控制器中使用了,使用的格式是${輸出變量名}。
運行測試計划,在“察看結果樹”中就可以看到,每次請求使用了不同的參數。
2、包含控制器--Include Controller
包含控制器用於使用外部的Jmx文件。為了演示使用它,可以添加一個simple controller,然后在其中添加一個采樣器(sample),比如一個http請求。然后把這個simple controller保存為一個jmx文件。這樣在include controller中設置該jmx文件就可以在測試計划中使用了。值得注意的是,包含測試的測試計划中不能有線程組,僅僅只能有simple controller,然后其下可以添加任何采樣器,控制器。
如果用戶需要使用cookie manage或者 用戶自定義變量,都應該在頂層的測試計划中設置,不應該包含在外部文件中,否則不會它們不會起作用。
This element does not support variables/functions in the filename field.
However, if the propertyincludecontroller.prefixis defined, the contents are used to prefix the pathname.
如果在prefix+filename的路徑中找不到文件,控制器會嘗試在JMX存放目錄中根據文件名進行查找。
控制面板
參數
Attribute |
Description |
Required |
Filename |
包含的文件 |
Yes |
3、Runtime Controller
4、Switch Controller
Switch控制器通過給該控制器中的Value賦值,來指定運行哪個采樣器。有兩種賦值方式:
1.第一種是數值,Switch控制器下的子節點從0開始計數,通過指定子節點所在的數值來確定執行哪個元素。
2.第二種是直接指定子元素的名稱,比如采樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。
當Value為空時,默認執行第1個子節點元素。
控制面板
參數
Name:控制器名稱
Switch Value:指定需要運行的子元素的名稱或所處的數值。
示例
線程組的各參數都設置為1,switch value中設置“Login.aspx”,運行測試計划,在“view results tree”中查看結果
僅僅執行了Name為“Login.aspx”的Http請求。
5、While Controller
6、事務控制器
事務控制器會生成一個額外的采樣器來測量其下測試元素的總體時間。值得注意的是,這個時間包含該控制器范圍內的所有處理時間,而不僅僅是采樣器的。
對於Jmeter2.3以上的版本,有兩種模式的操作
• 事務采樣器是添加到其下采樣器后面的
• 事務采樣器是作為其下采樣器的父采樣器。
生成的事務采樣器的測量的時間包括其下采樣器以及其他的一切時間。由於時鍾頻率的問題,這個時間可能略大於單個采樣器的時間之和。時鍾開始時間介於控制器記錄開始時間與第一個采樣器開始之間,時鍾結束時間亦然。
事務采樣器只有在其子采樣器都成功的情況下才顯示成功。
在父模式下,事務控制器下的各個采樣器只有在the Tree View Listener里才能看到。同時,子采樣器的數據也不會在CSV文件中顯示,但是在XML文件中可以看到。
控制面板
參數
Attribute |
Description |
Required |
Name | 事務控制器的名稱 | Yes |
Sample | 如果點中,事務采樣器作為其下采樣器的父采樣器 否則,作為額外采樣器添加在子采樣器的后面 |
Yes |
示例
其中線程組中設置1個Users,1 Loop。
1.Generate Parent Sample不選中情況下,Aggregate Report顯示為
其中事務采樣器采集的數據排在子采樣器數據之后,同時各列數據略大於子采樣器數據之和。
2.Generate Parent Sample選中情況下,Aggregate Report顯示為
其中僅顯示事務采樣器采集的數據,而不會顯示子采樣器采集的數據。
7、交替控制器 一次傳遞一個子請求到這個測試,按子元件的排列順序
8、僅一次控制器 這個控制器可以保證線程在多次循環跑得情況下只登陸一次
9、吞吐量控制器
10、如果(If)控制器 在“條件:”中填寫判斷條件進行執行
在做類似內存審計和長sql審計測試時,常需要測試各種類型的sql語句,如果為每種sql語句建立一個測試計划有點太麻煩,這里我們就可以使用如果(if)邏輯控制器來實現各種sql的控制。
已長sql審計測試為例,我們需要模擬長sql、短sql和長短混合sql的審計測試,這里我們就可以設置2個用戶變量和if控制器來實現。
變量longsql用於控制長sql的jdbc請求是否執行,shortsql用於控制短sql的jdbc請求是否執行,在每條sql對應的jdbc請求上插入if控制器,如上圖所示
"${shortsql}"=="true":變量shortsql的取值為true時即執行
"${shortsql}"!="true":變量shortsql的取值不為true時即執行
11、錄制控制器 我們用JMeter自身來錄制腳本時用的控制器
12、循環控制器 該控制器下的請求可以循環執行
13、模塊控制器 測試某一個模塊
14、簡單控制器 最基本的控制器,沒有任何附加作用,可以用來命名某些操作
15、隨機控制器 JMeter可能會隨機選取某一個請求
16、隨機順序控制器 子節點全部執行,但順序是隨機的
1、ForEach控制器
ForEach控制器在用戶自定義變量中讀取一系列相關的變量。該控制器下的采樣器或控制器都會被執行一次或多次,每次讀取不同的變量值。所以ForEach總是和User Defined Variables一起使用。下面會以實例的形式介紹它的用法。
控制面板
參數
Name:控制器名稱
Comments:備注
Input Variable Prefix:輸入變量前綴
Output variable name:輸出變量名稱
Add”_”before number:輸入變量名稱中是否使用“_”進行間隔。
示例
該示例中在ForEach控制器中添加了一個HTTP請求(登錄頁面),需要輸入用戶名,密碼。我們這里把用戶名作為變量在用戶自定義變量中設置。
User Parameter面板中設置
ForEach控制器面板中設置
HTTP請求采樣器面板中設置
這樣執行測試計划時,ForEach控制器會遍歷User Parameter查找符合設置條件的變量名,這里就是”Name”+”_”+”循環次數”。查到符合的變量后就把值賦給輸出變量(Vname)。然后就可以在ForEach控制器下的采樣器或控制器中使用了,使用的格式是${輸出變量名}。
運行測試計划,在“察看結果樹”中就可以看到,每次請求使用了不同的參數。
2、包含控制器--Include Controller
包含控制器用於使用外部的Jmx文件。為了演示使用它,可以添加一個simple controller,然后在其中添加一個采樣器(sample),比如一個http請求。然后把這個simple controller保存為一個jmx文件。這樣在include controller中設置該jmx文件就可以在測試計划中使用了。值得注意的是,包含測試的測試計划中不能有線程組,僅僅只能有simple controller,然后其下可以添加任何采樣器,控制器。
如果用戶需要使用cookie manage或者 用戶自定義變量,都應該在頂層的測試計划中設置,不應該包含在外部文件中,否則不會它們不會起作用。
This element does not support variables/functions in the filename field.
However, if the propertyincludecontroller.prefixis defined, the contents are used to prefix the pathname.
如果在prefix+filename的路徑中找不到文件,控制器會嘗試在JMX存放目錄中根據文件名進行查找。
控制面板
參數
Attribute |
Description |
Required |
Filename |
包含的文件 |
Yes |
3、Runtime Controller
4、Switch Controller
Switch控制器通過給該控制器中的Value賦值,來指定運行哪個采樣器。有兩種賦值方式:
1.第一種是數值,Switch控制器下的子節點從0開始計數,通過指定子節點所在的數值來確定執行哪個元素。
2.第二種是直接指定子元素的名稱,比如采樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。
當Value為空時,默認執行第1個子節點元素。
控制面板
參數
Name:控制器名稱
Switch Value:指定需要運行的子元素的名稱或所處的數值。
示例
線程組的各參數都設置為1,switch value中設置“Login.aspx”,運行測試計划,在“view results tree”中查看結果
僅僅執行了Name為“Login.aspx”的Http請求。
5、While Controller
6、事務控制器
事務控制器會生成一個額外的采樣器來測量其下測試元素的總體時間。值得注意的是,這個時間包含該控制器范圍內的所有處理時間,而不僅僅是采樣器的。
對於Jmeter2.3以上的版本,有兩種模式的操作
• 事務采樣器是添加到其下采樣器后面的
• 事務采樣器是作為其下采樣器的父采樣器。
生成的事務采樣器的測量的時間包括其下采樣器以及其他的一切時間。由於時鍾頻率的問題,這個時間可能略大於單個采樣器的時間之和。時鍾開始時間介於控制器記錄開始時間與第一個采樣器開始之間,時鍾結束時間亦然。
事務采樣器只有在其子采樣器都成功的情況下才顯示成功。
在父模式下,事務控制器下的各個采樣器只有在the Tree View Listener里才能看到。同時,子采樣器的數據也不會在CSV文件中顯示,但是在XML文件中可以看到。
控制面板
參數
Attribute |
Description |
Required |
Name | 事務控制器的名稱 | Yes |
Sample | 如果點中,事務采樣器作為其下采樣器的父采樣器 否則,作為額外采樣器添加在子采樣器的后面 |
Yes |
示例
其中線程組中設置1個Users,1 Loop。
1.Generate Parent Sample不選中情況下,Aggregate Report顯示為
其中事務采樣器采集的數據排在子采樣器數據之后,同時各列數據略大於子采樣器數據之和。
2.Generate Parent Sample選中情況下,Aggregate Report顯示為
其中僅顯示事務采樣器采集的數據,而不會顯示子采樣器采集的數據。
7、交替控制器 一次傳遞一個子請求到這個測試,按子元件的排列順序
8、僅一次控制器 這個控制器可以保證線程在多次循環跑得情況下只登陸一次
9、吞吐量控制器
10、如果(If)控制器 在“條件:”中填寫判斷條件進行執行
在做類似內存審計和長sql審計測試時,常需要測試各種類型的sql語句,如果為每種sql語句建立一個測試計划有點太麻煩,這里我們就可以使用如果(if)邏輯控制器來實現各種sql的控制。
已長sql審計測試為例,我們需要模擬長sql、短sql和長短混合sql的審計測試,這里我們就可以設置2個用戶變量和if控制器來實現。
變量longsql用於控制長sql的jdbc請求是否執行,shortsql用於控制短sql的jdbc請求是否執行,在每條sql對應的jdbc請求上插入if控制器,如上圖所示
"${shortsql}"=="true":變量shortsql的取值為true時即執行
"${shortsql}"!="true":變量shortsql的取值不為true時即執行
11、錄制控制器 我們用JMeter自身來錄制腳本時用的控制器
12、循環控制器 該控制器下的請求可以循環執行
13、模塊控制器 測試某一個模塊
14、簡單控制器 最基本的控制器,沒有任何附加作用,可以用來命名某些操作
15、隨機控制器 JMeter可能會隨機選取某一個請求
16、隨機順序控制器 子節點全部執行,但順序是隨機的