🔥Jmeter(十四) - 從入門到精通 - JMeter 定時器 - 下篇(詳解教程)

北京-宏哥發表於2025-03-03

1.簡介

  使用者實際操作時,並非是連續點選,而是存在很多停頓的情況,例如:使用者需要時間閱讀文字內容、填表、或者查詢正確的連結等。為了模擬使用者實際情況,在效能測試中我們需要考慮思考時間。若不認真考慮思考時間很可能會導致測試結果的失真。例如,估計的可支撐使用者數偏小。在效能測試中,訪問請求之間的停頓時間被稱之為思考時間,那麼如何模擬這種停頓呢?我們可以藉助 JMeter 的定時器實現。

  JMeter 中的定時器一般被我們用來設定延遲與同步。定時器的執行優先順序高於 Sampler(取樣器),在同一作用域(例如控制器下)下有多個定時器存在時,每一個定時器都會執行,如果想讓某一定時器僅對某一 Sampler 有效,則可以把定時器加在此 Sampler 節點下。

2.預覽定時器

首先我們來看一下 JMeter 的定時器,路徑:執行緒組(使用者)->新增->定時器(Timer);我們可以清楚地看到 JMeter5 中共有 9 個定時器,如下圖所示:

如果上圖您看得不是很清楚的話,宏哥總結了一個思維導圖,關於 JMeter5 的邏輯控制器型別,如下圖所示:

透過以上的瞭解,我們對定時器有了一個大致的瞭解和認識。下面宏哥就給小夥伴或則童鞋們分享講解一些通常在工作中會用到的定時器。

3.常用定時器詳解

這一小節,宏哥就由上而下地詳細地講解一下常用的定時器。

3.1Gaussian Random Timer

高斯定時器,高斯定時器,生成一個呈高斯分佈的時間間隔。
如需要每個執行緒的延遲時間是符合標準正態分佈的隨機時間停頓,那麼使用這個定時器,總延遲 = 高斯分佈值(平均 0.0 和標準偏差 1.0)* 指定的偏差值 + 固定延遲偏移 (計算參考:Math.abs((this.random.nextGaussian() * 偏差值) + 固定延遲偏移))。
另一種解釋方法,在高斯隨機定時器中, 隨機時間在固定延遲偏移附近,機率符合高斯曲線分佈。

總延遲時間 = 高斯分佈值(平均 0.0 和標準差 1.0)* 指定的偏差值 + 固定延遲偏移

1、我們先來看看這個Gaussian Random Timer長得是啥樣子,路徑: 執行緒組 > 新增 > ** 定時器 > 高斯隨機定時器 ** ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Deviation: 忽略子控制器,即子控制器失效,由交替控制器接管。

Constant Delay Offset:

3.1.1 例項

1、新建測試計劃,執行緒組下新增 2 個取樣器 訪問部落格園首頁、訪問北京宏哥的園子,如下圖所示:

2、然後再新增高斯隨機定時器,設定高斯隨機定時器的偏差為 1000ms,固定延遲偏移為 3000,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視錶格結果(取樣器訪問部落格園首頁和訪問度娘間隔 3s),如下圖所示:

3.2JSR223 Timer

JSR 定時器,在 jemter 最新的版本中,新增了這個定時器,可以這麼理解,這個定時器相當於 BeanShell 定時器的 “父集”,它可以使用 java、JavaScript、beanshell 等多種語言去實現你希望完成的事情。

1、我們先來看看這個JSR223 Timer長得是啥樣子,路徑: 執行緒組 > 新增 > ** 定時器 > JSR233 定時器 ** ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Thread Delay: 忽略子控制器,即子控制器失效,由交替控制器接管。

3.2.1 例項

1、新建測試計劃,執行緒組下新增 2 個取樣器 訪問部落格園首頁、訪問度娘,如下圖所示:

2、然後再新增 JSR223 定時器,編寫指令碼設定延遲時間 5s,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視錶格結果(取樣器訪問部落格園首頁和訪問度娘間隔 5s),如下圖所示:

3.3Poisson Random Timer

泊松隨機定時器,這個定時器在每個執行緒請求之前按隨機的時間停頓,總的延遲就是泊松分佈值和偏移值之和。這個定時器在每個執行緒請求之前按隨機的時間停頓,總的延遲就是泊松分佈值和偏移值之和。

泊松分佈:機率學中離散機率分佈

1、我們先來看看這個Poisson Random Timer長得是啥樣子,路徑: 執行緒組 > 新增 > ** 定時器 > 泊松隨機定時器 ** ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Lambda(in milliseconds): 蘭布達值;

Constant Delay Offset(in milliseconds): 暫停的毫秒數減去隨機延遲的毫秒數。

3.3.1 例項

1、新建測試計劃,執行緒組下新增 2 個取樣器 訪問部落格園首頁、訪問度娘,如下圖所示:

2、然後再新增泊松定時器,設定暫停時間會分佈在 100 到 400 毫秒之間,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視錶格結果(取樣器訪問部落格園首頁和訪問度娘間隔在 100 到 400 毫秒之間),如下圖所示:

3.4Synchronizing Timer

同步計時器,用來模擬多使用者併發,或者說更嚴格的併發場景,比如秒殺活動,就要用這個玩意了。

作用:也是用來設定集合點,阻塞執行緒,同步虛擬使用者,直到指定的執行緒數量到達後,恰好在同一時刻執行任務,再一起釋放,可以瞬間產生很大的壓力。

注意:敲黑板,敲腦袋!!!

一般情況,併發使用者數多少,同步定時器就寫多少。(多少併發就要等多少個人到齊一起釋放)

1、我們先來看看這個Synchronizing Timer長得是啥樣子,路徑: 執行緒組 > 新增 > ** 定時器 > 同步定時器 ** ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Number of Simulated Users to Group by: 集合點個數(執行的執行緒數),如果設定為 0,等於設定為執行緒租中的執行緒數量。

Timeout in milliseconds: 指定執行緒數多少秒沒集合到算超時(以毫秒為單位)。如果設定為 0,該定時器將會等待執行緒數達到了"Number of Simultaneous Users toGroup"中設定的值才釋放,不夠的話就死等。如果大於 0,那麼如果超過 Timeout inmilliseconds 中設定的最大等待時間後還沒達到"Number of Simultaneous Users toGroup"中設定的值,Timer 將不再等待,釋放已到達的執行緒。預設為 0

注意:敲黑板,敲腦袋!!!

(1)上面兩個引數如果都設定了值,則在實際中是哪個條件先達到,定時器先執行哪個,如第一個引數釋放執行緒數量先達到,則不會管超時時間的值,timer 會釋放;如果第二個引數超時時間先達到,則不會再等執行緒數量,按照目前超時的時間點集合的執行緒數,timer 釋放。

(2)同步定時器(Synchronizing Timer)的超時時間設定要求: 超時時間 > 請求集合數量 * 1000 / (執行緒數 / 執行緒載入時間)

執行緒組使用者數 100,新增同步定時器

執行緒數 (100) 定時器等待執行緒數 (視情況而定) 超時設定 (預設為 0,單位毫秒) 設定效果 (指令碼執行達到的效果)
100 100 0 使用者等待達到 100 個使用者,同時併發請求
100 90 100 1、剛好超時 100ms,且等到 90 個使用者併發請求;2、等到 90 個使用者,未超時,繼續等到結束,再併發,這時使用者數將大於 90;3、等到小於 90 和使用者,又超過了設定 100ms,那麼以等到的使用者併發請求,可能小於 90;
100 110 0 使用者無法達到 110 個使用者,執行緒將一直等待,不會停止;
100 100 100 1、剛好超時 100ms,等到 100 個使用者併發請求;2、超時 100ms 後,定時器以等到的最大使用者數併發請求;3、如果超時 100ms,使用者數沒有到達 100,將以等到的使用者數併發請求,這是使用者數可能小於 100;
100 0 0 定時器設定的使用者數等效於執行緒的使用者數,超時預設設定為 0,使用者同時併發請求

3.4.1 例項

a. 若某個請求需要併發測試,則可在該請求下新增同步定時器。

1、新建測試計劃,執行緒組(設定執行緒組 10 個,載入時間 1s)下新增 2 個取樣器 訪問部落格園首頁(已停用)、訪問度娘,如下圖所示:

2、然後再新增同步定時器,設定模擬使用者組數量:10,超時時間:5000,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視錶格結果(幾乎是在同一時間,10 個使用者同時併發訪問度娘),如下圖所示:

b. 若某幾個請求需要同時進行併發,則可在請求的同一級新增同步定時器。

1、新建測試計劃,執行緒組下新增 2 個取樣器 訪問部落格園首頁、訪問度娘,如下圖所示:

2、然後再新增同步定時器,設定模擬使用者組數量:10,超時時間:5000,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視錶格結果(取樣器訪問部落格園首頁和訪問度娘間隔 3s),如下圖所示:

c. 若某幾個執行緒需要同步併發,則可在測試計劃下(執行緒組同一級)新增同步定時器(適用於多業務混合併發測試)。

1、新建測試計劃,新增同步定時器,設定模擬使用者組數量:10,超時時間:5000,如下圖所示:

2、然後再新增兩個執行緒組,一個執行緒組下新增 2 個取樣器 訪問部落格園首頁、訪問度娘,另一個執行緒組下新增 1 個取樣器 訪問度娘 1,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視錶格結果,如下圖所示:

3.5BeanShell Timer(重要 - 常用)

Bean Shell 定時器,顧名思義是:互相交替,其節點下的取樣器交替執行。根據被控制器觸發執行次數,去依次執行控制器下的子節點<邏輯控制器、取樣器>。被觸發執行可以由執行緒組的執行緒數、迴圈次數、邏輯控制器觸發。

1、我們先來看看這個 ** Bean Shell 定時器長得是啥樣子,路徑: *執行緒組 > 新增 > *定時器 > Bean Shell 定時器 ** ,如下圖所示:

2、關鍵引數說明如下:

Name: 名稱,可以隨意設定,甚至為空;

Comments: 註釋,可隨意設定,可以為空;

Reset Interpreter: 每次迭代是否重置解析器,預設為 false;在長時間執行的指令碼中建議設定為 true。

Parameters: BeanShell 指令碼的入參。入參可以是單個變數;也可以是陣列,若是字串陣列,兩個元素之間用空格隔開;也可以是常量。

File Name: BeanShell 指令碼可以從指令碼檔案中讀取。

Script: 在 Script 區直接寫 BeanShell 指令碼。

3.5.1 例項

1、新建測試計劃,執行緒組下新增 2 個取樣器 訪問部落格園首頁、訪問度娘,如下圖所示:

2、然後再新增 Bean Shell 定時器,指令碼程式碼設定延遲時間 5s,如下圖所示:

3、配置好以後,點選 “儲存”,執行 JMeter,檢視結果樹(取樣器訪問部落格園首頁和訪問度娘間隔 5s),如下圖所示:

4.小結

   好了,今天到這裡 JMeter 的所有定時器就已經介紹完了,感謝你耐心的閱讀和學習。

相關文章