1、Jmeter本地安裝
1.1、下載安裝
軟件下載地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/
選擇一個壓縮包下載即可
然后解壓縮后進入bin目錄直接執行命令jmeter即可啟動
1.2 修改語言
默認是英文的,修改中文,點擊選項-》選擇語言-》簡體中文
1.3 必備插件安裝
jmeter內置的常用的插件不是很多,如果要額外安裝其他插件需要先下載一個插件安裝工具的jar包然后放到jmeter的目錄下才能使用插件安裝工具的功能。
- 插件安裝工具下載地址
2) 下載jar包之后放到 jmeter的 /lib/ext
目錄下,重啟Jmeter即可。
3 打開插件管理。 選項-》 插件管理器
- 點擊可用插件tab,然后勾選安裝即可
推薦勾選: 帶jpgc相關的插件,可以做梯度增壓
1.4 修改Jmeter的堆內存
由于壓測是通過Jmeter這個Java程序去跑的,所以壓測的性能和能開啟的線程數量都與這個程序本身運行的環境以及配置有關。 一般Jmeter部署在服務器那邊性能會更強。
修改jmeter的 /bin/jmeter
文件 (mac環境),如果是window修改 jmeter.bat
。 修改下圖的這一行就是調整堆內存信息
${HEAP:=“-Xms1g -Xmx8g -XX:MaxMetaspaceSize=656m”}
驗證是否修改成功,重啟使用jconsole工具連接Jmeter進程查看jvm信息即可看到是否修改成功。 或者使用jps命令查看進程號然后再jmap命令查看堆內存分配情況。
2、 Jmeter操作說明
2.1、測試計劃
默認打開的界面如下, 一份測試計劃就是一份jmx文件,點擊保存就會彈出保存地址。 測試計劃就是包含此次做壓測的所有信息。 支持導入導出。
2.2 測試計劃界面介紹
異常信息
- 右上角那個小三角可以看到jemter的執行信息,如果你的壓測執行不了可以去里面看看一般是報錯了
用戶自定義變量
- 可以在這里配置壓測的全局變量,這樣我們在使用的時候就不用傳具體的值,傳變量的值即可。 這樣以后要修改的話只需要修改這里的變量值就可以了就不用到處都修改了。
- 比如我們壓測的接口的域名肯定是都一樣所以一般會提取出來做全局變量。比如下面配置全局變量域名host, 然后使用的時候就直接配
${host}
即可。
2.3、配置元件
默認支持的配置元件列表,主要作用就是配置我們壓測接口的一些參數配置
2.3.1、Http請求默認值
操作
: 右鍵點擊測試計劃-》 添加-》 配置元件-》 Http請求默認值組件
作用
:
- 一般壓測的接口的很多請求參數可能是一致的。 所以這里可以設置壓測接口時的默認請求參數。 這樣就不用每次配壓測接口都去配置,默認會帶上這里配置的請求參數。
比如下圖配置默認的http協議,以及默認的域名。 這里的域名配置就使用我們前面配置的全局變量 ${host}
了
2.3.2、HTTP信息頭管理器
操作
: 右鍵點擊測試計劃-》 添加-》 配置元件-》 HTTP信息頭管理器
作用
:
- 與
Http請求默認值
配置元件類似,都是配置壓測接口的請求默認值。 不過這個元件就像其名字一樣配置的是默認的Http請求頭信息,這樣壓測接口就不用再配置Http請求頭信息默認會帶上 - 比如我們可以配置常用的默認的請求頭
Content-Type
和Cookie
。 尤其是Cookie
請求頭 這樣即使是登錄接口也能進行調通。
2.3.3、CSV Data Set Config
操作
: 右鍵點擊測試計劃-》 添加-》 配置元件-》 CSV Data Set Config
作用
:
- 一般用于模擬生成不同的請求參數。 因為一般我們對一個接口進行壓測真實的場景是請求參數是不同的
具體配置如下:
- 主要是先配置一個csv文件的地址,然后指定列頭變量字段名。 之后再配置壓測接口的時候就可以把使用這些變量字段名。使用格式為:
{變量名稱}
。 比如下面配置使用格式就是{userName}
. - 這樣在請求壓測接口的時候就會來隨機讀取這個csv文件的這個變量對應的列的某一個的值, 一般我們就是通過這個組件去模擬不同的請求參數。
2.4、線程組
線程組就是用來模擬并發的數量以及并發的行為。 比如你是要啟動10個并發還是100個并發去壓測接口就是通過這個組件。并且啟動壓測程序其實就是通過啟動我們的線程組的執行壓測。
自帶帶的線程組如下,其中帶gc的使我們添加插件后才有的。 不同的線程組的區別就是設置的并發行為不同
。
-
比如有些線程組是一股腦配10個并發然后一直執行10分鐘。
-
有些線程組是配置先啟動1個并發,每過5秒后再啟動10個并發,當到達100個并發后就執行10分鐘。
2.4.1、普通線程組
操作
: 右鍵點擊測試計劃-》 添加-》 線程-》 線程組
作用
:
- 下圖就是我們配置一個線程組, 配置了20個并發,然后在5秒內啟動完20個并發,當執行10000伺候就停止壓測。
具體該配置的并發行為可以用下圖來形象的表示。 可以看到一開始是0個并發,然后隨著時間增加不短增加并發,最終在第5秒達到最大并發20,然后就一直20個并發一直執行。
2.4.2、梯度線程組(Stepping Thread Group)
操作
: 右鍵點擊測試計劃-》 添加-》 線程-》 jp@gc - Stepping Thread Group
作用
:
- 與普通線程組的并發行為不同的是,這個線程組可以做到類似于先啟動5個并發,然后隔10秒后再啟動10個并發,當達到100個并發,持續執行30s,然后再每隔5秒降低20個并發這種更為詳細的并發行為。 而普通線程組每次只能保持固定的并發數去跑, 我們只能不斷修改這個固定的并發數去壓測以求找到接口最大的吞吐量。 下圖就形象的表示了這種駝峰式的并發行為
具體配置對應的語義和并發行為如下圖所示:
this goup will start語義
: 表示最多啟動多大線程。對應圖中的峰頂的值first wait for語義:
從運行之后多長時間開始啟動線程;若設置為60秒, 對應圖中開頭的底部橫線。then start語義:
表示第一次要啟動幾個線程。 對應圖中第一個上升線。next add語義 + threads every 語義:
表示每隔多少秒啟動多少個線程。對應圖中的上升梯度線。using ramp-up 語義:
其中與普通線程組一樣表示啟動線程的時間。 對應圖中的上升梯度線的斜度,越大越斜表示用的時間越久。then hold load for語義:
表示達到最大線程后保持最大線程持續執行多久。 對應圖中的峰頂的橫線。finally sotp + threads every語義:
達到峰頂后,表示每隔多少秒釋放多個線程。 對應圖中的下降梯度線。
2.5、取樣器
如果說線程組就是我們Java的線程池,那么取樣器就相當于我們線程池要執行的Runnable任務。比如我們要壓測哪個接口就可以配置成取樣器。
自帶取樣器如下
- 操作: 右鍵線程組-》 添加-》取樣器
- 一般我們用的比較多就是Http請求取樣器,用來壓測接口。
2.5.1、Http請求取樣器
操作
: 右鍵線程組-》 添加-》取樣器-》 Http請求
作用
: 主要就是用來配置Http接口的信息,包括請求域名,端口,接口路徑、接口參數等等。 有了它就可以發起請求。
3、 實戰案例
此處壓測的接口代碼邏輯: 模擬執行時間是500ms
@GetMappingpublic String getA1(){try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}return "33";}
3.1、 壓測接口Hello World
1、在測試計劃下面添加線程組,設置100個并發,持續執行600秒。
2、添加壓測的接口
添加http取樣器,并且配置接口信息
3、添加接口執行結果監聽器
操作
: 右鍵線程組-》添加-》監聽器-》查看結果樹。
這樣我們接口是否調通以及返回結果都可以看到
4、添加壓測接口匯總報告
操作
: 右鍵線程組-》添加-》監聽器-》匯總報告。
這樣看到這個線程組壓測的統計報告,包括吞吐量TPS、響應時間、是否異常,網絡請求量,執行次數。
5、添加吞吐量TPS實時統計圖(可忽略)
操作
: 右鍵線程組-》添加-》監聽器-》jp@gc - Transactions per Second。
這樣就可以監測吞吐量的實時變化情況。
5、添加響應時間實時統計圖(可忽略)
操作
: 右鍵線程組-》添加-》監聽器-》jp@gc - Response Times Over Time
這樣就可以監測接口響應時間的實時變化情況。
5、添加激活線程實時統計圖(可忽略)
操作
: 右鍵線程組-》添加-》監聽器-》jp@gc - Active Threads Over Time
這樣就可以監測線程組的并發行為,因為線程組的組件有很多,如果不是非常熟悉可能都不知道自己配置的線程組正在模擬什么樣的并發行為。
7、啟動線程組執行壓測
操作
: 右鍵線程組-》啟動
原理
: 線程組會去并發執行線程組下面配置的所有取樣器(這里只添加了一個還可添加多個)
最后我們看下各部分壓測結果:
1、首先是接口執行情況:
- 都是綠色表示接口調通,并且右側可看到接口響應結果。
2、看一下壓測匯總報告統計
可以看到樣本數就是總共請求的數量, 平均值就是平均響應時間(單位是毫秒)結果跟我們接口代碼邏輯還是一致的,最小值和最大值也是接口響應時間。 異常率就是接口調不通(吞不下)的概率。 吞吐量就是每秒能處理168個請求。
3、看一下吞吐量變化情況
隨著并發數增加,最終一直維持在180到200的吞吐量之間
3、看下響應時間的變化
基本維持在500ms左右
3.2、 模擬不同的請求參數
1、新建一個CSV文件,里面放我們不同的請求參數,比如內容為
userId,userName
1, zhangShan
2, liSi
3, xaioming
2、新增CSV 數據文件設置組件
將我們剛才新增的csv文件路徑配到這里,然后配置變量名,并且設置忽略首行(因為我們的csv文件內容首行不是請求參數)
3、在Http取樣器里面直接使用變量即可。
請求參數要使用變量地方就用{}
包起來就行。
原理就是請求的時候會去隨機讀取該文件的的這個字段的值從而達到模擬不同請求參數的效果
3.3、 如何請求要登錄驗證的接口
這個看你們的登錄驗證邏輯,假如我們的登錄信息是放在cookies里面,那么我們就可以添加HTTP信息頭管理器,然后在里面配置cookie請求頭信息。只要把我們的登錄cookies放進去就可以執行成功。
缺點就是cookie失效后每次要重新配置,具體還有其他更自動化的解決方法
3.4、 接口如何上傳文件
接口配置那選擇文件上傳, 配置配置具體的配置路徑即可。會去讀取上傳。 然后參數名稱寫死file就行。 然后MIME根據具體來。 一般是application/octet-stream 或者 multipart/form-data即可。
如果要模擬上傳不同的文件,同上面模擬不同請求參數一樣,這里用變量填充代表文件路徑即可。
3.5、 如何在服務端執行Jmeter壓測(重要)
之前我們是通過本地Jmeter的GUI界面去進行壓測的。但是官方不建議壓測通過GUI模式去跑,而是使用CLI命令行的模式去跑壓測。 所以我們得先準備測試計劃文件.jmx
, 然后使用jmeter的命令去跑測試計劃。最終會將測試計劃的結果報告保存到指定的文件。
具體命令:
jmeter -n -t [xxx.jmx] -l [results file] -e -o [Path to web report folder]
- -n:非GUI模式,即在非客戶端模式下運行JMeter
- -t:指定待執行的JMeter腳本
- xxx.jmx是要被執行的JMeter測試計劃腳本即在JMeter客戶端保存的腳本
- -l: 指定相關結果到指定的文件中
- results file就是壓測結果保存的文件名,默認存放在命令行當前目錄下
- Path to web report folder 就是報告目錄路徑
其實細心的可能會發現我們啟動jmeter的日志輸出默認就是告訴我們應該這樣做
具體的官方文檔: https://jmeter.apache.org/usermanual/best-practices.html
以下是我的執行命令案例:
jmeter -n -t 1.1版本xx測試計劃.jmx -l result.txt -e -o report
(base) ? tmp6 ll
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx測試計劃.jmx
(base) ? tmp6 jmeter -n -t 1.1版本xx測試計劃.jmx -l result.txt -e -o report
Creating summariser <summary>
Created the tree successfully using 1.1版本xx測試計劃.jmx
Starting standalone test @ November 23, 2023 2:21:03 PM CST (1700720463057)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 1 in 00:00:01 = 1.6/s Avg: 556 Min: 556 Max: 556 Err: 0 (0.00%) Active: 13 Started: 13 Finished: 0
summary + 299 in 00:00:06 = 50.9/s Avg: 509 Min: 504 Max: 556 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 300 in 00:00:07 = 46.0/s Avg: 510 Min: 504 Max: 556 Err: 0 (0.00%)
Tidying up ... @ November 23, 2023 2:21:09 PM CST (1700720469740)
... end of run
(base) ? tmp6 ll
total 216
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx測試計劃.jmx
-rw-r--r-- 1 burukeyou staff 44K 11 23 14:21 jmeter.log
drwxr-xr-x 6 burukeyou staff 192B 11 23 14:21 report
-rw-r--r-- 1 burukeyou staff 41K 11 23 14:21 result.txt
可以發現跑完壓測報告后最終在生成了result.txt文件和report目錄,進入report目錄找到index.html瀏覽器打開即可看到報告如下
jmeter -n -t [xxx.jmx] -l [results file]
執行壓測也可不指定 Path to web report folder參數
。 只生成 results file. 然后通過 jmeter -g result.txt -o output
命令使用結果文件去生成Html報告。
比如:
(base) ? tmp6 ll
total 136
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx測試計劃.jmx
-rw-r--r-- 1 burukeyou staff 5.3K 11 23 14:26 jmeter.log
-rw-r--r--@ 1 burukeyou staff 41K 11 23 14:21 result.txt
(base) ? tmp6 jmeter -g result.txt -o output
(base) ? tmp6 ll
total 152
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx測試計劃.jmx
-rw-r--r-- 1 burukeyou staff 14K 11 23 14:29 jmeter.log
drwxr-xr-x 6 burukeyou staff 192B 11 23 14:29 output
-rw-r--r--@ 1 burukeyou staff 41K 11 23 14:21 result.txt
如果看壓測的每個請求結果響應類似GUI界面那樣,可以在jmeter的GUI界面的查看結果樹組件的瀏覽那里導入結果文件即可。