# JMeter初心者篇 ###### tags: `工具` # 1. 簡介 Apache JMeter 是 Apache 開發的壓力測試套件,程式是純JAVA寫成,可以在 Unix-like 和 Windows 上執行。 本篇執行環境為Windows 10系統,JDK版本為15,JMeter版本為5.4。 # 2. 安裝 * [Java JDK]( https://www.oracle.com/java/technologies/javase-downloads.html) 8以上 * [JMeter](https://jmeter.apache.org/download_jmeter.cgi) windows版參考下圖 ![](https://i.imgur.com/0B4pwmc.png) # 3. 啟動 JMeter ## 3.1 解壓縮ZIP後,開啟 \bin\jmeter.bat ![](https://i.imgur.com/E4PlQAx.png) --- ## 3.2 切換成最熟悉的味道 [繁體中文] ![](https://i.imgur.com/wbM6xy1.png) --- # 4. 模擬情境: 單一登入 目標壓測網站的登入,大致整體流程如下圖 ```flow st=>start: 開始 e=>end: 結束 o1=>operation: 設定 Http Hearder資訊 o2=>operation: [API] 取得驗證圖資訊 o3=>operation: [API] 登入-取得token s1=>subroutine: 解析回傳JSON,並取得驗證圖ID st->o1->o2->s1->o3->e ``` ## 4.1 新增[執行緒群組] 步驟: TestPlan滑鼠右鍵>新增>Threads>==執行緒群組== ![](https://i.imgur.com/WJ3Hsyi.png) ## 4.2 新增[HTTP Header] 步驟: 執行緒群組滑鼠右鍵>新增>設定元素>==HTTP 標頭管理員== ![](https://i.imgur.com/DU1GNI5.png) Header內容,主要看目標網站客製化, 這裡一點要注意,由於測試網站的API Request主要是以**Json格式**傳輸, 需要另外加入Header ==[Content-Type]: application/json== | 名 稱 | Value | | ----------------- | -------- | |User-Agent | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36| |X-LANGUAGE |zh-cn| |X-GLOBAL-CONFIG |67b6dbaa9ac38eb385629ee3a1de9cab| |X-DOMAIN |www.bw888.dev.rd1 |s |X-TOKEN | | |Content-Type | ==application/json==| ![](https://i.imgur.com/GJ7KSl0.png) --- ## 4.3 新增[API] 取得驗證圖 ### 建立HTTP要求 步驟: 執行緒群組>新增>取樣>==HTTP要求== ![](https://i.imgur.com/XC7Qe67.png) --- ### 設定API內容 | 欄位 | 值 | | -------- | -------- | | 名稱 | Api-取得驗證圖 | | 協定 | http | | 主機名稱 | www-api.bw168.dev.rd1 | | HTTP要求 | POST | | 路徑 | /api/Home/GetPictureCaptcha | ![](https://i.imgur.com/z70BQQh.png) --- ### 解析API 回應Json資料 新增[Json Extractor],步驟: Api-取得驗證圖(滑鼠右鍵)>新增>後置處理器>==JSON Extractor== ![](https://i.imgur.com/ZDRfzZ5.png) 先觀察API回應的Json如下圖 ![](https://i.imgur.com/Ug6gD45.png) CaptchaID 參數的Json的路徑為: Data.CaptchaID 透過 [Json Extractor] 把CaptchaID 宣告成動態變數,並設定Json路徑(須加上 ==$.==) | 欄位 | 值 | | -------- | -------- | | Names of Createdvariables | CaptchaID | | Json Path Expressions | $.Data.CaptchaID | 透過這個設定,其他地方就可以使用 ==${CaptchaID}== 來取得值 ![](https://i.imgur.com/qeq9kwa.png) ## 4.4 新增[API]登入 ### 建立 HTTP要求 步驟: 執行緒群組>新增>取樣>==HTTP要求== ![](https://i.imgur.com/L9CY3p4.png) --- ### 設定API內容 | 欄位 | 值 | | -------- | -------- | | 名稱 | Api-登入 | | 協定 | http | | 主機名稱 | www-api.bw168.dev.rd1 | | HTTP要求 | POST | | 路徑 | /api/Home/GetPictureCaptcha | 參數: ```json= { "CountryCallingCodeID": null, "LoginText": "ct0001", "Password": "aa123456", "CaptchaID": "${CaptchaID}", "Code": "0000" } ``` ※這邊可以注意下 CaptchaID 值,使用上方API回傳的參數格式為 ==${CaptchaID}== ![](https://i.imgur.com/91GpOMo.png) --- ## 4.5 新增[檢視結果樹] 這個Listener應該是必用的項目,主要用來觀察每個Request回來的結果。 步驟:執行緒群組(右鍵)>新增>接聽>==檢視結果樹== ![](https://i.imgur.com/2g6vPIM.png) --- 基本上到這步驟就可以跑看看整體流程是不是有問題了, 接著請按下[開始]鍵看看結果 ![](https://i.imgur.com/VjP0iPW.png) --- # 5. 模擬情境: 多人登入 >這裡主要是延續[4.單一登入]步驟 有了單筆API的測試流程,接下來就進入壓測重點拉 先整理好整批登入者的CSV資料, 再來只要調整 **執行緒數量** 就能決定要壓測的值了! ## 5.1 建立CSV檔 裡面先建立多筆會員帳號/密碼資料,格式大概如下 ```csv= ct0000,aa123456 ct0001,aa123456 ct0002,aa123456 ct0003,aa123456 ct0004,aa123456 ct0005,aa123456 ct0006,aa123456 ct0007,aa123456 ct0008,aa123456 ct0009,aa123456 ct0010,aa123456 ... ``` --- ## 5.2 新增 [CSV Data Set Config] 步驟: 執行緒群組>新增>設定元素>==CSV Data Set Config== ![](https://i.imgur.com/s0DQjxL.png) --- ## 5.3 設定CSV Config | 欄位 | 值 | | -------- | -------- | | 名稱 | CSV資料設定 | | 檔名 | (瀏覽CSV檔) | | File encoding | UTF-8 | | 變數名稱 | Username,Password | **變數名稱**: 上方範例變數名稱為 ==Username== , 當需要使用這個資料時和其它變數方式一樣,使用 ==${Username}== **Sharing Mode(共享模式):** * **All threads**:所有執行緒,所有執行緒迴圈取值,執行緒1取第一行,執行緒2取下一行。 * Current thread group:當前執行緒組,各個執行緒組分別迴圈取值。 * Current thread:當前執行緒,該測試計劃內的所有執行緒都取第一行。 ![](https://i.imgur.com/JB9k5SG.png) --- ## 5.4 設定執行緒組 假設我們要測試10個人同時登入的情況,可以參考以下設置 執行緒數量: 10 啟動延遲(秒): 0 迴圈: 1 ![](https://i.imgur.com/C7VEWUj.png) 之後就可以看壓力測試的需求自行設置拉 看要多人同時戳一段時間,還是多人同時loop一定次數 只用畫面上那些參數都可以的~ 以下為欄位說明: --- ### 取樣錯誤後採取的動作: * 繼續: 繼續執行接下來的操作 * Start Next Loop : 忽略錯誤,執行下一個迴圈 * 停止執行緒 退出該執行緒(不再進行此執行緒的任何操作) * 停止測試 等待當前執行的取樣器結束後,結束整個測試 * Stop Test Now 直接停止整個測試 --- ### 執行緒屬性 * 執行緒數量: 模擬的使用者數量。 * 啟動延遲(秒) 預期載入所有執行緒所需的總時間。 設定0秒,表示瞬間啟動所有Thread的時間無限趨近於0,類似多線併發測試 設定5秒,執行緒數設定50,那麼每秒啟動的執行緒數 = 50/5 = 10 * 迴圈次數 選[永久],則一直迴圈下去 --- ### Same user on each iteration: 每個迭代都用相同的執行緒。 如果測試流程是登入後還有動作,而且是以==cookie==來記憶登入session/token的話, 建議要把這個選項取消掉,不然可能壓測結果會失真。 以下[爬文筆記](https://codingnote.cc/zh-tw/p/256311/) : 這個得從老版本講起,在以前 3.x 和 4.x 版本的 JMeter 中,是沒有這個選項的。創建好 1 個執行緒後,每次迭代都是用這個執行緒,直到測試結束。它的影響就是,比如登錄,加了 HTTP Cookie 管理器以後,單個執行緒多次迭代(注意不是多個執行緒哦)登錄用的都是相同的 Cookie。 5.x 版本加入了這個選項,可以控制每次迭代是否創建新的執行緒。同時在 HTTP Cookie 管理器也增加了一個選項,控制是否清除舊 Cookie: ![](https://i.imgur.com/VLzt3iF.png) 默認這個 [Same user on each iteration]的選項是勾選的。因為銷毀和創建執行緒本身就會佔用資源,可能會影響性能測試結果。 --- ### Delay Thread creation until needed: * 不勾選: (預設)測試開始的時候,所有執行緒就被建立完了。 * 勾選: 執行緒只會在需要用到的時候建立。 --- ### 定時器 控制每個執行緒組運行的持續時間以及它在多少秒後再啟動 * 期間: 執行緒組運行的持續時間(秒) * 啟動延遲時間(秒): 開始後,執行緒組的執行緒將在多少秒後再啟動運行 --- ## 5.5 加入彙整報告 這個應該也是Jmeter最常使用的Listener之一, 不過要注意每次按下[開始]鍵前,最好先按一下右邊的[清除]鍵, 沒先清除的話報告會累積上一次執行的結果 ![](https://i.imgur.com/oBUZWqn.png) 步驟: 執行緒群組(滑鼠右鍵)>新增>接聽>==彙整報告== ![](https://i.imgur.com/bQjzCac.png) 報表欄位說明 ![](https://i.imgur.com/FJeYWEY.png) * Label 每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這裏顯示的就是 Name 屬性的值 * 取樣數 一共發出了多少個請求 * 平均值 平均響應時間,默認情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單位顯示平均響應時間(ms) * 中間值 中位數,也就是 50% 用戶的響應時間(ms) * 90% Line 90%使用者的回應時間(ms) * 95% Line 95%使用者的回應時間(ms) * 99% Line 99%使用者的回應時間(ms) * 最小值 最小回應時間(ms) * 最大值 最大回應時間(ms) * 錯誤率 錯誤率,測試中出現錯誤的請求數量/請求總數 * 處理量 處理量,每秒完成的請求數(Request per Second) * 每千秒位元組 每秒接收到的資料量(KB/Sec) * Sent KB/sec 每秒發送的資料量(KB/Sec)