大話JMeter4|不同的並發數可以自動化做壓測嗎?
- 2019 年 12 月 16 日
- 筆記

上節課愛畫漫畫的小哥哥用漫畫形式向大家展示了JMeter的進階用法:如何搭建InfluxDB,使用更炫酷的Grafana。
看到很多小夥伴覺得看的不過癮,在強烈的催促下,小哥哥的新文章又出來了。這次小哥哥又給我們帶來怎樣的驚喜呢?接著看下去吧!

不同並發如何做壓測?










如果手動逐步加壓,不僅需要人肉改並發數,還需要花大量時間等待完成,可以用一個字概括:煩!所以,制定好策略,讓程式自動加壓,自動等待;完成後看壓測監控記錄,或者坐收報告是最完美的解決方案。

無UI執行JMeter

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程式碼,將會挑重點來解釋,如果對語法生疏,可以自行網上搜索。
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腳本,會得到下面的結果:





寫在最後
本文使用漫畫形式向大家展示了jmeter的進階用法:如何自動化運行jmeter。同學們,不知道你們學會了嗎?請同學們勤加練習,爭取學到更多的知識。
本內容出自霍格沃茲測試學院,接下來會有什麼哪些即有趣又有內容的文章呢?請繼續關注我們。