JMeter定時器一般用來設置延遲與同步。它的作用域和優先級如下:
- 定時器的優先級高於Sampler。
- 在同一作用域(比如控制器下)有多個定時器存在,每個定時器都會執行。
- 在某一Sampler節點下的定時器,只對這個Sampler有效。
JMeter一共有9種定時器:
Constant Timer
固定值,多用來模擬思考時間。
Uniform Random Timer
隨機時間,分布會更均勻。
Random Delay Maximum:隨機延遲時間。
Constant Delay Offset:固定延遲時間。
示例:
會讓線程延遲在2.0到2.1秒之間。
Precise Throughput Timer
用的比較少,比Constant Throughput Timer更復雜更高級的用來控制吞吐量的一個定時器。
Constant Throughput Timer
控制吞吐量,盡量保持Sampler產生的吞吐量(RPS)在一個固定的范圍內。
Target throughput:目標吞吐量。JMeter會根據吞吐量、並發線程數來計算迭代的時間間隔,如果吞吐量大過設定值,就增加;反之減少。
Calculate Throughput based on:
this thread only:僅針對當前線程,每個線程互不干擾,分開計算需要延遲多少時間。
all active threads:把所有線程的吞吐量合在一起作為因子計算。
all active threads in current thread group:針對當前線程組中的所有線程。
all active threads (shared):在所有線程中,隨便獲取一個線程上次運行的實際來進行計算,結果隨機不一定准確,只能努力控制吞吐量在某一個范圍。
all active threads in current thread group (shared):在上面意思一樣,范圍是當前線程組。
Gaussian Random Timer
生成一個呈高斯分布的時間間隔,可以用來離散請求。
Deviation:一個浮動范圍的偏差值。
Constant Delay Offset:固定延遲時間。
JSR223 Timer
跟BeanShell類似,可以運行JavaScript等其他語言。
JDK集成了JS的運行引擎,可以運行JavaScript腳本,JSR223是一個標准,為腳本引擎提供了統一的接口、統一的訪問模式。
Poisson Random Timer
隨機時間,呈泊松分布。
Lambda:泊松分布的期望和方差。
Constant Delay Offset:固定延遲時間。
Synchronizing Timer
同步定時器,用來模擬多用戶並發同一時刻發起請求。
Number of Simulated Users to Group by:等待x個用戶(線程)集合后開始釋放(發起請求)。
默認為0,等同於設置為線程租中的線程數量。
Timeout in milliseconds:等待時長,如果等待這么長時間,還沒有達到上個選項設置的數量,那么不再等待,立即釋放已到達的線程。
默認為0,等待線程數達到上個選項設置的數量才釋放。
BeanShell Timer
Reset Interpreter:是否每次迭代重置解釋器,默認False。官方建議在長時間運行的腳本中才設置為True。
Parameters:入參,可以是單個變量,也可以是數組。
File Name:從腳本文件中讀取BeanShell腳本。
Script:
ctx:通過JmeterContent實例獲取運行時信息,如log.error(ctx.getThreadNum().toString());
。
vars:訪問或設置變量,如vars.get("name")
,vars.put("name", "dongfanger")
。
props:訪問JMeter屬性(%JMETER_HOME%/bin/jmeter.properties
),如props.get("log_level.jmeter")
,props.put("log_level.jmeter", "ERROR")
。
log:在代碼中調用log類來寫日志,如log.error("loadtest");
。
prev:可以訪問前面Sampler的結果。
示例:
小結
本文首先介紹了JMeter定時器的作用域和優先級,然后分別介紹了各式各樣的定時器,既能設置延遲,也能同步集合,可以固定可以隨機,配置與編程並存,五花八門。
參考資料:
《全棧性能測試修煉寶典JMeter實戰》