1. 程式人生 > >圖文詳解壓力測試工具JMeter的安裝與使用

圖文詳解壓力測試工具JMeter的安裝與使用

壓力測試是目前大型網站系統的設計和開發中不可或缺的環節,通常會和容量預估等工作結合在一起,穿插在系統開發的不同方案。壓力測試可以幫助我們及時發現系統的效能短板和瓶頸問題,在這個基礎在上再進行鍼對性的效能優化,也可以幫助我們預估系統的承載能力,使我們能根據其做出一些應對措施。 ### JMeter簡介 ![](https://img-blog.csdnimg.cn/20200719074647626.png#pic_center) JMeter是一個使用Java開發的Apache開源軟體,用於軟體的效能評估和壓力測試。它最初是為測試Web應用程式而設計的,但此後又擴充套件到其他測試功能。 JMeter可用於靜態和動態資源、Web動態應用程式的效能測試,例如:HTTP、 HTTPS、LDAP、TCP、FTP、SMTP、POP3、IMAP、Shell指令碼、資料庫、Java 物件,也可以用於對伺服器、伺服器組、網路或物件上的巨大負載,以測試在不同強度的壓力測試下它們的強度和整體效能。 另外,JMeter還可以對應用程式做功能迴歸測試,通過建立帶有斷言的指令碼來驗證你的程式是否返回了你期望的結果。為了最大限度的靈活性,JMeter還支援使用正則表示式建立斷言。 ### 下載JMeter 訪問JMeter的官網:[https://jmeter.apache.org/download_jmeter.cgi](https://jmeter.apache.org/download_jmeter.cgi),下載最新版本的JMeter,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDU5MzI0LTE2NDc5NDM5NTkucG5n?x-oss-process=image/format,png) 文章持續更新,微信搜尋「萬貓學社第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。 ### 執行JMeter 在執行JMeter之前,需要安裝JDK8,詳細安裝步驟見[圖文詳解在Windows系統中安裝JDK](https://blog.csdn.net/heihaozi/article/details/107298161)。 解壓壓縮包以後,進入bin目錄,雙擊執行`jmeter.bat`,首先啟動一個CMD視窗,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTA4NjM4LTY4Mzg4MTAwMi5wbmc?x-oss-process=image/format,png) 然後又啟動了JMeter的GUI,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDM4NTk3LTE4Nzk3NzI3MzYucG5n?x-oss-process=image/format,png) 其中,注意CMD視窗中的提示: ``` ================================================================================ Don't use GUI mode for load testing !, only for Test creation and Test debugging. For load testing, use CLI Mode (was NON GUI): jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder] & increase Java Heap to meet your test requirements: Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file Check : https://jmeter.apache.org/usermanual/best-practices.html ================================================================================ ``` 英文看著不是順暢,作為一個資深暖男給大家翻譯一下: 不要使用GUI執行壓力測試!GUI僅用於壓力測試的建立和除錯。執行壓力測試使用CLI模式,就是非GUI。使用下面的命令來執行測試: ``` jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder] ``` 並且在批處理檔案中修改當前環境變數: ``` HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" ``` JMeter預設是英文的,也可以修改為簡體中文,通過點選**Options**->
**Choose Language**進行修改,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDUxMjA0LTM2ODE3NjA3NC5wbmc?x-oss-process=image/format,png) ### 建立第一個壓力測試 為了演示寫了一個網站,URL為http://127.0.0.1:8080/hello,當QPS大於100時HTTP狀態碼返回429(使用 Alibaba Sentinel實現 )。 #### 1.新增執行緒組 右鍵**測試計劃**,點選**新增**-->
**執行緒(使用者)**-->**執行緒組**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTE4NTQ2LTg0MjYwNzczNS5wbmc?x-oss-process=image/format,png) 設定**執行緒數**為10,**Ramp-Up時間(秒)**為10,**迴圈次數**為100,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTEzNjA3LTEzODMwODI4OTIucG5n?x-oss-process=image/format,png) **執行緒數**:一個使用者佔一個執行緒, 10個執行緒就是模擬10個使用者。 **Ramp-Up時間(秒)**: 設定執行緒需要多長時間全部啟動。如果執行緒數為10 ,準備時長為10 ,那麼需要1秒鐘啟動1個執行緒。也就是每秒鐘啟動1個執行緒。 **迴圈次數**:每個執行緒傳送請求的次數。如果執行緒數為10 ,迴圈次數為100 ,那麼每個執行緒傳送100次請求。總請求數為10*100=1000 。如果勾選了“永遠”,那麼所有執行緒會一直髮送請求,直到選擇停止執行指令碼。 #### 2.新增元件 右鍵**執行緒組**,點選**新增**-->
**配置元件**-->**HTTP請求預設值**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDU2MzIzLTEzMzEyMDU5MDQucG5n?x-oss-process=image/format,png) 設定**協議**為HTTP,**伺服器名稱或IP**為127.0.0.1,**埠號**為8080,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTE1MTM3LTM3Nzc0ODQzOC5wbmc?x-oss-process=image/format,png) 當所有測試的訪問域名和埠都一樣時,可以使用該元件,一旦伺服器地址或埠變更,只需要修改該HTTP請求預設值即可。 文章持續更新,微信搜尋「萬貓學社第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。 #### 3.新增取樣器 右鍵**執行緒組**,點選**新增**-->**取樣器**-->**HTTP請求**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDU3OTMwLTEwNzM3MjA2MDcucG5n?x-oss-process=image/format,png) 設定**請求型別**為GET,**路徑**為/hello,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQ2NDE2LTE2NTUxOTEwNzkucG5n?x-oss-process=image/format,png) #### 4.新增響應斷言 右鍵**執行緒組**,點選**新增**-->**斷言**-->**響應斷言**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDUyNjgzLTY3MzEwMDI0Ni5wbmc?x-oss-process=image/format,png) 設定**測試欄位**為響應程式碼,**模式匹配規則**為相等,**測試模式**新增200,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQ4MTA0LTIwMTAyNDMwNDUucG5n?x-oss-process=image/format,png) #### 5.新增察看結果樹 右鍵**執行緒組**,點選**新增**-->**監聽器**-->**察看結果樹**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTA1NjgzLTExMjc4NTk0MDcucG5n?x-oss-process=image/format,png) #### 6.新增彙總報告 右鍵**執行緒組**,點選**新增**-->**監聽器**-->**彙總報告**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQxNjkyLTEzMTEzODcyOTkucG5n?x-oss-process=image/format,png) #### 7.啟動壓力測試 先點選**儲存**按鈕,把測試計劃儲存起來。然後點選**啟動**按鈕,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTIxNjQzLTEyNDUwNzEwNTgucG5n?x-oss-process=image/format,png) 測試計劃就跑起來了。 文章持續更新,微信搜尋「萬貓學社第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。 #### 8.檢視報告 察看結果樹,請求成功的,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTE2OTU4LTE2MDQ3NjQ5MzkucG5n?x-oss-process=image/format,png) 察看結果樹,請求失敗的(QPS過高,被Alibaba Sentinel限流),如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTIzMTY4LTg3MzY1MTYxLnBuZw?x-oss-process=image/format,png) 再看一下彙總報告,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTA3MjA0LTEyOTQ0ODc2MzkucG5n?x-oss-process=image/format,png) #### 9.執行測試計劃 前面提到執行測試計劃不能使用GUI,必須使用CLI模式,執行以下命令: ``` jmeter -n -t ../plan/萬貓學社.jmx -l ../plan/result.txt -e -o ../plan/webreport ``` 其中,**../plan/萬貓學社.jmx**為測試計劃檔案,**../plan/result.txt**為測試結果檔案,**../plan/webreport**為web報告目錄。 執行過程如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQzMjkwLTM4NzkyNTkwNy5wbmc?x-oss-process=image/format,png) 最後生成的網頁報告如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTA0MTc1LTEyOTE4OTU2MDcucG5n?x-oss-process=image/format,png) ### 使用CSV引數化 為了演示對之前的網站進行增強,URL為**http://127.0.0.1:8080/hello/{name}**,其中**{name}**是一個引數,所以URL可以是**http://127.0.0.1:8080/hello/Lucy**,也可以是**http://127.0.0.1:8080/hello/Lily**,同樣當QPS大於100時HTTP狀態碼返回429(也是使用 Alibaba Sentinel實現 )。 #### 1.建立CSV檔案 建立一個文字檔案,內容為: ``` 1,Alice 2,Eva 3,Jane 4,Lily 5,Lucy ``` 分別為5行,每行分別是id和名稱,用英文逗號分隔。然後,對之前的測試計劃進行修改。 文章持續更新,微信搜尋「萬貓學社第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。 #### 2.建立CSV Data Set Config 右鍵**執行緒組**,點選**新增**–>**配置元件**–>**CSV Data Set Config**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTExOTc3LTEzNzY0NDkyNC5wbmc?x-oss-process=image/format,png) **檔名稱**填入剛剛建立的檔案,**檔案編碼**選擇UTF-8,**變數名稱**輸入`id,name`,分別表示與文字檔案中每一行的`id`和`name`兩個變數,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQ5Njc5LTE0NDE5NDc2NDIucG5n?x-oss-process=image/format,png) #### 3.修改HTTP請求 修改之前的HTTP請求中的**路徑**為`/hello/${name}`,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDU0MjMwLTM3ODExOTc0NS5wbmc?x-oss-process=image/format,png) #### 4.檢視報告 啟動測試計劃,可以在**察看結果樹**中看到URL的路徑已經被替換了,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQ0ODMxLTEyOTE0MjczMTYucG5n?x-oss-process=image/format,png) 文章持續更新,微信搜尋「萬貓學社第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。 ### 使用HTTP請求引數化 為了演示對之前的網站新增一個介面,URL為**http://127.0.0.1:8080/getName**,該介面會隨機返回上述文字檔案中某個名字,返回格式為JSON,例如: ``` {"id":1, "name":"Alice"} ``` 對之前的測試計劃再進行修改: #### 1.新增HTTP請求 右鍵**執行緒組**,點選**新增**–>**取樣器**–>**HTTP請求**,新增一個新的HTTP請求,**名稱**設定為`HTTP請求-getName`,**路徑**設定為`/getName`。為了區分把之前新增的HTTP請求的**名稱**修改為`HTTP請求-hello`,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTEwMzQwLTEyNDMxMzU5OS5wbmc?x-oss-process=image/format,png) #### 2.新增JSON提取器 右鍵**HTTP請求-getName**,點選**新增**–>**後置處理器**–>**JSON提取器**,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTAyMzU1LTEyNTQwNzg0MzcucG5n?x-oss-process=image/format,png) - Names of created variables是建立變數的名字,要和**HTTP請求-hello**的路徑`/hello/${name}`保持一致,所以設定為`name`。 - JSON Path expressions是需要提取的key,參照getName介面返回的JSON字串,設定為`$.name`。 - Match No.是在JSON中同樣的key取第幾個,這裡設定為1。 - Default Values是沒有找到key時的預設值,這裡設定為OneMore。 最終配置如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNDQwMTM3LTExNzg3NDYwMDgucG5n?x-oss-process=image/format,png) #### 4.檢視報告 啟動測試計劃,可以在察看結果樹中看到一次getName返回的name是Lily,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTAwODQ0LTQ1NzUxOTg3NC5wbmc?x-oss-process=image/format,png) 接下來,呼叫hello介面時傳入的引數就為Lily,所以返回的就是`Hello, Lily`,如下圖: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL290aGVyLzE0NTY4Ny8yMDIwMDcvMTQ1Njg3LTIwMjAwNzE4MTYwNTIwMTY1LTI2NTY2MzA1OC5wbmc?x-oss-process=image/format,png) ### 總結 JMeter的功能很強大,還有很多值得大家繼續挖掘的。不過,你如果掌握了本文所講述的功能,基本上可以應付一般的Web壓測了。

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍