[Stress Test] JMeter Wait, Loop, and Random 等待、迴圈與隨機數

熱門文章 (Popular Post)

Posted by : Duran Hsieh 5月 30, 2017


前言

撰寫壓力測試腳本如同撰寫程式一樣,經常面臨對於某些測試行為進行延遲重複處理,也有機會遇到需要隨機數產生資料進行測試的情境。在這篇,我們將介紹如何於 JMeter 中撰寫 Wait, Loop, 與 Random 腳本,與前一篇 variable 與 property 結合,撰寫腳本將更得心應手。本篇文章若有任何錯誤或建議,請各位先進不吝指導,謝謝。


介紹

Wait :延遲

延遲部分可以分成 計時器(Timer)測試動作(Test Action),有不同的設定方法。

1. Timer (計時器):
在談計時器 (Timer) 之前,我們必須詳細閱讀官網說明,個人過去有過看到 Timer 很開心直接拿來用,最後壓測結果頗詭異,很久才發現有問題。
Note that timers are processed before each sampler in the scope in which they are found; if there are several timers in the same scope, all the timers will be processed before each sampler.
Timers are only processed in conjunction with a sampler. A timer which is not in the same scope as a sampler will not be processed at all.
To apply a timer to a single sampler, add the timer as a child element of the sampler. The timer will be applied before the sampler is executed. To apply a timer after a sampler, either add it to the next sampler, or add it as the child of a Test Action Sampler.
主要重點如下:
1. Timer 的執行會在取樣前執行,無論放在同一層,或當作 child 放在某個取樣底下。如下範例,雖然計時器放在 Step1 後面,執行結果仍是 停2秒 > 執行Step 1


2. Timer 的執行為同一層範圍(Scope)的每一個取樣,除非你把它放在某一個取樣底下當作child。
以下面腳本為例,結果會是 : 等2秒 > 執行Step1 > 等2秒 > 執行 Step2 > 等2秒 > 執行Step 3;且無論 計時器 放在 交易控制器之前交易控制器與Step2之間 Step2與Step3之間 (同一層),執行結果是相同的!!


下面為執行結果:

3. 使用計時器要注意腳本情境,因為計時器停止之前不會初始化/啟動下一個工作,所以你的使用者(thread)會停止直到下一個工作啟動後會繼續下一個工作,這設定會與模擬真實使用者操作行為有所差異。若有需要不同 Thread 暫停,請考慮固定時隔(Constant Throughput Timer)與測試動作(Test Action)
(真實案例中,使用者很少同時停固定時間才發出下一個請求,有些使用者會在1秒、2.5秒、3.7秒...等些微差距時間發出請求。倘若你使用計時器暫停5秒,你的報表很有可能呈現每5秒鐘同時多名使用者發出訊息,中間有2-3秒沒有任何使用者發出請求。請依據案例修改您的腳本)

JMeter 計時器有許多不同類型,我們這邊不再贅述,只簡單介紹Constant Timer (固定值計時器)。
Step 1. 對要增加的工作點選右鍵 > 新增 > 計時器 > 固定值計時器

Step 2. 可以設定延遲時間(千分之一秒)


2.Test Action (測試動作)
Step 1.對要增加的工作點選右鍵 > 新增 > 取樣 > 測試動作

Step 2. 設定 執行緒標的為 目前執行緒/所有執行緒;設定動作為 暫停/停止/Stop Now/Go to next loop iteration;設定等待期間(千分之一秒)。即完成設定。






Loop :重複(迴圈)

我們可以透過 Loop Controller (迴圈控制器) 對特定流程進行重複執行動作,讓腳本更能靈活應用。
Step 1. 對要增加的工作點選右鍵 > 新增 > 邏輯控制器 > 迴圈控制器

Step 2. 將要重複執行的工作放在迴圈控制器底下 (child)

Step 3. 點選迴圈控制器進行設定:迴圈次數20次
註:本測試案例使用者(Thread)為1

Step 4. 點選執行觀看結果,可以看見Step2執行20次。






Random :隨機數

我們可以透過 Random variable 產生隨機數,用於某些需要隨機資料的情境下使用
Step 1. 對要增加的工作點選右鍵 > 新增 > 設定元素 >  Random variable

Step 2. Random variable 可以做下列設定:
Variable Name: 變數名稱,於後面工作中取用時的名稱;使用用方式為${Variable_Name},如果在 BeanShell 則是 vars.get("Variable_Name")。
Output Format: 格式,可加入任意文字與數字,下圖範例中 000 會被替換成隨機數 1-100
Minimum value: 隨機數範圍最小值
Maximum value: 隨機數範圍最大值
Seed: 預設為1/1000毫秒
這次測試案例我們設定使用者(Thread) 為20人、Variable Name 為 useId、Output Format 為 A-000、Minimum value為 1、Maximum value為100。

Step 3. 我們將BeanShell 內容改成下列:
print("UserId1:"+ vars.get("userId"));
print("UserId2:"+ vars.get("userId"));
print("UserId3:"+ vars.get("userId"));


Step 4. 執行腳本後結果如下:




上一篇:JMeter Function, Variables and Properties 變數與性質
目錄:請點我
下一篇:JMeter BeanShell 介紹與撰寫


參考資料


Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Duran Hsieh @ Matsurigoto - Date A Live - Powered by Blogger - Designed by Johanes Djogan -