Image

前陣子協助某支 API 的壓力測試,趁機請 QA 朋朋指導指導一下,因此接觸了這款簡單好用的壓測工具 JMeter,趁現在記憶還在的時候記錄起來。

往後其他同事只要說 API 弄好了可以串了,就先幫他打個一萬次壓壓驚,真是貼心

JMeter 是款充滿暴力的壓力測試工具,只要告訴他:你要揍哪支 API?要揍幾拳?揍他個幾輪?它就會忠實地對你指定的 API 爆打一頓。

下載與開啟 JMeter

JMeter 會需要 Java,如果還沒有 Java 的朋友可以先安裝一下:下載 Windows 適用的 Java

首先讓我們到 JMeter 官網的 Download 頁面 來下載,這邊我選擇 zip:

Image

下載並解壓縮後,可以在 /bin 找到 jmeter.bat

Image

點開之後就會開啟 JMeter 的介面囉!

Image

更改語言

雖然 JMeter 的中文翻譯有些殘缺,但對英文弱弱的我來說,介面有太多英文會讓心理壓力變得太大,果然還是得先更改語言:

Image

接著就會看到介面的大部分都變成中文囉:

Image

批次呼叫指定的 API

雖然 JMeter 支援了一堆測試功能,例如 TCP 之類的,但身為一個 CRUD 工程師,我們當然要用呼叫 API 來當作範例囉!

在先前的 API 筆記,我們已經建立過簡單的「查詢卡片」API:

GET https://localhost:44304/card

這次就用 Local 的這支 API 作為範例來操作 JMeter 吧。

建立 Thread Group

讓我們回到 JMeter,可以看到預設已經有一組測試計畫了:

Image

而我們將會在測試計畫中加入幾個元素,利用這些元素的組合來達到我們測試 API 的目標。

首先我們會需要一個執行緒群組(Thread Group),用來告訴 JMeter 我們打算如何規劃這些 Thread 的行動。可以當作我們正在寫一個迴圈,現在才正要訂迴圈的內容而已。

讓我們在預設的測試計畫上按右鍵,新增一個執行緒群組:

Image

接著應該就會看到我們的測試計畫下多了一個群組,並且進入了該群組的設定畫面:

Image

這邊要特別注意的是右側的「執行緒屬性」,我們白話一點來說明:

  • 執行緒數量:要打幾次
  • 啟動延遲:幾秒內要打出去
  • 迴圈次數:要打幾輪

例如說,我們想要模擬一百個使用者,在一秒內湧進網站,然後這狀況持續三輪,那就是:

  • 執行緒數量 = 100
  • 啟動延遲 = 1
  • 迴圈次數 = 3

這時候也就決定了這次測試的總數(執行緒數量 * 迴圈次數)

此外,迴圈次數下的「Same user on each iteration」會讓每次迴圈時都用同一批使用者,如果想要每次都模擬全新的使用者,例如把前面的例子改成三百名使用者,分三批湧進網站,這時候就可以取消勾選。

而定時器則是讓我們設定在執行前先延遲多久、執行多久後自動停止,這邊例子不會用到,就不開啟了。

現在我們已經把執行緒群組建好了,讓我們指派任務給這個群組吧!

建立 Http Request

在執行緒群組上右鍵 > 新增,可以看到一排能指派給這群組的任務,其中「取樣」就是指我們這次的目標。這邊讓我們選擇「取樣 > HTTP 要求」:

Image

接著可以看到 HTTP Request 的設定畫面,如同前面所說的,我們這次的目標是 GET https://localhost:44304/card,因此將 API 的資訊填到對應的欄位中:

Image

在 API 的路由等資訊填好後,下方可以設定呼叫時要帶的參數,例如 Body 或上傳檔案等等。

補充:設定 Http Request Header

很多時候我們要測試的 API 會要求在 Header 帶著 Token 才能使用,這邊也記錄一下掛 Header 的做法。

對執行緒群組右鍵 > 新增,選擇「設定元素」,裡面就會有一票設定值可以選,這邊選擇「HTTP 標頭管理員」:

Image

例如我們要指定 Post 的 Body 為 Json,就可以掛一個 content-type = application/json

Image

這樣就會加到 Header 上囉:

Image

不過我們這次的範例只是一支簡單的查詢卡片,這邊就不用加上啦。讓我們進行下一步吧!

建立 Listener

當我們的小弟們去解決了目標之後,就必須要回來報告給我們知道。這邊讓我們一樣在執行緒群組上右鍵新增,並且選擇「接聽(Listener)」,先嘗試建立一個「檢視結果樹」:

Image

除了檢視結果樹以外也可以新增別的試試看,方便打完 API 之後確認,這邊再加上一個「Summary Report」,現在群組應該會長得像這樣:

Image

等等打完之後再來確認這兩頁的內容。現在讓我們戳戳看 API 吧!

開始執行測試

在最上面找到大家都很熟悉的綠色三角,戳下去就會執行這次的測試計畫,也就是照著剛剛的計畫烙一群小弟去揍 API

它旁邊還有發現不對勁時使用的 STOP,更旁邊的神奇掃把是用來在結束之後滅證用的清除結果:

Image

總之,用力給他按下綠色三角!

這邊就先意思意思揍個一拳,執行之後就可以來看看我們的檢視結果樹:

Image

可以看到結果樹中會顯示剛剛執行的結果,假設你打了兩百次這邊就會有兩百筆;右側則是這次 API 回傳的結果,通常都是看有沒有好好回 200 OK 就是了 xD

此外也可以切換上面的頁籤,看這次 API 回傳的內容:

Image

接著切換到剛剛新增過的 Summary Report,可以看 API 回來的時間等資訊:

Image

這樣就完成一次測試啦!

為了慶祝完成來打個一萬次 API 先(?)

Image

小結

這次筆記了 JMeter 這套壓力測試工具的簡單使用方式,在大多數對 API 做測試的場合中,只需要新增幾個 JMeter 提供的元件就可以完成任務,可以說是相當方便。

同時 JMeter 也提供了更多進階場景時用到的工具,來幫助我們在 Request 發送前後進行處理:例如在這次工作上用到的場景來說,就需要從設定元素中新增 CSV Data Set Config 來從 CSV 讀出需要的資訊,利用 ${參數名稱} 的語法來把參數加到我們的 HTTP 請求:

Image

Image

Image

又或是新增前置處理器,如 JSR223 PreProcesser 來撰寫 JavaScript 腳本,先對參數進行處理等等:

Image

Image

當然除了從 CSV 設定參數以外,JMeter 也提供了簡單的邏輯控制,像是從一數到十這種是完全沒問題的:

Image

有這些工具可以進行組合,可以說是相當方便。但大多時候我們只會需要用到基本的 Http Request。有興趣嘗試的朋友可以參考 Yuanchieh’s Blog 的這篇:壓測工具:JMeter 使用教學 + 自定義變數使用,以及官方文件 Apache JMeter - User’s Manual 來試試,這邊就不再贅述。

雖然 JMeter 還是有一點小問題,例如那個只有一半的翻譯,還有跑在 Linux 的表現會比 Windows 好之類的現象

但這無損它是個功能完善又簡單使用的壓力測試工具。需要的時候還是可以打開 JMeter,簡單掛個執行緒群組就揍起來,同事 API 寫好就直接把它打爛,不亦樂乎。

雖然我的後端前輩最後跑去用更新更潮的 K6 了,嘖。我筆記都寫完了欸,讓我看看是有多潮……

Image

那麼今天的筆記就到這邊,我們下次見!

參考資料與延伸閱讀