本人已經好久沒有更新博客了,這裏就記錄下前段時間寫的一個shell腳本。這個腳本主要是用來在linux上批量執行jmeter測試的,初衷也是爲了省去同事重複執行命令的無謂勞做。下面就一塊兒來看看腳本的內容吧。但願shell方面的大神能給出指導意見。html
首先,腳本的內容就是模仿人工操做的一個過程,因此理解起來仍是比較簡單的。java
先來看下整個目錄結構吧。以下圖所示:linux
先來解釋下每一個文件吧。(按圖片順序)shell
htmlReport:該文件夾用於存放生成的html報告,可腳本執行時建立(非必須)windows
testJMX:該文件用於存放測試用例(必須)bash
testJTL:該文件用於存放生成的.jtl報告文件,可腳本執行時建立(非必須)ssh
testLog:該文件用於存放執行測試用例的日誌文件,文件內容爲自定義,能夠腳本執行時建立(非必須)分佈式
config.ini:該文件用於配置jmeter安裝路徑,指定JmeterHome(必須)函數
IPAddress.txt:該文件用於jmeter分佈式測試時,配置用於執行測試的linux的ip地址(必須,但內容能夠爲空)測試
run_new.sh:該文件是執行測試的入口,即腳本文件(必須)
testList.txt:該文件用於配置本次測試須要執行的測試用例(必須)
好了,文件目錄已經介紹完了,內心大概有個框框了。下面就直接來看腳本內容吧。
#! /bin/bash #進入當前執行文件目錄 cd `dirname $0` #獲取當前路徑 BASE_PATH=`pwd` #使用config.ini配置文件 source $BASE_PATH/config.ini #定義各類文件名 JTL=$BASE_PATH/"testJTL" JTL_FILE=`date "+%Y%m%d%H%M%S"` JMX=$BASE_PATH/"testJMX" HTML=$BASE_PATH/"htmlReport" HTML_FILE=`date "+%Y%m%d%H%M%S"` LOG=$BASE_PATH/"testLog" list=$BASE_PATH/'testList.txt' testLog=`date "+%Y%m%d%H%M%S"`'.log' TARFILE=$BASE_PATH/"REPORTFILE" IPAddress=$BASE_PATH/"IPAddress.txt" #判斷文件或文件夾是否存在,不存在則建立 if [ ! -d $JTL ];then mkdir $JTL fi if [ ! -d $JMX ];then mkdir $JMX fi if [ ! -d $HTML ];then mkdir $HTML fi if [ ! -d $LOG ];then mkdir $LOG fi if [ ! -f $LOG/$testLog ];then touch $LOG/$testLog fi if [ ! -d $JTL/$JTL_FILE ];then mkdir $JTL/$JTL_FILE fi if [ ! -d $HTML/$HTML_FILE ];then mkdir $HTML/$HTML_FILE fi # login client # start jmeter-server #獲取遠程鏈接的ip地址 IPList=(`cat $IPAddress`) RemoteIP="" testFile="StartFile.log" #判斷ip地址是否大於0,若是大於,則一次登陸 #啓動該ip機器上的jmeter-server,關閉防火牆 #返回操做結果並退出 if [ ${#IPList[@]} -gt 0 ];then for ip in ${IPList[@]} do { ssh root@$ip << EOF #ifconfig echo "Login $ip" # check firewall systemctl status firewalld > "StartFile.log" grep -q "active (running)" $testFile if [ $? -eq 0 ];then systemctl stop firewalld if [ $? -eq 0 ];then echo "Stop firewall OK." else echo "Stop firewall error." fi else echo "Firewall has been stopped." fi # start jmeter-server #echo $JMeterHome cd $JMeterHome if [ ! -x jmeter-server ]; then chmod 755 jmeter-server fi nohup ./jmeter-server -Djava.rmi.server.hostname=$ip >> jmeter-server-start.log 2>&1 & #echo "sleep time 5" sleep 5 jobs > "StartFile.log" grep -q "Running" $testFile if [ $? -eq 0 ];then echo "Start jmeter-server OK." else echo "Jmeter-server start error." fi rm -f "StartFile.log" echo " Now exit from $ip" exit EOF RemoteIP=${RemoteIP}${ip}"," }& done wait fi #建立一個函數用於拼接名稱 #該函數有$1和$2兩個參數 function createName(){ name=`echo $1 | grep -v -E "^#.*$|^$" | grep -o -E "^\w+"`$2 echo $name } #開始向log文件輸入內容(可自定義) echo "" >$LOG/$testLog #用於計數,統計共執行了多少個測試用例 total=0 #for循環,依次執行testList文件中的測試用例 for i in `cat $list` do #去掉註釋行 echo "$i" | grep -q -E "^#|^\s" if [ $? -eq 0 ];then continue fi echo "(`date "+%Y-%m-%d %H:%M:%S"` )Run "$i >> $LOG/$testLog #調用createName函數拼接測試報告名稱 jtlname=$(createName $i ".jtl") reportname=$(createName $i "_report") #去除\r符 i=`echo $i | sed 's/\r//g'` #若是RemoteIP爲空,則不進行遠程分佈式測試,只在本機執行 if [ -z "$RemoteIP" ];then $JMeterHome/jmeter -n -t $JMX/$i -l $JTL/$JTL_FILE/$jtlname -e -o $HTML/$HTML_FILE/$reportname fi #若是RemoteIP不爲空,則進行遠程分佈式測試 if [ -n "$RemoteIP" ];then $JMeterHome/jmeter -n -t $JMX/$i -R ${RemoteIP%?} -l $JTL/$JTL_FILE/$jtlname -e -o $HTML/$HTML_FILE/$reportname fi #計數 let total=$total+1 done sleep 5 echo "--------------------------------------" >>$LOG/$testLog echo "" >>$LOG/$testLog echo "TOTAL: "$total >>$LOG/$testLog if [ $? -eq 0 ];then sleep 5 if [ ! -d $TARFILE ];then mkdir $TARFILE fi 將測試報告和log文件移到同一個文件夾 mv $LOG/$testLog $TARFILE mv $JTL/$JTL_FILE $TARFILE mv $HTML/$HTML_FILE $TARFILE #打包文件夾 tar -cf $BASE_PATH/ReportFile.tar -C $BASE_PATH "REPORTFILE" #打包好後下載文件到windows本地 if [ $? -eq 0 ];then sz $BASE_PATH/ReportFile.tar fi #刪掉不用的文件 if [ $? -eq 0 ];then rm -f *.tar rm -f *.log rm -fr $TARFILE fi fi
上面就是完整的腳本,裏面有的地方比較冗餘,後來進行了修改,但願能對你們有所幫助。
若是你們喜歡的話,給個贊吧。嘻嘻,,,我會繼續努力的,但願跟你們共同成長。