大話JMeter4|不一樣的併發數能夠自動化作壓測嗎?


​上節課愛畫漫畫的小哥哥用漫畫形式向你們展現了JMeter的進階用法:如何搭建InfluxDB,使用更炫酷的Grafana。
java


看到不少小夥伴以爲看的不過癮,在強烈的催促下,小哥哥的新文章又出來了。此次小哥哥又給咱們帶來怎樣的驚喜呢?接着看下去吧!linux


不一樣併發如何作壓測?git



若是手動逐步加壓,不只須要人肉改併發數,還須要花大量時間等待完成,能夠用一個字歸納:煩!因此,制定好策略,讓程序自動加壓,自動等待;完成後看壓測監控記錄,或者坐收報告是最完美的解決方案。

無UI執行JMetergithub




jmeter -n -t <testplan filename> -l <listener filename>
複製代碼

示例:
jmeter -n -t testplan.jmx -l test.jtl

示例含義:
則表示以命令行模式運行testplan.jmx文件,輸出的日誌文件爲test.jtl


具體的參數信息以下:
-h 幫助 -> 打印出有用的信息並退出


-n 非 GUI 模式 -> 在非 GUI 模式下運行 JMeter


-t 測試文件 -> 要運行的 JMeter 測試腳本文件


-l 日誌文件 -> 記錄結果的文件


-r 遠程執行 -> 在Jmter.properties文件中指定的全部遠程服務器


-H 代理主機 -> 設置 JMeter 使用的代理主機


-P 代理端口 -> 設置 JMeter 使用的代理主機的端口號


咱們設置並錄製好腳本,此時能夠選擇保存。而後咱們就獲得了一份jmx文件,因而,就能夠用上面的命令加載這個文件實現無UI運行啦!










在shell命令中,咱們使用nohup來運行jmeter:

nohup jmeter -n -t ${jmx_filename} -l ${jtl_filename} &複製代碼

- nohup是no hang up 的縮寫,就是不掛斷的意思。
若是你正在運行一個進程,並且你以爲在退出賬戶時該進程還不會結束,那麼可使用nohup命令。該命令能夠在你退出賬戶/關閉終端以後繼續運行相應的進程。在缺省狀況下該做業的全部輸出都被重定向到一個名爲nohup.out的文件中。


- & 指在後臺運行
注意了nohup沒有後臺運行的意思;&纔是後臺運行,那麼,咱們能夠巧妙的把他們結合起來用就是nohup COMMAND &,這樣就能使命令永久的在後臺執行。







是的,小兔說的沒錯,就像下面的圖片同樣,咱們在jmeter的UI界面中配置的參數信息全在jmx文件中,好比並發數爲:11












用項目實戰來演示shell



要解釋一段代碼着實不容易,這裏請容許用文字來表述。下面是shell代碼,將會挑重點來解釋,若是對語法生疏,能夠自行網上搜索。


github項目地址:
https://github.com/princeqjzh/iJmeter/blob/master/automation/auto_stress_test.sh


運行代碼前須要將jmeter目錄設置爲環境變量,shell才能夠知道所運行的jmeter在哪一個位置。

export jmx_template="PreClassMenu_auto"
export suffix=".jmx"
export jmx_template_filename="${jmx_template}${suffix}"
export os_type=`uname`
複製代碼

首先,用export定義幾個變量,這些變量後面會用到,其中jmx_template_filename變量存放的是jmx的臨時名子,實際工做中要設置多個併發數,好比10,20,30,40,每個併發數都要有一個文件與之對應,稱之爲臨時文件,這四個jmx文件的併發數分別爲:10,20,30,40。



咱們接着往下看:
#!/usr/bin/env bash
export jmx_template="PreClassMenu_auto"
export suffix=".jmx"
export jmx_template_filename="${jmx_template}${suffix}"
export os_type=`uname`

# 須要在系統變量中定義jmeter根目錄的位置,以下
# export jmeter_path="/your jmeter path/"

# 清空nohup.out
cat /dev/null > nohup.out

# 強制殺掉JMeter進程
killJMeter()
{
    pid=`ps -ef|grep jmeter|grep java|awk '{print $2}'`
    echo "jmeter Id list :$pid"
    if [[ "$pid" = "" ]]
    then
      echo "no jmeter pid alive"
    else
      kill -9 $pid
    fi
}
複製代碼

遇到了cat命令和killJMeter函數,後面再來說這兩部分,繼續往下看。

#!/usr/bin/env bash
export jmx_template="PreClassMenu_auto"
export suffix=".jmx"
export jmx_template_filename="${jmx_template}${suffix}"
export os_type=`uname`

# 須要在系統變量中定義jmeter根目錄的位置,以下
# export jmeter_path="/your jmeter path/"

# 清空nohup.out
cat /dev/null > nohup.out

# 強制殺掉JMeter進程
killJMeter()
{
    pid=`ps -ef|grep jmeter|grep java|awk '{print $2}'`
    echo "jmeter Id list :$pid"
    if [[ "$pid" = "" ]]
    then
      echo "no jmeter pid alive"
    else
      kill -9 $pid
    fi
}

thread_number_array=(10 20 30 40 50)
複製代碼

這裏定義了一個數組thread_number_array,這個數組你們猜一猜是什麼意思。是併發數,代碼指望有五個併發數,分別爲:10,20,30,40,50。下一步相當重要,請集中注意!

#!/usr/bin/env bash
export jmx_template="PreClassMenu_auto"
export suffix=".jmx"
export jmx_template_filename="${jmx_template}${suffix}"
export os_type=`uname`

# 須要在系統變量中定義jmeter根目錄的位置,以下
# export jmeter_path="/your jmeter path/"

# 清空nohup.out
cat /dev/null > nohup.out

# 強制殺掉JMeter進程
killJMeter()
{
    pid=`ps -ef|grep jmeter|grep java|awk '{print $2}'`
    echo "jmeter Id list :$pid"
    if [[ "$pid" = "" ]]
    then
      echo "no jmeter pid alive"
    else
      kill -9 $pid
    fi
}

thread_number_array=(10 20 30 40 50)
for num in "${thread_number_array[@]}"
do
    # 生成對應壓測線程的jmx文件
    export jmx_filename="${jmx_template}_${num}${suffix}"
    export jtl_filename="test_${num}.jtl"

    rm -f ${jmx_filename} ${jtl_filename}
    cp ${jmx_template_filename} ${jmx_filename}
    echo "生成jmx壓測腳本 ${jmx_filename}"

    if [[ "${os_type}" == "Darwin" ]]; then
        sed -i "" "s/thread_num/${num}/g" ${jmx_filename}
    else
        sed -i "s/thread_num/${num}/g" ${jmx_filename}
    fi

    # JMeter 靜默壓測
nohup ${jmeter_path}/bin/jmeter -n -t ${jmx_filename} -l          ${jtl_filename} &sleep 65
    killJMeter
    rm -f ${jmx_filename}
done
echo "自動化壓測所有結束"
複製代碼


這就是所有代碼,你能夠參考下面的解釋:數組

- for:咱們對thread_number_array數組依次遍歷,do和done之間的內容就是每次遍歷要執行的操做。


- jmx_filename和jtl_filename:這是兩個變量,jmx_filename就是臨時jmx文件的名子,${}表明變量,好比${jmx_template}指咱們要用jmx_template這個變量,變量名相似PreClassMenu_auto_10.jmx,PreClassMenu_auto_20.jmx,PreClassMenu_auto_30.jmx等等。


- fm -f:用於清除閒雜文件,若是有當前目錄文件與jmx_filename和jtl_filename重名,就刪除它。


- cp:是複製命令,將模板中的內容複製到臨時文件中,也能夠理解爲利用模板創建臨時文件。


- if:用來判斷是否是mac電腦,mac電腦上輸入uname就能顯示Darwin,若是不顯示則爲linux,之因此要判斷,是由於後面的sed命令在mac與linux上稍微有點不一樣。

- sed:這是咱們的重頭戲,用來正則替換,咱們用變量num來替換臨時文件中的thread_num,它是什麼?請看下面的截圖:



哇!把併發數用thread_num替換了,之因此這麼作是爲了讓正則更方便的找到它,試想一下,若是我使用數字1或者數字11,正則會很難定位到它。用正則將num替換上去,也就實現了用命令修改臨時文件的併發數,多麼偉大的操做!

- nohup:這個命令前面介紹過,就很少說了,它無UI運行jmeter,在缺省狀況下該做業的全部輸出都被重定向到一個名爲nohup.out的文件中,代碼最開始的cat是爲了清空nohup.out文件。換句話說,每次運行shell腳本,都會清空nohup.out記錄文件,至關於清空日誌。


- sleep和killJMeter:這兩個命令組合起來的意思是:65秒後殺掉壓測進程,由於有時候JMeter並不能正常退出!KillJMeter是最開始時定義的函數,它經過grep和awk篩選出進程並殺掉,不過多講解了。


最後用sh命令執行shell腳本,會獲得下面的結果:






寫在最後bash



本文使用漫畫形式向你們展現了jmeter的進階用法:如何自動化運行jmeter。同窗們,不知道大家學會了嗎?請同窗們勤加練習,爭取學到更多的知識。

本內容出自 霍格沃茲測試學院,接下來會有什麼哪些即有趣又有內容的文章呢?請繼續關注咱們。
相關文章
相關標籤/搜索