最近功能上線遇到一些 OOM 問題,在 Staging 手動驗證流量不夠測不出來有點頭疼,所以回頭用 JMeter 進行壓力測試,因為有 Cache 所以只打單一種 request 是沒有用的,必須組合出多種參數一起執行,好在 JMeter 支援 csv 輸入參數,以下將介紹如何使用
Sample 可以參考我的 github repo jmeter-pre-post-processor
安裝
到官網下載最新版,解壓縮完 $ bin/jmeter
即可執行,記得電腦要安裝 java
Sample1: 操作
進行基本的壓力測試,大概會有以下的步驟
- 決定進行幾輪測試
- 要發送多少 request、同時間併發數
- request 針對的 host / 參數設定
- 結果的顯示,可以將 response 存成檔案 / 圖表顯示 response 速度、成功率等
對應 JMeter 設定是
Thread Group
- Number of Threads: 多少 request
- Loop Count: 總共幾輪
- Ramp-Up Second: 有點 ticky 的參數,指定多少時間內 Thread 會啟動,假設設定 90 sec 總共有 10 個 thread,則下一個 thread 會上一個 thread 成功後 + 9 (90/10) sec 後啟動,官方建議
預設 = threads 數量再視情況增減
,如果要確保同時併發,request 執行時間要大於 thread 啟動時間
- 在 Thread Group 上,按下右鍵增加
Config Element
系列:可以放共用參數- Http Request Default: Http request 的預設參數,可以放 host / port 等共用設定
- Http Header Manager: 放共同 Header
Sampler
: 採樣,也就是要測試的項目- Http Request: 指定要打的參數
Listener
: 收集結果- Summary Report:統計所有 request 的速度與成功率等
Sample2: 從 csv 讀取參數
選擇 Config Element > CSV Data Set Config,選擇 csv 檔案後,在 Http Request 可以用 ${變數名}
的方式,就可以讀取到對應的 csv 欄位喔
例如我的 csv 長這樣
|
|
我希望打出 POST /login 中的 body 帶參數,變成
|
|
JMeter 會依序從上至下不斷輪迴發送喔
Sample3: Pre Processor
如果我們希望在每次 Request 前做一些預處理,例如產生亂數、字串組合等,就可以用 Pre Processor,有分成很多種,可以用 BeanShell (java-like script language) 或是 JSR223 (javascript / groovy 等更多的 script language),這邊就用 javascript
延伸自 Sample2,先將 csv 讀進來的 account / password 當作參數,在 account 前面加一個 “prefix_” 字串,做法上新增一個 JSR223 Preprocessor,選擇 javascript,並輸入
|
|
有一些環境變數可以使用,例如 vars
可以取得/設定當前的變數,其餘還有 sample
可以改變 sample 結果 / log
打出 log, console.log 是不能用的 / props
取得當前 JMeter 設定等,這些比較進階,可以參考 How to Use BeanShell: JMeter’s Favorite Built-in Component
Post Processor
有些時候,我們會希望做一些後處理,例如 parse response 做 assertion 等,可以增加 post-processor,例如我們可以接登入取得的 token,當作下一個 request 的參數,新增一個 JSR223 PostProcessor
|
|
這樣下一個 request 就可以拿 ${user_id} 了
結語
JMeter 有非常多方便且強大的組件,可以組合出各種客製化的壓測環境