效能工具之 JMeter 快速入門
小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。
一、前言
JMeter 作為瀏覽器與web伺服器之間的代理,可以捕獲瀏覽器的請求和 web 伺服器的響應,通過執行緒來模擬真實使用者對 web 伺服器的訪問壓力。基本原理是建立一個執行緒池,多執行緒執行取樣器產生大量負載,在執行過程中通過斷言來驗證結果的正確性,可以通過監聽來記錄測試結果。
二、下載安裝
下載地址:http://jmeter.apache.org/download_jmeter.cgi
三、目錄介紹
四、快速使用
GUI 啟動點選:
bash
~/bin/jmeter.bat
後臺啟動程序,並且提示通過命令執行方式:
bash
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
GUI 顯示:
五、建立執行緒組
在 TestPlan 位置點選右鍵選擇新建執行緒組如圖:
執行緒組是一系列執行緒的集合,每一個執行緒代表著一個正在使用應用程式的使用者。在 JMeter 中,每個執行緒意味著模擬一個真實使用者向伺服器發起請求。在 JMeter 中,執行緒組元件執行使用者設定執行緒數量、初始化方式等等配置。
成功顯示:
解釋說明:
作用:是一個測試計劃執行的開始點,裡面包含 sampler,controller 等等。 引數:
- Name:執行緒組的名稱,可以隨意修改
- Comments:備註資訊,記錄一些引數設定的原因和策略可填可不填
- Action to be taken after a Sampler error:
執行緒內的取樣器失敗後,接下來採取的動作:
- Continue:繼續執行接下來的操作
Start Next Thread Loop
:執行下一個執行緒迴圈Stop Thread
:退出該執行緒,不在執行該執行緒的任何操作Stop Test
:等待該執行緒的取樣結束後,結束整個測試,不會立即停止Stop Test Now
:立即停止整個測試
Thread Properites:執行緒屬性
-
Number of Threads(users)
:執行緒數,也就是一共要啟動多少執行緒用來併發執行 -
Ramp-uo Period(in seconds)
:多長時間將上一步設定的執行緒數啟動完畢。設定不同的值可以驗證在不同併發的情況下驗證系統的效能 -
Loop Count
:設定 sampler 迴圈的次數,勾上 Forever 後就會死迴圈一直執行 -
Scheduler:排程器,日程表。選上之後才能設定執行時間
-
Number of Threads * Loop Count
就是 Sampler 執行的次數,可以在View Results Tree
中看到。
Scheduler Configuration:
-
Duration(seconnds):請求的執行時間(Loop Count 的 Forever 必須勾上才有效)
-
Startup delay(seconds):延遲時間,一般不用。但是如果想在指定的時間執行測試,可以用此配置。
-
setUp Thread Group、Thread Group 和 tearDown Thread Group3 種執行緒組都可以設定。 Thread Group中的執行規則
-
setUp、Thread Group 和 tearDown 序列執行
六、編寫 http 請求
成功顯示:
解釋:用來向伺服器傳送 HTTP(S) 請求
引數說明:
- Name:元件名,可以修改
- Comment:註釋資訊,可寫可不寫
Web Server:
- Protocol[http]:不寫就是預設的 HTTP,可以根據實際情況指定
- Server Name or IP:IP 或者域名,比如
cn.bing.com
(不要加 http://,預設就帶;不能有路徑)
HTTP Request:
Port Number
:HTTP 預設為 80,https 為 443- Path:/ 表示根目錄
-
Content encoding
:內容編碼,如果請求有亂碼的話可以將其配置為 UTF-8 或者 ANSI -
配置項:預設值即可
- Paramters:配置請求引數,比如新增
key--àvalue
、編碼格式(url encode
)、檔案型別 - Body data:當選擇 body Data 時候並且輸入 Json 請求體後 Parameters 選項不能點選。【parameters and Body Data and Files Upload】不能同時選擇。
- Files upload:上傳檔案,一般不用。
七、新增檢視結果樹
八、點選執行
九、顯示結果
說明:
檢視結果的常用方式
- Text:預設的顯示方式,原始的 HTML 文字
- HTML:以類似瀏覽器的格式檢視響應資料
- RegExp Tester:支援正則用來做檢查點或者關聯使用;(在做關聯的時候可以在這裡做除錯是否寫得是否正確)
- XPath Tester:xpath 方式提取內容;(在做關聯的時候可以在這裡做除錯是否寫得是否正確)
- Scroll automatically:請求很多時可以自動滾屏
顯示資訊:
- Sampler Result:本次請求的彙總資訊
- 請求資訊:分為請求資料和請求頭
- 響應資訊:分為響應資料和響應頭
- Filename:可以將執行結果儲存到 Filename 指定的檔案中,注意:預設儲存在 JMeter 的 bin 目錄下。如果勾選了後面的 Errors,那麼只儲存錯誤資訊;如果勾選了 Success,那麼只儲存執行成功的資訊;都不勾選的話儲存所有的資訊
- Browser:可以開啟之前儲存過的測試檔案,將測試資訊顯示到下面的 result 欄中。如果勾選了後面的 Errors,那麼只顯示錯誤資訊;如果勾選了 Success,那麼只顯示執行成功的資訊;都不勾選的話顯示所有的資訊
Sampler result 結果說明:
十、Summary RePort 展示
顯示結果:
解釋聚合報告標籤的含義:
- Label:每個 JMeter 的 element 都有一個那麼屬性,這個顯示 name 屬性的值
-
sampler:表示在本次測試中一共發出請求數,11 個使用者,迴圈 1 次就是1
- Average:平均響應時間,,預設情況下是單個 request 的平均響應時間,當使用了
transaction controller
時,也可以以transaction 為單位顯示平均響應時間 - Median:中位數,50 %使用者的訪問時間在這個時間以下
- 90% line:90%使用者的訪問時間在這個時間以下
- min:最小響應時間
- max:最大響應時間
- error%:本次測試出現的錯誤數/總的請求數
- Throughput:吞吐量,預設情況下表示每秒完成的請求數(Request per second)
- KB/sec:每秒從伺服器接受到的資料量,相當於 LR 中 Throughput/sec 單位毫秒。
如果想生成 html 報告可以參考,如下命令生成即可:
bash
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder
十一、引數化小試
Jmeter 引數 CSV Data Set Config
用檔案做引數化
選擇配置原件中的 CSV Data Set Config
顯示:
引數說明:
- Filename:檔案路徑。可以是相對路徑也可以是絕對路徑。可以是.txt檔案也可以是.csv檔案
File encoding
:檔案編碼,預設問 ANSI,其它編碼根據實際情況配置Variables Names
(comma-delimited):變數名,表示將每一列賦值給一個變數,有多個列時同逗號分隔,後續通過${}引用Ignore first line
:忽略首行Delimiter(use "\t" for tab)
:分隔符,預設為逗號Allow quoted data?
:資料是否帶引號,預設為false,如果資料中有引號的話就會把資料連同引號一起賦值給變數;如果為Flase的話就會把引號去掉Recycle on EOF?
:遇到檔案結束符是否再次迴圈,預設為True,也就是繼續從檔案開頭取值Stop thread on EOF?
:遇到檔案結束符是否結束執行緒,預設為False也就是不停止。注意:當【Recycle on EOF?】設定為True時,此項設定無效;當【Recycle on EOF?
】設定為False,此項也設定為False,那麼到達檔案最後在引用變數就會變為 < EOF >Sharing mode
:共享模式。預設為all threads
,還支援current thread group
/current thread
/ edit
共享模式小結:
- all treatds:csv
檔案中的資料是共享的,不管是執行緒數還是迴圈次數,都會觸發介面請求引數來使用 csv 檔案中不同行的變數資料
-
current thread group
:線上程組內,執行緒數和迴圈次數都會觸發介面請求引數變化 -
current thread
:迴圈了資料就會變化,執行緒數不能決定更新csv檔案中的資料,迴圈次數才可以
引數檔案使用: 1. 編寫內容
- 獲取結果
3. 顯示結果:
十二、BeanShell
在造資料時候,需要獲取結果到儲存到本地,有兩種方式: - 第一種直接通過獲取結果儲存到本地 - 第二種通過資料庫匯出
今天介紹第一種,通過 JMeter 中正則表示式獲取:
步驟一:
第二步:
第三步:
參考程式碼:
```bash FileOutputStream fps=new FileOutputStream("${outfile_online}",true); OutputStreamWriter osw=new OutputStreamWriter(fps); BufferedWriter bw=new BufferedWriter(osw);
bw.append("${mobile}\t${User}\t${User}\t${fd}\n");
if(bw!=null){bw.close();} if(osw!=null){osw.close();} if(fps!=null){fps.close();} ``` 第四步:
獲取結果:
十三、正則表示式 Regular Expression Extractor
簡單寫法:
正則表示式提取器說明:
Apply to
:應用範圍- 要檢查的響應欄位:樣本資料來源。
- 引用名稱:其他地方引用時的變數名稱,我這裡寫的 phone,可自定義設定,引用方法:
${引用名稱}
- 正則表示式:資料提取器,() 括號裡為你要獲取的的值。"phone":"( 相當於 LR 左邊界,)","name" 相當於 LR 右邊界。而括號裡
\d+
為正則表示式,用來匹配所需要獲取的資料,何謂正則表示式文章末尾會附上說明 - 模板:
$$
對應正則表示式提取器型別。-1 全部,0 隨機,1第一個2第二個,以此類推,若只有一個正則一般就填寫$1$
- 匹配數字:正則表示式匹配資料的所有結果可以看做一個數組,匹配數字即可看做是陣列的第幾個元素。-1 表示全部,0 隨機,1 第一個,2 第二個,以此類推。若只要獲取到匹配的第一個值,則填寫1
- 預設值:匹配失敗時的預設值。可以不寫。若需用於後續邏輯判斷,可簡單寫為 ERROR。
十四、JMeter 常用快捷鍵參考
| 快捷鍵 | 功能 | 備註 | |:--------:|:-------------|:-------------| |Ctrl + C | 複製 | 可複製元件| | Ctrl + V | 貼上 | 可貼上元件| | Ctrl + Shift + C| 複製貼上當前元件到下一行 | | | Ctrl + R| 執行測試計劃 | | |Ctrl + E| 清空執行結果 | | |Ctrl + T| 啟用/禁用當前元件 | 可以多選 | | Ctrl + F| 全文搜尋 | 一般用來搜尋元件, 搜尋完成後可點選Search -> Reset Search恢復 | | Ctrl + -| 全部收起 | “-“為主鍵盤的減號 | |Ctrl + Shift + -| 全部展開 | “-“為主鍵盤的減號| | Ctrl + 0| 建立執行緒組 | | | Ctrl + 1| 新增HTTP請求 | | | Ctrl + 2| 正則表示式提取器 | | | Ctrl + 3| 響應斷言 | | | Ctrl + 4| 固定定時器 | | | Ctrl + 5| Test Action 5.0更改為Flow Control Action | JMeter流量控制動作 | | Ctrl + 6| JSR223 PostProcessor(後處理程式) | | | Ctrl + 7| JSR223 PreProcessor(前處理器)vars.put("key",value):將value存到jmeter變數key中,在後續請求中使用${“key”}進行引用。 | | | Ctrl + 8| Debug Sampler | | | Ctrl + 9| 檢視結果樹 | |
十五、Linux 快速啟動參考
參考程式碼: ```bash
!/bin/bash
jmeter kill and start
echo -e '\033[32m--------Jmeter---------------\033[0m'
echo "kill 掉 jmeter-server 程序................... \n"
kill -9 ps aux | grep jmeter | grep -v grep | awk '{print $2}'
sleep 3
cd /root/tools/apache-jmeter-3.3/bin/
echo "啟動 jmeter-server"
nohup ./jmeter-server &
echo -e '\033[32m------------歡迎使用-----------------\033[0m'
```
- 持續交付之解決Jenkins整合編譯獲取程式碼提交記錄及釘釘通知
- 電商專案 Jmeter 指令碼實戰開發
- 效能監控之 blackbox_exporter Prometheus Grafana 實現網路探測
- 效能監控之初識 Prometheus
- 效能監控之Telegraf InfluxDB Grafana實現結構化日誌實時監控
- 效能監控之 JMX 監控 Docker 容器中的 Java 應用
- 效能監控之常見JDK命令列工具整理
- 效能工具之JMeter InfluxDB Grafana打造壓測視覺化實時監控
- 效能分析之一個簡單 Java 執行緒 dump 分析示例
- SpringCloud 日誌在壓測中的二三事
- 效能分析之如何高效解決 SQL 產生的記憶體溢位
- 效能分析之單條SQL查詢案例分析(mysql)
- 效能分析之JMeter 指令碼執行失敗導致的問題
- 效能工具之Java分析工具BTrace入門
- Filebeat Kafka Logstash Elasticsearch Kibana 構建日誌分析系統
- 混沌工程之 ChaosToolkit K8S 使用之刪除 POD 實驗
- Linux 網路故障模擬工具TC
- 效能工具之 JMeter 快速入門