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的所有定時器就已經介紹完了,感謝你耐心的閱讀和學習。
您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得隨手點波 推薦 不要忘記哦!!!
別忘了點 推薦 留下您來過的痕跡