本人已经好久没有更新博客了,这里就记录下前段时间写的一个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
上面就是完整的脚本,里面有的地方比较冗余,后来进行了修改,但愿能对你们有所帮助。
若是你们喜欢的话,给个赞吧。嘻嘻,,,我会继续努力的,但愿跟你们共同成长。