本人已经很久没有更新博客了,这里就记录下前段时间写的一个shell脚本。这个脚本主要是用来在linux上批量执行jmeter测试的,初衷也是为了省去同事重复执行命令的无谓劳作。下面就一起来看看脚本的内容吧。希望shell方面的大神能给出指导意见。
首先,脚本的内容就是模仿人工操作的一个过程,所以理解起来还是比较简单的。
先来看下整个目录结构吧。如下图所示:
先来解释下每个文件吧。(按图片顺序)
htmlReport:该文件夹用于存放生成的html报告,可脚本执行时创建(非必须)
testJMX:该文件用于存放测试用例(必须)
testJTL:该文件用于存放生成的.jtl报告文件,可脚本执行时创建(非必须)
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