使用 JMeter 來對 API 壓力測試吧
前陣子協助某支 API 的壓力測試,趁機請 QA 朋朋指導指導一下,因此接觸了這款簡單好用的壓測工具 JMeter,趁現在記憶還在的時候記錄起來。
往後其他同事只要說 API 弄好了可以串了,就先幫他打個一萬次壓壓驚,真是貼心
JMeter 是款充滿暴力的壓力測試工具,只要告訴他:你要揍哪支 API?要揍幾拳?揍他個幾輪?它就會忠實地對你指定的 API 爆打一頓。
下載與開啟 JMeter
JMeter 會需要 Java,如果還沒有 Java 的朋友可以先安裝一下:下載 Windows 適用的 Java
首先讓我們到 JMeter 官網的 Download 頁面 來下載,這邊我選擇 zip:
下載並解壓縮後,可以在 /bin
找到 jmeter.bat
:
點開之後就會開啟 JMeter 的介面囉!
更改語言
雖然 JMeter 的中文翻譯有些殘缺,但對英文弱弱的我來說,介面有太多英文會讓心理壓力變得太大,果然還是得先更改語言:
接著就會看到介面的大部分都變成中文囉:
批次呼叫指定的 API
雖然 JMeter 支援了一堆測試功能,例如 TCP 之類的,但身為一個 CRUD 工程師,我們當然要用呼叫 API 來當作範例囉!
在先前的 API 筆記,我們已經建立過簡單的「查詢卡片」API:
GET https://localhost:44304/card
這次就用 Local 的這支 API 作為範例來操作 JMeter 吧。
建立 Thread Group
讓我們回到 JMeter,可以看到預設已經有一組測試計畫了:
而我們將會在測試計畫中加入幾個元素,利用這些元素的組合來達到我們測試 API 的目標。
首先我們會需要一個執行緒群組(Thread Group),用來告訴 JMeter 我們打算如何規劃這些 Thread 的行動。可以當作我們正在寫一個迴圈,現在才正要訂迴圈的內容而已。
讓我們在預設的測試計畫上按右鍵,新增一個執行緒群組:
接著應該就會看到我們的測試計畫下多了一個群組,並且進入了該群組的設定畫面:
這邊要特別注意的是右側的「執行緒屬性」,我們白話一點來說明:
- 執行緒數量:要打幾次
- 啟動延遲:幾秒內要打出去
- 迴圈次數:要打幾輪
例如說,我們想要模擬一百個使用者,在一秒內湧進網站,然後這狀況持續三輪,那就是:
- 執行緒數量 = 100
- 啟動延遲 = 1
- 迴圈次數 = 3
這時候也就決定了這次測試的總數(執行緒數量 * 迴圈次數)
此外,迴圈次數下的「Same user on each iteration」會讓每次迴圈時都用同一批使用者,如果想要每次都模擬全新的使用者,例如把前面的例子改成三百名使用者,分三批湧進網站,這時候就可以取消勾選。
而定時器則是讓我們設定在執行前先延遲多久、執行多久後自動停止,這邊例子不會用到,就不開啟了。
現在我們已經把執行緒群組建好了,讓我們指派任務給這個群組吧!
建立 Http Request
在執行緒群組上右鍵 > 新增,可以看到一排能指派給這群組的任務,其中「取樣」就是指我們這次的目標。這邊讓我們選擇「取樣 > HTTP 要求」:
接著可以看到 HTTP Request 的設定畫面,如同前面所說的,我們這次的目標是 GET https://localhost:44304/card
,因此將 API 的資訊填到對應的欄位中:
在 API 的路由等資訊填好後,下方可以設定呼叫時要帶的參數,例如 Body 或上傳檔案等等。
補充:設定 Http Request Header
很多時候我們要測試的 API 會要求在 Header 帶著 Token 才能使用,這邊也記錄一下掛 Header 的做法。
對執行緒群組右鍵 > 新增,選擇「設定元素」,裡面就會有一票設定值可以選,這邊選擇「HTTP 標頭管理員」:
例如我們要指定 Post 的 Body 為 Json,就可以掛一個 content-type
= application/json
:
這樣就會加到 Header 上囉:
不過我們這次的範例只是一支簡單的查詢卡片,這邊就不用加上啦。讓我們進行下一步吧!
建立 Listener
當我們的小弟們去解決了目標之後,就必須要回來報告給我們知道。這邊讓我們一樣在執行緒群組上右鍵新增,並且選擇「接聽(Listener)」,先嘗試建立一個「檢視結果樹」:
除了檢視結果樹以外也可以新增別的試試看,方便打完 API 之後確認,這邊再加上一個「Summary Report」,現在群組應該會長得像這樣:
等等打完之後再來確認這兩頁的內容。現在讓我們戳戳看 API 吧!
開始執行測試
在最上面找到大家都很熟悉的綠色三角,戳下去就會執行這次的測試計畫,也就是照著剛剛的計畫烙一群小弟去揍 API
它旁邊還有發現不對勁時使用的 STOP,更旁邊的神奇掃把是用來在結束之後滅證用的清除結果:
總之,用力給他按下綠色三角!
這邊就先意思意思揍個一拳,執行之後就可以來看看我們的檢視結果樹:
可以看到結果樹中會顯示剛剛執行的結果,假設你打了兩百次這邊就會有兩百筆;右側則是這次 API 回傳的結果,通常都是看有沒有好好回 200 OK 就是了 xD
此外也可以切換上面的頁籤,看這次 API 回傳的內容:
接著切換到剛剛新增過的 Summary Report,可以看 API 回來的時間等資訊:
這樣就完成一次測試啦!
為了慶祝完成來打個一萬次 API 先(?)
小結
這次筆記了 JMeter 這套壓力測試工具的簡單使用方式,在大多數對 API 做測試的場合中,只需要新增幾個 JMeter 提供的元件就可以完成任務,可以說是相當方便。
同時 JMeter 也提供了更多進階場景時用到的工具,來幫助我們在 Request 發送前後進行處理:例如在這次工作上用到的場景來說,就需要從設定元素中新增 CSV Data Set Config 來從 CSV 讀出需要的資訊,利用 ${參數名稱}
的語法來把參數加到我們的 HTTP 請求:
又或是新增前置處理器,如 JSR223 PreProcesser 來撰寫 JavaScript 腳本,先對參數進行處理等等:
當然除了從 CSV 設定參數以外,JMeter 也提供了簡單的邏輯控制,像是從一數到十這種是完全沒問題的:
有這些工具可以進行組合,可以說是相當方便。但大多時候我們只會需要用到基本的 Http Request。有興趣嘗試的朋友可以參考 Yuanchieh’s Blog 的這篇:壓測工具:JMeter 使用教學 + 自定義變數使用,以及官方文件 Apache JMeter - User’s Manual 來試試,這邊就不再贅述。
雖然 JMeter 還是有一點小問題,例如那個只有一半的翻譯,還有跑在 Linux 的表現會比 Windows 好之類的現象
但這無損它是個功能完善又簡單使用的壓力測試工具。需要的時候還是可以打開 JMeter,簡單掛個執行緒群組就揍起來,同事 API 寫好就直接把它打爛,不亦樂乎。
雖然我的後端前輩最後跑去用更新更潮的 K6 了,嘖。我筆記都寫完了欸,讓我看看是有多潮……
那麼今天的筆記就到這邊,我們下次見!
參考資料與延伸閱讀
其他文章
哈囉,如果你也有 LikeCoin,也覺得我的文章有幫上忙的話,還請不吝給我拍拍手呦,謝謝~ ;)