# [測試] Jmeter 使用筆記
## 什麼是壓力測試
網站的測試有分幾種,下面參考連結講得很清楚:
[淺談測試基本觀念 – 壓力測試、負載測試、效能測試](https://www.astralweb.com.tw/introduction-of-stress-testing-load-testing-and-performance-testing/)
## 什麼是 JMeter
官方手冊:[User's Manual](https://jmeter.apache.org/usermanual/index.html)
## 環境設定
因為是跑在 JVM 上,任何作業系統安裝 Java 後皆可支援。
### 安裝 Java
安裝網址:[Java SE Downloads](https://www.oracle.com/java/technologies/javase-downloads.html)
1. 根據自己的作業系統,選擇下載 **Java 8** 以上的版本
2. 安裝完後,根據不同平台設定環境
3. 檢查是否安裝成功:打開 terminal:輸入 `java`、`javac`,都有看到一大串東西就可以了
### 下載 JMeter
下載網址:[Download Apache JMeter](https://jmeter.apache.org/download_jmeter.cgi)
1. Downlaod apache-jmeter-*version*.zip
2. 下載完後解壓縮,即可執行
3. 點開資料夾下的 bin,可開啟介面:
- Windows 開啟 jmeter.bat
- Linux / Unix / MacOS 開啟 jmeter.sh
### 安裝 JMeter Plugin (optional)
安裝網址:[Installing Plugins](https://jmeter-plugins.org/install/Install/)
1. Download plugins-manager.jar
2. Put it into lib/ext directory
3. Restart JMeter
4. 重新啟動後,在 Options 下方會出現 Plugins Manager,表示安裝成功。
*(有用到特別的功能,標配裡面沒提供才需要安裝。)*
### 修改 Java 參數
JMeter 預設只能存取 1GB 的記憶體,可以手動修改參數,調整成電腦記憶體的 80 %,能讓 JMeter 有資源開啟更多 Thread,模擬更多的測試人數。
參考:[JMeter – How to increase heap size?](https://www.perfmatrix.com/jmeter-how-to-increase-heap-size/)
## 基本功能說明
> 每個分類參考:[Elements of a Test Plan](https://jmeter.apache.org/usermanual/test_plan.html)
> 每個分類下的項目參考:[18. Component Reference](https://jmeter.apache.org/usermanual/component_reference.html)
### Thread Group
位置:Threads (Users) -> Thread Group
- Number of Threads (users):表示模擬使用者的數量
- Ramp-up period (seconds):在指定秒數內達到指定人數
- 設定完 Thread Group 後,Group 之下的設定就是在針對每個人模擬操作。
- 參考:[Jmeter系列(7)- 基礎執行緒組Thread Group](https://www.gushiciku.cn/pl/pLQ0/zh-tw)
### HTTP Request
位置:Sampler -> HTTP Request
- 最基礎的設定 API 的樣板
- 一個 API 就用一個 HTTP Request,可以設定路徑、傳入的參數
### Logic Controller
- 控制腳本怎麼執行、管理參數存取範圍
- 參考:[【JMeter】各種邏輯控制器(Logic Controller)](https://www.twblogs.net/a/5c3f6afbbd9eee35b21e348f)
### Config Element
#### HTTP Request Defaults
設定 HTTP Requests 的默認值,可涵蓋範圍內的 HTTP Request 不輸入值就會抓預設值。舉例:都是呼叫同一台伺服器的 API,IP、Protocol 皆相同,只有 Path 不同。
#### User Defined Variables
可設置指定範圍或全域變數,使用 `${variable-name}` 存取。
### Listener
用來產生可視化結果。
#### View Results Tree
可以查看每次呼叫的 request 和 response 的內容。
#### Summary Report
統計每個 API 呼叫的次數、平均回應時間、錯誤率等資料。
#### View Results in Table
可以查看每次 request 的狀態、資料量等資訊。
## 腳本設計
要設計測試腳本,可以評估現在是什麼樣的系統要測試什麼,再來設定:
- 指定時間內
- 有多少人
- 要完成多少事
一般系統要測試負載量,不會設定極短的時間要求很多人做很多事,舉例幾千幾萬人在同一秒點開網站操作一個很複雜的流程(除非是搶購系統),除了對測試環境負荷量太大可能失敗以外,要同一時間大家發出 request 不是合理的情境。所以上述幾點會根據測試的內容,增加或減少,來達到預期的效果。
- 壓力測試:模擬短時間人潮集中在特定功能上,要做的事就會設比較少。
- 負載測試:模擬大量人潮湧入的時候,時間會設定比較寬裕,要做的事可以比較多。
- 效能測試:可以參考負載測試的報告。
### 情境設定
### 錄製腳本
可以應用在有介面的前端測試上,用錄製的方式快速產出腳本。
參考:[26. Apache JMeter HTTP(S) Test Script Recorder](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html)
## 測試方式
### GUI
設定腳本(產出 jmx 檔)的時候,或進行小量的測試,都可以用 GUI 做設定。但實際測試的時候建議使用 Non-GUI 模式,較不占用記憶體資源。
參考:[JMeter實戰(三) 介面使用](https://iter01.com/549766.html)
### Non-GUI
要實際跑大量測試的時候,先在 GUI 上修改 Thread Group 的參數,用 terminal 執行:
```shell=
# 執行測試腳本,並將結果輸出成網頁報告
jmeter -n -t [jmx-file] -l [results-file] -e -o [report-folder]
```
參考:[JMeter Command line mode and report dashboard 指令操作模式與報表儀表板](http://dog0416.blogspot.com/2017/06/stress-test-jmeter-command-line-mode.html)
## 其他
### 執行範例檔
手邊有 .jmx 的檔案,或是用範例(/printable_docs/demos/)讀取操作:
1. Choose File -> open -> *filename*.jmx
2. 開啟後請檢查 Thread Group 下 Number of Threads 不超過 10。
3. 可以點上方綠色 `Start` 執行
4. 有結果會出現在報告中
## References
- [網站測試工具-JMeter教學](https://www.astralweb.com.tw/website-test-tool-jmeter-teaching/)
- [JMeter 入門](https://openhome.cc/Gossip/JUnit/JMeter.html)
###### tags: `jmeter` `壓力測試` `負載測試` `效能測試` `stressTesting` `loadTesting`