Jmeter之邏輯控制器
轉自:http://www.cnblogs.com/puresoul/p/4886574.html
前言:
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次:
執行結果:
九、交替控制器
下面來看一下各個不同情況下的運行情況:
一:線程組的線程數爲:1,循環次數爲:1
通過察看結果樹,查看請求執行順序(紅方框中表示已執行的請求)。由以上兩張圖可知,兩個循環控制器中,都只執行了第一個請求。
二:線程組的線程數爲:2,循環次數爲:1
由以上兩張圖可知,兩個循環控制器中,都只執行了第一個請求,從整體上來看,是跑了兩次第一種情況。
三:線程組的線程數爲:1,循環次數爲:3
由以上兩張圖可知(每個循環我用不通顏色做了標識),兩個循環控制器中,都只執行了控制器內所有請求。循環次數爲:3,循環控制器1內只有2個請求,其中第1個請求執行了兩遍;循環控制器2內有三個請求,每個請求剛好都只執行了一遍。
四:線程組的線程數爲:2,循環次數爲:2
由以上兩張圖可知,線程組的線程數爲:2,循環次數爲:2時,相當於執行了2次循環次數爲2的情況。循環次數爲2的情況可以參考第三種情況。
由此可以得出結論:線程組的線程數爲:x,循環次數爲:y;當線程組跑起來時,會交替執行控制器(交替控制器)中的請求(自上而下的請求順序),控制器(交替控制器)範圍外的請求。當控制器內的請求樹n < y(循環次數)時,會循環請求控制器內的請求。
五:線程組的線程數爲:2,循環次數爲:2(交替控制器內含交替控制器)
這種情況(交替控制器內含交替控制器)其實可以簡單的認爲只有一個控制器,裏面包含的控制器可以認爲是簡單控制器,這樣就容易理解了。
也是初學者,如果有說的不對的地方還望指出。另外,給上jmeter官方文檔,大家有耐心還是看官方文檔,不會有理解上的偏差。
十、隨機控制器(Random Controller):
作用:隨機執行其下的所某個子結點
十一、隨機順序控制器(Random Order Controller):
作用:隨機執行其下的所有子結點
十二、添加while_Controller
1. 添加While Controller
右鍵線程組->添加->邏輯控制器->響應斷言
2. 控制面板介紹
添加後,面板如下
While Controller會一直運行,直到條件(Condition)爲false
Condition的可能值如下:
l 爲空(不輸入任何值) -- 直到某次sample執行失敗纔會退出循環
l LAST -- 直到最後一個sample請求失敗,纔會退出循環
例:
如上,執行第三個,即最後一個sample失敗了,才自動退出循環
l 其它 -- 條件值等同於字符串"false"(等同於輸入框中輸入false)時,退出循環
Contion輸入框的可以輸入最終計算結果等同於“false”的變量、函數。這允許在必要時使用JavaScript, BeanShell, 屬性(propertie) 或變量(variable)
例子:
l ${var_name} - var_name的值由其它元素設置爲"false"
l ${__} - 判斷變量var_name的值是否爲10,不爲10則退出循環
l ${__javaScript(${count}<60 && ${code}=="5001")} - 表示同時滿足 ${count}<60 和${code}=="5001"兩個條件才進入循環體
l {__P(property)} - 某處會被設置爲"false"的某個屬性(property)
十三、模塊控制器
首先在測試計劃下添加TestFragment(測試片段),測試片段需要結合模塊控制器來運行-》添加模塊控制器,find target element-》所選的測試片段會在運行到模塊控制器時運行
十四、包含控制器
包括控制器被設計成使用一個外部jmx文件。
測試計劃下面創建測試片段-》爲測試片段添加任何所需的取樣器,控制器等-》然後保存測試計劃,這個文件現在將要測試計劃的一部分。
爲了方便起見,一個線程組也可以添加在外部JMX文件用於調試目的。A
Module控制器可以用來參考測試片段。線程組包括過程將被忽略。
如果測試使用Cookie管理或用戶定義的變量,這些應放置在頂級測試計劃,不包括在文件中,否則他們不能保證工作。
下圖爲創建的JMX文件
下圖爲要運行的接口文件,其中include 控制器引用上述保存的文件
官網地址:
http://jmeter.apache.org/usermanual/component_reference.html#logic_controllers