性能工具之 JMeter 使用 shell 脚本快速执行

简介: 【2月更文挑战第30天】性能工具之 JMeter 使用 shell 脚本快速执行

一、背景

在 Linux 中执行 JMeter 脚本时候,大家是否一直使用jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]命令执行,是否想过通过 shell 脚本或者 python 快速执行.

今天简单介绍下 shell 脚本执行。前置条件需要配置 JMeter 环境变量,如果没有配置,需要在脚本中修改相应位置。

二、效果

image.png

shell 脚本:
image.png

image.png

三、环境变量配置

vi ~/.bash_profile
#jmeter:路径
JMETER_HOME=/root/tools/apache-jmeter-3.3
PATH=$PATH:$HOME/bin:$JMETER_HOME/bin:
export PATH

#执行生效:
source ~/.bash_profile

验证:

image.png

四、脚本解析

1、参考代码

#!/bin/bash
# author:7DGroup
# 2019/12/08/20/50

cmdsh="/home/gaolou/apache-jmeter-3.1/bin/JMeterPluginsCMD.sh"
case=$1
mNum=$2
durationTime=$3
mark=$4
resultDataFileName="resultData.csv"
#hostIps="101.201.210.163"
nowPwd=`pwd`

echo -e "\033[32m-压力机开始执行。。请等待-\033[1m"

echo testcaseName:${case}_${mNum}_${durationTime}_${mark}
if [ -z ${case} ];then
        echo -e "\033[32m请输入脚本名,线程数,执行时间,备注! 输入脚本名\033[0m"
        echo "ERROR"
        exit 1
fi
if [ -z ${mNum} ];then
        echo -e "\033[32m请输入脚本名,线程数,执行时间,备注! 输入线程数\033[1m"
        echo "ERROR"
        exit 1
fi
if [ -z ${durationTime} ];then
        echo -e "\033[32m请输入脚本名,线程数,执行时间,备注! 输入备注\033[1m"
        echo "ERROR"
        exit 1
fi

oneTest(){
   
   
    filename=${case}_${mNum}_${durationTime}_${mark}
    echo "filename:"${filename}
    mkdir -p ${nowPwd}/${case}
    cd ${nowPwd}/${case}
    cp ${nowPwd}/testPlan/${case}.jmx ${nowPwd}/${case}/${case}.jmx
    if [ ! -f ${resultDataFileName} ];then
                echo -e "sceneName,sceneThreadNum,duration(s),interfaceName,interfaceNum,totalCount,tps,errorPersent,avgTims(ms),persentTime(ms)" > ${resultDataFileName}
    fi
    rm -rf ${filename}
    mkdir ${filename}
    cp ${case}.jmx ${nowPwd}/${case}/${filename}/${filename}.jmx
    cd ${nowPwd}/${case}/${filename}/
    sed -i "s#name=\"ThreadGroup\.num_threads\">2<#name=\"ThreadGroup\.num_threads\">$((2*mNum))<#g" ${filename}.jmx
    sed -i "s#name=\"ThreadGroup\.num_threads\">1<#name=\"ThreadGroup\.num_threads\">$((1*mNum))<#g" ${filename}.jmx
    sed -i "s#ERRORXML#${nowPwd}/${case}/${filename}/${filename}_ERROR.xml#g" ${filename}.jmx
    sed -i "s#ThreadGroup.scheduler\">.*</#ThreadGroup.scheduler\">true</#g" ${filename}.jmx
    sed -i "s#LoopController\.loops\">.*</#LoopController\.loops\">-1</#g" ${filename}.jmx
    sed -i "s#LoopController\.continue_forever\">.*</#LoopController\.continue_forever\">true</#g"  ${filename}.jmx
    sed -i "s#ThreadGroup.duration\">.*</#ThreadGroup.duration\">${durationTime}</#g" ${filename}.jmx

   if [ -z ${hostIps} ];then
        #jmeter -n -t ${filename}.jmx -l ${filename}.jtl -j ${filename}.log
        jmeter  -n -t ${filename}.jmx -l ${filename}.jtl -j ${filename}.log -e -o ${filename}
   else
        jmeter  -n -t ${filename}.jmx -R ${hostIps}  -l ${filename}.jtl -j ${filename}.log -e -o ${filename}
         #jmeter -n -t ${filename}.jmx -R ${hostIps} -l ${filename}.jtl -j ${filename}.log
    fi

    ${cmdsh} --generate-csv ${filename}.csv --input-jtl ${filename}.jtl --plugin-type AggregateReport
    local sumThread=`grep "<stringProp name=\"ThreadGroup.num_threads\">" ${filename}.jmx |awk -F\> '{print $2}'|awk -F\< 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'`
    if [ -z ${
    
    hostIps} ];then
        hostNum=1
     else
        hostNum=`echo ${hostIps}|awk -F, '{print NF}'`
        let sumThread=sumThread*hostNum
        let mNum=mNum*hostNum
    fi
    sed -n '2,$p' ${filename}.csv|grep -v TOTAL| awk -F, -v case=${filename} -v tnum=${sumThread} -v duration=${durationTime} '{printf("%s,%s,%s,%s,%s,%s,%s,%s,90%time:%s;95%time:%s;99%time:%s\n",case,tnum,duration,
$1,$2,$11,$10,$3,$5,$6,$7)}' >> sDGroup
    local totalGroup=`cat sDGroup|wc -l`
    for((i=1;i<=${totalGroup};i++))
    do
       sed -n "${i}p" sDGroup|awk -F, -v tnum=${mNum} '{printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",$1,$2,$3,$4,tnum,$5,$6,$7,$8,$9)}' >>../${resultDataFileName}
    done
}
oneTest

echo -e "\033[32m-压力已经结束-\033[1m"

2、主要逻辑

脚本执行方法:

  • 给予可执行权限:chomd a+x startJmeter.sh
  • 执行方法:sh startJmeter.sh 脚本名字 并发数 执行时间 备注
cmdsh="/home/gaolou/apache-jmeter-3.1/bin/JMeterPluginsCMD.sh"
case=$1  #脚本名字
mNum=$2  #并发数 
durationTime=$3  #执行时间
mark=$4    #备注
resultDataFileName="resultData.csv"  #csv命令保存数据
#hostIps="101.201.210.163"   #如果是多台机器需要取消该注释,把压力机器全部加上

通过 sed -i 替换执行并发数、执行时间等信息

sed -i "s#name=\"ThreadGroup\.num_threads\">2<#name=\"ThreadGroup\.num_threads\">$((2*mNum))<#g" ${filename}.jmx
sed -i "s#name=\"ThreadGroup\.num_threads\">1<#name=\"ThreadGroup\.num_threads\">$((1*mNum))<#g" ${filename}.jmx
sed -i "s#ERRORXML#${nowPwd}/${case}/${filename}/${filename}_ERROR.xml#g" ${filename}.jmx
sed -i "s#ThreadGroup.scheduler\">.*</#ThreadGroup.scheduler\">true</#g" ${filename}.jmx
sed -i "s#LoopController\.loops\">.*</#LoopController\.loops\">-1</#g" ${filename}.jmx
sed -i "s#LoopController\.continue_forever\">.*</#LoopController\.continue_forever\">true</#g"  ${filename}.jmx
sed -i "s#ThreadGroup.duration\">.*</#ThreadGroup.duration\">${durationTime}</#g" ${filename}.jmx

通过封装 Jmeter -n -t 。。。等信息去执行脚本,该执行命令可以根据自己需要修改

if [ -z ${hostIps} ];then
        #jmeter -n -t ${filename}.jmx -l ${filename}.jtl -j ${filename}.log
        jmeter  -n -t ${filename}.jmx -l ${filename}.jtl -j ${filename}.log -e -o ${filename}
   else
        jmeter  -n -t ${filename}.jmx -R ${hostIps}  -l ${filename}.jtl -j ${filename}.log -e -o ${filename}
        #jmeter -n -t ${filename}.jmx -R ${hostIps} -l ${filename}.jtl -j ${filename}.log
    fi

结果保存通过插件 JMeterPluginsCMD.sh 执行获取 csv 数据,如果想知道该插件详细信息可以搜索下怎么使用。

${cmdsh} --generate-csv ${filename}.csv --input-jtl ${filename}.jtl --plugin-type AggregateReport
    local sumThread=`grep "<stringProp name=\"ThreadGroup.num_threads\">" ${filename}.jmx |awk -F\> '{print $2}'|awk -F\< 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'`
    if [ -z ${
    
    hostIps} ];then
        hostNum=1
     else
        hostNum=`echo ${hostIps}|awk -F, '{print NF}'`
        let sumThread=sumThread*hostNum
        let mNum=mNum*hostNum
    fi
    sed -n '2,$p' ${filename}.csv|grep -v TOTAL| awk -F, -v case=${filename} -v tnum=${sumThread} -v duration=${durationTime} '{printf("%s,%s,%s,%s,%s,%s,%s,%s,90%time:%s;95%time:%s;99%time:%s\n",case,tnum,duration,
$1,$2,$11,$10,$3,$5,$6,$7)}' >> sDGroup
    local totalGroup=`cat sDGroup|wc -l`
    for((i=1;i<=${totalGroup};i++))
    do
       sed -n "${i}p" sDGroup|awk -F, -v tnum=${mNum} '{printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",$1,$2,$3,$4,tnum,$5,$6,$7,$8,$9)}' >>../${resultDataFileName}
    done

JMX 脚本写法需要注意

image.png

这里实际上 shell 脚本是替换【ThreadGroup.num_threads">1】

image.png

3、目录说明

脚本存放目录:
image.png
image.png

shell 脚本存放位置:
image.png

执行结果:
image.png

  1. 表示当前执行的脚本名字
  2. 表示原始脚本
  3. csc 结果保存

执行脚本结果目录说明:
image.png
image.png

打开脚本:
image.png

vim日志:
image.png

4、下载报告

使用 tar 命令

  • 解包:tar zxvf FileName.tar
  • 打包:tar zcvf FileName.tar DirName

下载:

sz filename.tar

image.png

下载解压后打开:

image.png
image.png

五、总结

通过 shell 脚本执行Jmeter脚本,如果是长时间执行可以采用后台执行方法,加上 nohup 这样执行不用担心 ssh 窗口执行失败。

源码地址:

目录
相关文章
|
6月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
569 9
|
6月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
563 3
|
9月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
338 60
|
12月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
6月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
959 2
|
10月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
389 17
|
11月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
1314 25
|
10月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
299 4
|
10月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
545 3