# 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版參考下圖

# 3. 啟動 JMeter
## 3.1 解壓縮ZIP後,開啟 \bin\jmeter.bat

---
## 3.2 切換成最熟悉的味道 [繁體中文]

---
# 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>==執行緒群組==

## 4.2 新增[HTTP Header]
步驟: 執行緒群組滑鼠右鍵>新增>設定元素>==HTTP 標頭管理員==

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==|

---
## 4.3 新增[API] 取得驗證圖
### 建立HTTP要求
步驟: 執行緒群組>新增>取樣>==HTTP要求==

---
### 設定API內容
| 欄位 | 值 |
| -------- | -------- |
| 名稱 | Api-取得驗證圖 |
| 協定 | http |
| 主機名稱 | www-api.bw168.dev.rd1 |
| HTTP要求 | POST |
| 路徑 | /api/Home/GetPictureCaptcha |

---
### 解析API 回應Json資料
新增[Json Extractor],步驟: Api-取得驗證圖(滑鼠右鍵)>新增>後置處理器>==JSON Extractor==

先觀察API回應的Json如下圖

CaptchaID 參數的Json的路徑為: Data.CaptchaID
透過 [Json Extractor] 把CaptchaID 宣告成動態變數,並設定Json路徑(須加上 ==$.==)
| 欄位 | 值 |
| -------- | -------- |
| Names of Createdvariables | CaptchaID |
| Json Path Expressions | $.Data.CaptchaID |
透過這個設定,其他地方就可以使用 ==${CaptchaID}== 來取得值

## 4.4 新增[API]登入
### 建立 HTTP要求
步驟: 執行緒群組>新增>取樣>==HTTP要求==

---
### 設定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}==

---
## 4.5 新增[檢視結果樹]
這個Listener應該是必用的項目,主要用來觀察每個Request回來的結果。
步驟:執行緒群組(右鍵)>新增>接聽>==檢視結果樹==

---
基本上到這步驟就可以跑看看整體流程是不是有問題了,
接著請按下[開始]鍵看看結果

---
# 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==

---
## 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:當前執行緒,該測試計劃內的所有執行緒都取第一行。

---
## 5.4 設定執行緒組
假設我們要測試10個人同時登入的情況,可以參考以下設置
執行緒數量: 10
啟動延遲(秒): 0
迴圈: 1

之後就可以看壓力測試的需求自行設置拉
看要多人同時戳一段時間,還是多人同時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:

默認這個 [Same user on each iteration]的選項是勾選的。因為銷毀和創建執行緒本身就會佔用資源,可能會影響性能測試結果。
---
### Delay Thread creation until needed:
* 不勾選:
(預設)測試開始的時候,所有執行緒就被建立完了。
* 勾選:
執行緒只會在需要用到的時候建立。
---
### 定時器
控制每個執行緒組運行的持續時間以及它在多少秒後再啟動
* 期間:
執行緒組運行的持續時間(秒)
* 啟動延遲時間(秒):
開始後,執行緒組的執行緒將在多少秒後再啟動運行
---
## 5.5 加入彙整報告
這個應該也是Jmeter最常使用的Listener之一,
不過要注意每次按下[開始]鍵前,最好先按一下右邊的[清除]鍵,
沒先清除的話報告會累積上一次執行的結果

步驟: 執行緒群組(滑鼠右鍵)>新增>接聽>==彙整報告==

報表欄位說明

* 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)