1、JMeter的非GUI模式說明
之前,我們在啟動JMeter時,一直會有一個黑色命令列視窗,視窗中提示瞭如下的資訊:
Jun 05, 2021 10:21:22 AM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use NON GUI Mode:
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 模式僅用於測試建立和測試除錯。
- 對於負載測試,使用非 GUI 模式。
非 GUI 模式啟動方式:jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
- 可以增加Java虛擬機器的堆空間,以滿足您的測試需求。
在JMeter批處理檔案中修改當前環境變數:HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
。
說明:
Java虛擬機器在執行Java程式的過程中,會把它所管理的記憶體劃分為若干個不同的資料區域。主要包括:程式計數器、虛擬機器棧、本地方法棧、Java堆、方法區(執行時的常量池)。
如下圖所示:
而Java Heap記憶體,簡單的說是用來存放
new
出來的物件和陣列。也就是負責執行時資料的存放,由JVM的自動管理。在做負載測試時,Java Heap記憶體空間,調整的大一些,可以避免因Java堆記憶體不足,而終止測試的情況。如報錯:
java.lang.OutOfMemoryError: Java heap space
。
2、為什麼使用非GUI模式執行JMeter
使用GUI方式啟動JMeter,在執行執行緒較多的測試時,會造成記憶體和CPU的大量消耗,導致客戶機卡死。
所以做一般的介面測試、指令碼除錯、壓力測試指令碼編寫等操作時,我們都會選用GUI模式,因為這裡不會涉及到壓力測試,只是除錯指令碼,我們本身關注的也是結果是否通過。而在進行負載測試時,都是使用命令列模式執行指令碼,來減少因系統資源的消耗,對測試結果的影響。
並且命令列方式支援在多個環境下使用,可以在Windows系統的dos環境下,也可以在Linux環境上執行。
命令列模式優點:
- 圖形化介面消耗更多資源,如CPU和記憶體,容易使壓力機達到瓶頸,從而影響測試結果。
- 圖形化介面不支援大型的負載測試和效能測試,併發較大時,JMeter會崩潰。
- 命令列方式可以把指令碼配置到Jenkins上實現持續整合,做成自動化測試。通過shell指令碼或批處理命令均可執行,測試結果可生成報表,可被直接使用生成圖形化報告。
- 支援遠端或分散式執行。
3、使用非GUI模式執行JMeter
(1)非GUI模式執行JMeter步驟
1)確定執行路徑
執行命令前要檢查當前目錄是否是%JMeter_Home%\bin
目錄。
- 如果 JMeter 指令碼不在當前目錄,需要指定完整的路徑。
- 如果要把執行的結果儲存在其他地方,也要指定完整的路徑。
- 命令中不指定測試計劃與測試結果的路徑時,
測試計劃只在當前目錄中查詢,測試結果預設都是在執行JMeter命令所在的目錄下生成。
2)執行命令
例如,上面日誌中提示的命令方式,如下:
jmeter -n -t [testplan jmx file] -l [results file] -e -o [Path to web report folder]
引數解釋:
-n
:表示non gui mode
,就是非圖形化模式。-t
:指定JMX指令碼路徑,即test plan
(測試計劃)。後面跟需要執行的JMeter 指令碼的路徑和指令碼名稱。-l
:指定結果檔案路徑。
後面跟輸出結果檔案路徑和結果檔名稱。
1)若沒有指定指定結果檔案路徑,則自動建立,可以生成.csv
檔案或者.jtl
檔案。
2)若只寫指令碼名稱,則預設是在當前目錄查詢或建立。-e
:設定測試完成後生成測試報表。-o
:指定測試報表生成資料夾,該資料夾必須為空或不存在。
(2)其它引數說明
對於負載測試,您必須在非GUI模式下執行JMeter,以獲得最佳結果。
為此,請使用以下命令選項:
4、CLI模式執行示例
示例一:
測試計劃指令碼在%JMeter_Home%\bin
目錄中,且測試結果也生成在%JMeter_Home%\bin
目錄中。
在CMD中進行到%JMeter_Home%\bin
位置,執行命令如下:
jmeter -n -t CLI_test.jmx -l result.jtl
命令含義:以命令列模式執行當前目錄下的CLI_test.jmx
測試指令碼檔案,並在當前目錄下輸出測試結果檔案result.jtl
。
如下圖所示:
提示:
- 測試指令碼一定要在
bin
目錄中,測試結果檔案可以不建立,沒有則自動建立,不寫路徑就預設建立在bin
目錄中。- 如果已存在測試結果檔案,測試結果會追加到結果檔案中。(檔案不能處於被其他軟體開啟狀態)
- 測試結果檔案和日誌資訊檔案,都是這種方式,下面就不重複介紹了。
示例二:
把測試指令碼檔案在%JMeter_Home%\bin
目錄中,然後把測試結果檔案和測試日誌資訊,輸出到指定的路徑。
在CMD中進行到%JMeter_Home%\bin
位置,執行命令如下:
jmeter -n -t CLI_test.jmx -l C:\Users\L\Desktop\cli\result.jtl -j C:\Users\L\Desktop\cli\test.log
如下圖所示:
示例三:
執行任何位置的JMeter指令碼檔案。
在CMD中進行到%JMeter_Home%\bin
位置,執行命令如下:
jmeter -n -t C:\Users\L\Desktop\JMeterScript\CLI_test.jmx -l C:\Users\L\Desktop\cli\result.jtl
如下圖所示:
示例四:(推薦)
在任何位置,執行任何位置的指令碼。
前提:需要配置JMeter的
bin
目錄到環境變數中。
在任何位置執行如下命令:
jmeter -n -t C:\Users\L\Desktop\JMeterScript\CLI_test.jmx -l C:\Users\L\Desktop\cli\result.jtl
如下圖所示:
配置完成JMeter的環境變數,就可以在任何位置執行JMeter命令,不用每次都到
%JMeter_Home%\bin
位置執行命令了。同理:執行命令所在目錄中的指令碼,同樣可以不寫路徑。
示例五:
預設分散式執行,命令如下:
jmeter -n -t CLI_test.jmx -r -l report\01-result.csv -j report\01-log.log
示例六:
指定IP分散式執行,命令如下:
jmeter -n -t CLI_test.jmx -R 192.168.10.25:1036 -l report\01-result.csv -j report\01-log.log
即:啟動remote_hosts
分散式測試。
注意:如果使用
-R serverIP port
模式,將啟動指定的遠端壓力機,配置檔案中設定的remote_hosts
屬性將被此設定覆蓋,類似指定遠端壓力機執行測試。
示例七:
生成測試結果報表,即:生成 HTML報告,並儲存報告到指定資料夾中。
命令格式:
jmeter -n -t 【Jmx指令碼位置】-l 【結果檔案result.jtl存放的位置】-e -o 【報告指定資料夾】
示例:
jmeter -n -t test1.jmx -l report\01-result.jtl -e -o tableresult
說明:最後三個命令,不進行演示,後面的文章中會詳細說明。