『動善時』JMeter基礎 — 55、使用非GUI模式運行JMeter(命令行模式)

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 : //jmeter.apache.org/usermanual/best-practices.html
================================================================================

資訊中提示

  1. 不要使用 GUI 模式進行負載測試! GUI 模式僅用於測試創建和測試調試。
  2. 對於負載測試,使用非 GUI 模式。
    非 GUI 模式啟動方式:jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
  3. 可以增加Java虛擬機的堆空間,以滿足您的測試需求。
    在JMeter批處理文件中修改當前環境變數:HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"

說明

Java虛擬機在執行Java程式的過程中,會把它所管理的記憶體劃分為若干個不同的數據區域。主要包括:程式計數器、虛擬機棧、本地方法棧、Java堆、方法區(運行時的常量池)。

如下圖所示:

image

而Java Heap記憶體,簡單的說是用來存放new出來的對象和數組。也就是負責運行時數據的存放,由JVM的自動管理。

在做負載測試時,Java Heap記憶體空間,調整的大一些,可以避免因Java堆記憶體不足,而終止測試的情況。如報錯:java.lang.OutOfMemoryError: Java heap space

2、為什麼使用非GUI模式運行JMeter

使用GUI方式啟動JMeter,在運行執行緒較多的測試時,會造成記憶體和CPU的大量消耗,導致客戶機卡死。

所以做一般的介面測試、腳本調試、壓力測試腳本編寫等操作時,我們都會選用GUI模式,因為這裡不會涉及到壓力測試,只是調試腳本,我們本身關注的也是結果是否通過。而在進行負載測試時,都是使用命令行模式執行腳本,來減少因系統資源的消耗,對測試結果的影響。

並且命令行方式支援在多個環境下使用,可以在Windows系統的dos環境下,也可以在Linux環境上執行。

命令行模式優點:

  1. 圖形化介面消耗更多資源,如CPU和記憶體,容易使壓力機達到瓶頸,從而影響測試結果。
  2. 圖形化介面不支援大型的負載測試和性能測試,並發較大時,JMeter會崩潰。
  3. 命令行方式可以把腳本配置到Jenkins上實現持續集成,做成自動化測試。通過shell腳本或批處理命令均可執行,測試結果可生成報表,可被直接使用生成圖形化報告。
  4. 支援遠程或分散式執行。

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,以獲得最佳結果。

為此,請使用以下命令選項:

image

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

如下圖所示:

image

提示:

  • 測試腳本一定要在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

如下圖所示:

image

示例三

執行任何位置的JMeter腳本文件。

在CMD中進行到%JMeter_Home%\bin位置,執行命令如下:

jmeter -n -t C:\Users\L\Desktop\JMeterScript\CLI_test.jmx -l C:\Users\L\Desktop\cli\result.jtl

如下圖所示:

image

示例四:(推薦)

在任何位置,執行任何位置的腳本。

前提:需要配置JMeter的bin目錄到環境變數中。

在任何位置執行如下命令:

jmeter -n -t C:\Users\L\Desktop\JMeterScript\CLI_test.jmx -l C:\Users\L\Desktop\cli\result.jtl

如下圖所示:

image

配置完成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

說明:最後三個命令,不進行演示,後面的文章中會詳細說明。