shell腳本實現linux上批量執行jmeter測試並生成測試報告

本人已經好久沒有更新博客了,這裏就記錄下前段時間寫的一個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

上面就是完整的腳本,裏面有的地方比較冗餘,後來進行了修改,但願能對你們有所幫助。

若是你們喜歡的話,給個贊吧。嘻嘻,,,我會繼續努力的,但願跟你們共同成長。

相關文章
相關標籤/搜索