首先需要清楚Jmeter中各個元件的執行順序:
元件的執行順序
了解了元件有作用域之后,來看看元件的執行順序,元件執行順序的規則很簡單,在同一作用域名范圍內,測試計划中的元件按照如下順序執行。
(1)配置元件(config elements )
(2)前置處理程序(Per-processors)
(3)定時器(timers )
(4)取樣器(Sampler)
(5)后置處理程序(Post-processors) (除非Sampler 得到的返回結果為空)。
(6)斷言(Assertions)(除非Sampler 得到的返回結果為空)。
(7)監聽器(Listeners)(除非Sampler 得到的返回結果為空)。
關於執行順序,有兩點需要注意:
* 前置處理器、后置處理器和斷言等元件公能對 取樣器作用,因此,如果在它們的作用域內沒有任何取樣器,則不會被執行。
* 如果在同一作用域范圍內有多個同一類型的元件,則這些元件按照它們在測試計划中的上下順序一次執行。
備注:執行順序依次為:配置元件(CSV Data Set Config)-前置處理器-定時器-取樣器-后置處理器-斷言-監聽器
一、定時器的作用域
1、定時器是在每個sampler(采樣器)之前執行的,而不是之后(無論定時器位置在sampler之前還是下面);
2、當執行一個sampler之前時,所有當前作用域內的定時器都會被執行;
3、如果希望定時器僅應用於其中一個sampler,則把定時器作為子節點加入;
4、如果希望在sampler執行完之后再等待,則可以使用Test Action;
二、定時器的作用
1、固定定時器(Constant Timer)

這是一個很重要的定時器,如果你需要讓每個線程在請求之前按相同的指定時間停頓,那么可以使用這個定時器;需要注意的是,固定定時器的延時不會計入單個sampler的響應時間,但會計入事務控制器的時間。
對於“java請求”這個sampler來說,定時器相當於loadrunner中的pacing(兩次迭代之間的間隔時間);
對於“事務控制器”來說,定時器相當於loadrunner中的think time(思考時間:實際操作中,模擬真實用戶在操作過程中的等待時間)。
這里附上一個傳送門,對loadrunner中的pacing和think time有比較全面的解釋:https://zhidao.baidu.com/question/1431215934913423459.html
我們通常說的響應時間,應該大部分情況下是針對某一個具體的sampler(http請求),而不是針對一組sampler組合的事務 。
2、固定吞吐量定時器(Constant Throughput Timer)

可以讓JMeter以指定數字的吞吐量(即指定TPS,只是這里要求指定每分鍾的執行數,而不是每秒)執行。
吞吐量計算的范圍可以為指定為當前線程、當前線程組、所有線程組等范圍,並且計算吞吐量的依據可以是最近一次線程的執行時延。這種定時器在特定的場景下,還是很有用的。
3、同步定時器(Synchronizing Timer)

這個定時器和loadrunner當中的集合點(rendezvous point)作用相似,其作用是:阻塞線程,直到指定的線程數量到達后,再一起釋放,可以瞬間產生很大的壓力(人多力量大- -哈哈!)
(1)Number of Simulated Users to Group by:模擬用戶的數量,即指定同時釋放的線程數數量
(2)Timeout in milliseconds:超時時間,即超時多少毫秒后同時釋放指定的線程數
思考:超時時間一般情況設置多大???
首先,要清楚為什么要設置這個超時時間?
1、實際運行過程中,可能出現始終無法達到集合點設置的並發要求;如果出現這種情況的話Jmeter會一直卡頓在那里,等待滿足要求,才會繼續往下執行;
2、為了避免上述情況的發生,我們需要設置一下集合點的超時時間
設置規則為:因為集合點超時時間的單位為ms
計算公式:超時時間/1000 > 集合並發數/(設置線程數/啟動加載時間)
性能測試中我們經常提到一個概念就是“並發”,其實在實際真實的性能測試中是不存在真正的並發的。為了更真實的模擬對一個請求的並發測試場景,我們通常設置一個集合點,JMeter中提供了這樣的一個功能設置。
那么集合點的大致概念是什么呢?
簡單理解就是:設置一個閥值(請求數量),當請求數達到這個閥值時,允許請求同時發出。例如:想測試一座橋的並發(忽略載重等其他因素,只考慮通過),那么並發的請求就是類似於多少輛車可同時通過橋,而車輛一般情況下是不可能同時通過橋的,因而我們可以在橋頭A,設置一個集合點,等車輛數滿足一定的數量,同時讓車輛通過此橋。
添加路徑:右鍵單擊線程組,依次選擇【添加/定時器/Synchronizing Timer】即可添加集合點

添加后,顯示如下圖所示:

PS:超時時間為0時,默認無超時限制。
實際運行過程中,可能出現請求數當不滿足集合點設置的請求數時,JMeter一直卡頓在如下頁面:

解決辦法是:設置同步定時器的超時時間。
同步定時器(Synchronizing Timer)的超時時間設置要求:
超時時間 > 請求集合數量 * 1000 / (線程數 / 線程加載時間)

