Yuanchieh's Blog

Yuanchieh's Blog

生命是長期而持續的累積

26 Jun 2021

壓測工具:JMeter 使用教學 + 自定義變數使用

最近功能上線遇到一些 OOM 問題,在 Staging 手動驗證流量不夠測不出來有點頭疼,所以回頭用 JMeter 進行壓力測試,因為有 Cache 所以只打單一種 request 是沒有用的,必須組合出多種參數一起執行,好在 JMeter 支援 csv 輸入參數,以下將介紹如何使用

Sample 可以參考我的 github repo jmeter-pre-post-processor

安裝

官網下載最新版,解壓縮完 $ bin/jmeter 即可執行,記得電腦要安裝 java

Sample1: 操作

進行基本的壓力測試,大概會有以下的步驟

  1. 決定進行幾輪測試
  2. 要發送多少 request、同時間併發數
  3. request 針對的 host / 參數設定
  4. 結果的顯示,可以將 response 存成檔案 / 圖表顯示 response 速度、成功率等

對應 JMeter 設定是

  1. Thread Group
    1. Number of Threads: 多少 request
    2. Loop Count: 總共幾輪
    3. Ramp-Up Second: 有點 ticky 的參數,指定多少時間內 Thread 會啟動,假設設定 90 sec 總共有 10 個 thread,則下一個 thread 會上一個 thread 成功後 + 9 (90/10) sec 後啟動,官方建議 預設 = threads 數量再視情況增減,如果要確保同時併發,request 執行時間要大於 thread 啟動時間
  2. 在 Thread Group 上,按下右鍵增加
    1. Config Element 系列:可以放共用參數
      1. Http Request Default: Http request 的預設參數,可以放 host / port 等共用設定
      2. Http Header Manager: 放共同 Header
    2. Sampler: 採樣,也就是要測試的項目
      1. Http Request: 指定要打的參數
    3. Listener: 收集結果
      1. Summary Report:統計所有 request 的速度與成功率等

Sample2: 從 csv 讀取參數

選擇 Config Element > CSV Data Set Config,選擇 csv 檔案後,在 Http Request 可以用 ${變數名} 的方式,就可以讀取到對應的 csv 欄位喔 例如我的 csv 長這樣

account,password
user1,test1
user2,test2
user3,test3

我希望打出 POST /login 中的 body 帶參數,變成

{"user": "${account}", "password": "${password}"}

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,並輸入

var account = vars.get("account")
account = "prefix_" + account
vars.put("account", account)
log.info(vars)

有一些環境變數可以使用,例如 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

var responseBody = sampler.sample().getResponseDataAsString();
responseBody = JSON.parse(responseBody)
vars.put("user_id", String(responseBody.id))

這樣下一個 request 就可以拿 ${user_id} 了

結語

JMeter 有非常多方便且強大的組件,可以組合出各種客製化的壓測環境

Categories