shell脚本实现linux上批量执⾏jmeter测试并⽣成测试报告
本⼈已经很久没有更新博客了,这⾥就记录下前段时间写的⼀个shell脚本。这个脚本主要是⽤来在linux上批量执⾏jmeter测试的,初衷也是为了省去同事重复执⾏命令的⽆谓劳作。下⾯就⼀起来看看脚本的内容吧。希望shell⽅⾯的⼤神能给出指导意见。
⾸先,脚本的内容就是模仿⼈⼯操作的⼀个过程,所以理解起来还是⽐较简单的。
先来看下整个⽬录结构吧。如下图所⽰:
先来解释下每个⽂件吧。(按图⽚顺序)
htmlReport:该⽂件夹⽤于存放⽣成的html报告,可脚本执⾏时创建(⾮必须)
testJMX:该⽂件⽤于存放测试⽤例(必须)
testJTL:该⽂件⽤于存放⽣成的.jtl报告⽂件,可脚本执⾏时创建(⾮必须)
testLog:该⽂件⽤于存放执⾏测试⽤例的⽇志⽂件,⽂件内容为⾃定义,可以脚本执⾏时创建(⾮必须)
config.ini:该⽂件⽤于配置jmeter安装路径,指定JmeterHome(必须)
<:该⽂件⽤于jmeter分布式测试时,配置⽤于执⾏测试的linux的ip地址(必须,但内容可以为空)
run_new.sh:该⽂件是执⾏测试的⼊⼝,即脚本⽂件(必须)
<:该⽂件⽤于配置本次测试需要执⾏的测试⽤例(必须)
好了,⽂件⽬录已经介绍完了,⼼⾥⼤概有个框框了。下⾯就直接来看脚本内容吧。linux循环执行命令脚本
#! /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/''
testLog=`date "+%Y%m%d%H%M%S"`'.log'
TARFILE=$BASE_PATH/"REPORTFILE"
IPAddress=$BASE_PATH/""
#判断⽂件或⽂件夹是否存在,不存在则创建
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 -i.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
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
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
上⾯就是完整的脚本,⾥⾯有的地⽅⽐较冗余,后来进⾏了修改,希望能对⼤家有所帮助。如果⼤家喜欢的话,给个赞吧。嘻嘻,,,我会继续努⼒的,希望跟⼤家共同成长。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论