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實戰》