命令行运行jmeter脚本(包括Windows、Linux环境)
目录
1、动态保存日志和报告
2、命令行调试脚本,动态配置属性 例如:线程数,持续压测时长等
3、术语回顾
4、线程组设置(加压方式配置)
5、Jmeter压测减少资源使用的一些建议
背景:在准备调试完测试脚本后,在命令行运行脚本
准备工作:切换到jmeter/bin 目录下(我这里未配置jmeter的环境变量)、将脚本文件test.jmx 存放在bin目录
执行命令: jmeter -n -t test.jmx -l res.jtl -e -o res/
-n代表noGUI运行jmeter
-t代表测试计划(test plan)
脚本名称.jmx,要指明所在目录,可以使用绝对路径,也可以使用相对路径
-l :name不能重复.jtl (.jtl),此文件名不能重复。l就是log的意思,把结果保存到这个文件中
-e :在脚本运行结束后生成html报告
-o :用于存放html报告的目录(若指定目录的话,目录必须为空),支持放1个未创建的目录在这里
1、动态保存日志和报告
方式一:动态保存日志+报告:先删除之前同名称已存在的文件,再运行
windows 的命令行输入: del /s /Q 01resLogin.jtl rd /s /Q 02res jmeter -n -t 01login.jmx -l 01resLogin.jtl -e -o 02res |
Linux的操作输入: rm 01resLogin.jtl rm -rf 02res jmeter -n -t 01login.jmx -l 01resLogin.jtl -e -o 02res |
方式二:加上变量
2.1 要先设置变量,重复执行前都需要先设置name的值
Windows cmd命名行设置变量:set name=1,再使用它
jmeter -n -t 01login.jmx -l res%name%.jtl -e -o res%name%
———————————————————————————————————
C:\FFFF盘\测试软件\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin>set name=2
C:\FFFF盘\测试软件\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin>jmeter -n -t 01login.jmx -l res%name%.jtl -e -o res%name
2.2 拿时间戳当变量,带时间:20220402144124
window的拼接时间: %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
jmeter -n -t 01login.jmx -l res%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
.jtl -e -o res%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
2.1 Linux的先设置变量,重复执行前都需要先设置name的值 n=1 jmeter -n -t 01login.jmx -l res${n}.jtl -e -o ress${n} n=2 jmeter -n -t 01login.jmx -l res${n}.jtl -e -o ress${n}
2.2 变量就是时间戳 Linux获取当前时间戳 $(date “+%Y%m%d%H%M%S”) jmeter -n -t login.jmx -l res$(date “+%Y%m%d%H%M%S”).jtl -e -o res$(date “+%Y%m%d%H%M%S”)
|
2、命令行调试脚本,动态配置属性 例如:线程数,持续压测时长等
参照:https://www.cnblogs.com/jxial/p/15169803.html
-J加上脚本设置的变量名=N,例如线程数的变量名是concurrent_number(在脚本中参数化写法:${__P(count_number,1)} 用到了__P()函数来获取命令中指定的属性值,默认值是1),在命令行指定10个线程数:-Jconcurrent_number=10 (位置放在脚本文件后面)
jmeter -n -t 01login.jmx -Jconcurrent_number=10 -l 01resLogin.jtl -e -o 02res
若有多个变量,分别指派值,例如:循环次数为5 -Jcycles=5
jmeter -n -t 01login.jmx -Jconcurrent_number=10 -Jcycles=5 -l 01resLogin.jtl -e -o 02res
<ThreadGroup guiclass=”ThreadGroupGui” testclass=”ThreadGroup” testname=”FUSE Pro APP VN” enabled=”true”> <stringProp name=”ThreadGroup.on_sample_error”>continue</stringProp> <elementProp name=”ThreadGroup.main_controller” elementType=”LoopController” guiclass=”LoopControlPanel” testclass=”LoopController” testname=”循环控制器” enabled=”true”> <boolProp name=”LoopController.continue_forever”>false</boolProp> <intProp name=”LoopController.loops”>-1</intProp> </elementProp> <stringProp name=”ThreadGroup.num_threads”>${__P(count_number,1)}</stringProp> <stringProp name=”ThreadGroup.ramp_time”>${__P(ini_time,1)}</stringProp> <boolProp name=”ThreadGroup.scheduler”>true</boolProp> <stringProp name=”ThreadGroup.duration”>${__P(timePeriod,3)}</stringProp> <stringProp name=”ThreadGroup.delay”></stringProp> <boolProp name=”ThreadGroup.same_user_on_next_iteration”>true</boolProp> </ThreadGroup> |
——————————————————————————————-
其他说明:
如果jmeter的bin目录加入到了环境变量里面,那么在任何目录都可以使用jmeter命令来运行jmeter程序
如果没有的话,就切换到jmeter/bin目录下运行。
其实,在实际压测的时候是较少使用命令行方式的,因为看不到tps波动情况。
一般来说,如果有大的波动,是需要立即连接服务器查看各个资源的情况的,比如线程池、连接池,
虽然命令行执行完后会生成jtl结果文件,但是压测完,压测过程中创建的各种连接都释放了,也就无法定位到问题了,
如果有失败的请求还好点,这样可以根据错误日志来分析定位问题。
Jmeter脚本:基本不用录制的,参考接口文档写,或通过fiddler抓包
Jmeter执行顺序:配置元件 → 前置处理器 → 定时器 → 取样器 → 后置处理器 → 断言 → 监听器;
———————————
3、术语回顾
并发:tps
线程数:跑道里参加赛跑的人数
迭代(jmeter中叫做循环次数):每个人跑多少圈
循环(jmeter中是循环控制器):一次迭代里面,反复执行其中一段脚本,就是反复来回跑其中一段跑道
参数值:发请求时候用的数据
参数化:是一种策略,可以根据参数策略获取参数值,参考:https://www.cnblogs.com/uncleyong/p/10702700.html
思考时间:模拟用户等待的时间
关联:下一个请求入参依赖上一个请求的某个返回值,参考:https://www.cnblogs.com/uncleyong/p/10702702.html
检查点:判断请求是否成功,一般只有查询请求才加检查点
固定定时器:相当于模拟用户的思考时间
集合点:集合策略,集合线程数小于等于线程组设置的线程数,还可以设置超时时间,同一时刻去发起请求,主要应用场景是秒杀
事务: 一般把被测的某个或者某几个请求一起定义为一个事务,是人为的测试定义
负载:服务器的繁忙程度,如果一个8c的服务器,每次可以同时处理8个请求,如果请求量大,后面的请求就排队,排队的请求越多,服务器的负载就越高
平均响应时间(art):每个事务的处理时间,从发送请求到接收到响应
tps:每秒处理的事务数(和qps:https://www.cnblogs.com/uncleyong/p/11059556.html)(一个事务是指事务内第一个请求发送到接收到最后一个请求的响应的过程)
QPS:Queries Per Second,意思是每秒查询率,是一台服务器每秒能够响应的查询次数(数据库中的每秒执行查询sql的次数),是数据库中的概念,每秒执行条数(查询),被引申到压测中来了,但是不包括插入、更新、删除操作,所以不建议用qps来描述系统整体的性能,不建议用qps来作为系统性能指标
每秒点击率(数):每秒处理的请求数,而不是用户每秒发送的请求数
场景:设置并发策略,模拟用户使用的场景
分析:场景运行完,生成各种维度的结果
——————————
4、线程组设置(加压方式配置)
在指定的时间内启动线程,如果线程数是100,这里是10,表示10秒内启动100线程,但是不一定是每秒启动10个线程
循环次数:不勾选永远,后面的次数生效;
调度器配置
循环次数中勾选永远,持续时间就是并发的时间,一般10-15分钟,根据业务实际情况来设置
如果循环计数不是-1或不是永远,同时配置了调度器-持续时间,只要达到其中1个最小条件,就会结束运行。。
If Loop Count is not -1 or Forever, duration will be min(Duration, Loop Count * iteration duration),因此如果未勾选永远,建议不要勾选调度器和设置持续时间
—————————————-
5、Jmeter压测减少资源使用的一些建议,即压测结果会更准确
1、使用非GUI模式(也就是CLI,Command Line Interface,命令行界面):jmeter -n -t test.jmx -l result.jtl
2、少使用Listener, 如果使用-l参数,它们都可以被删除或禁用
3、在加载测试期间不要使用“查看结果树”或“用表格查看结果”监听器,只能在脚本阶段使用它们来调试脚本
4、包含控制器在这里没有帮助,因为它将文件中的所有测试元素添加到测试计划中
5、不要使用功能模式
6、使用CSV输出而不是XML
7、只保存你需要的数据
8、尽可能少地使用断言
9、如果测试需要大量数据,尤其是需要将其随机化,可以提前准备好测试数据放到数据文件中,从CSV数据集中读取, 这样可以避免在运行时浪费资源