接上次我利用了Jmeter做完压测之后,现在我就要把它自动生成一个HTML的性能报告了。
由于性能测试测的是性能,所以此处建议使用命令行,而不是图形界面。用命令行界面的优势有如下几点:
1.图形界面消耗的资源比命令行界面大得多;
2.命令行界面可以用于测试大型负载的性能测试;
3.可以部署在持续集成的CI工具,例如jenkins。
埋坑与填坑之路
于是我就开启了jmeter非GUI的暴走模式,刚开始到处碰壁,下面就把遇到的问题和解决办法分享给大家。
首先用cmd打开windows的命令行窗口, cd切换到jmeter bin所在的目录。因为我的Jmeter是放在了D盘的D:\Program Files (x86), 所以我的是 D:\Program Files (x86)\apache-jmeter-3.0\bin 。
接着运行 jmeter -n -t D:\Program Files (x86)\apache-jmeter-3.0\result\Test.jmx -l D:\Program Files (x86)\apache-jmeter-3.0\result\demo.csv
其中 -n 表示运行jmeter非GUI,如果直接jmeter 回车,就会打开GUI界面。
-t 指定的脚本文件及其路径。
-l 输出结果指定的路径,默认是输出到bin目录下的jmeter.log
接下来让人抓狂的事情发生了:报错An error occured:Unknown arg
@#@¥#¥%……¥¥……¥……¥¥&¥%#%¥……¥&¥……¥……¥&¥¥……&(内心戏:OMG, what happen? What's wrong?)
由于我有python的编程经验,其中python对于缩进有严格的限制,我就猜想,会不会是我的路径有问题?
D:\Program Files (x86)\apache-jmeter-3.0\result\Test.jmx (问题其实就在这里)
命令行界面对于空格也有一定的规则,我路径错误就在于Program Files (x86)这个文件夹名称存在空格。
所以解决方法是把我的jmeter直接移动到根目录,变成D:\apache-jmeter-3.0
当然我也可以把Program Files(X86)中的空格去掉,但是我不会这么做,因为这个文件夹下面装了好多东西。
OK,这次接着采用我上次用过的百度测试的jmx脚本来调试,再次运行命令,jmeter -n -t D:\apache-jmeter-3.0\testFile\testBaidu.jmx -l D:\apache-jmeter-3.0\testFile\csvlog.log -e -o D:\apache-jmeter-3.0\testFile\Report
yes, success!
正确的指令打开方式
jmeter –n –t
-n: 非GUI模式执行JMeter
-t: 执行测试文件所在的位置
-l: 指定生成测试结果的保存文件,jtl文件格式
-e: 测试结束后,生成测试报告
-o: 指定测试报告的存放位置
该方式的输入,为JMX file path,另外两个参数(CSV log和report folder)皆为输出。
需要注意的是,csv log不能在report folder下,否则将报类似csv log is not empty之类的错误。
输出的CSV文件如下(百度测试为例):
报告展示
报告生成完毕后,目录结构如下:
Test and Report Information
列出csv log文件名,已经报告生成所花费的时间(起始时间,结束时间)。
APDEX
应用程序性能指标。
Apdex:性能结果,范围0-1,1表示满意。
T:满意阈值,小于或等于该值,表示满意。
F:失败阈值,大于或等于该值,表示不满意。
处于T与F之间,表示可容忍。
Requests Summary
所有Request的成功比例,OK表示成功,KO表示不成功。
Statistics
数据分析。
Samples:线程数量
KO:失败数量
Error:失败率
Average:平均耗时
Min:最小耗时
Max:最长耗时
90th/95th/99thpct:90%、95%、99%的线程耗时
Throughput:每秒钟发送的请求数量
Received:接收网络响应耗时
Sent:发送网络请求耗时
Errors
会给出所有的错误原因。
OverTime
(1) Response Time Over Time
随时间变化,每个时间节点上的线程平均响应时间
(2) Bytes Throughput Over Time
(3) Latencies Over Time
随时间变化,每个时间节点上的平均响应延时。
Thoughput
(1) Hits Per Second (excluding embedded resources)
每秒钟向服务器发送的请求数量。
(2) Codes Per Second (excluding embedded resources)
每秒钟服务器返回的ResponseCode数量。
(3) Transactions Per Second
服务器每秒钟处理的事务数量。
(4) ResponseTime Vs Request
每秒发送多少个请求时,所对应的平均响应时间。
(5) LatencyVs Request
每秒发送多少个请求时,所对应的平均延时。
Response Times
(1) ResponseTime Percentiles
响应时间与百分比的对应关系,即有百分之多少的线程花费了某一响应时间。
(2) Active Threads Over Time
(3) TimeVs Threads
N个活动线程情况下的平均响应时间。
(4) Response TimeDistribution
在某一响应时间段内的线程响应数量。
报告详情可以参考:JMeter-Generating Dashboard
最后还有一点要注意的是,每次启动命令之前,report的文件夹内容必须和 jtl 文件一起清空。
读更多的好书,拍更美的照片,写更酷的代码,遇见更有趣的人,愿望是实现从IT菜鸟到全栈工程师的蜕变。