20230317_性能测试 -Jmeter压测报告生成
本文主要讲述Jmeter使用CLI模式下压测报告的生成及定制
需求产生
S背景
目前对于小并发量的产品, 测试使用GUI模式进行压测是一个很普遍的状况. GUI页面写好脚本, 直接开压, 然后在监控器一张张截图写个测试报告, 虽然Jmeter启动窗口已经提示GUI模式只用来写脚本和Debug
因团队需求, 最近要定义一个标准的压测流程, 而压测模式改为了CLI模式, 报告的生成就要再出一套解决方案
T目标
- Jmeter生成报告流程定义
- Jmeter报告模板定制
Jmeter报告生成逻辑
graph LR jmx脚本文件--Jmeter运行测试-->生成包含测试结果数据的jtl文件--Jmeter命令生成报告-->html文件 user.properties--配置报告图表-->html文件 report-template--定义报告模板-->html文件
user.properties和reprot-template均在 Jmeter文件夹bin目录下
报告生成
Jmater命令行
Jmeter GUI模式一般用于开发脚本和debug, 会占用10%-25%的系统资源,
真正压测时使用非GUI模式(命令行执行),可以提升负载的并发数
jmeter -n -t xxx.jmx
非GUI模式中, 可以使用-l
生成jtl 文件, -e
生成html报告文件
jmeter -n -t xxx.jmx -l $jtl_path/xxx.jtl -e -o $html_path
jmeter -n -t D:\work_space\jmeter_space\202301_SDH2_3.jmx -l D:\work_space\jmeter_space\result\1.jtl
已经拥有了jtl文件, 可以使用-g
和-o
命令将jtl文件转化为html报告文件
jmeter -g $jtl_path/xxx.jtl -o $html_path
Jtl文件详解
jtl官方wiki快速解读
jtl文件是Jmeter生成的放置测试结果数据的文档, 可以随意修改扩展名
listener中config中可以配置log保存的结果
除了命令行可以生成jtl文件外, 还可以通过listnener中配置保存文件路径来生成
jtl数据可以储存为csv或者xml格式, xml格式信息更多
jtl中包含的数据类型应该要和jmeter.properties,user.properties设置的一致
Jmeter报告解读
Jmeter默认模板报告分为3个部分
Dashboard
- APDEX信息 : 根据响应时间判定用户满意度
- 聚合报告信息
- 错误统计信息
Charts
- 监视器有的各种图表信息
- 此外还有线程组响应时间等多维度的图表,比自己创建的要详细很多
Customs Graphs
默认无信息, 可以通过设置 user.properties文件新增定制化信息, 后边会讲到~
配置报告图表
取样器过滤
配置效果
Jmeter只统计你所设置取样器的测试信息, 形成测试报告
配置方式
输出配置都以jmeter.reportgenerator.exporter为前缀。
property.output_dir 配置默认的报告输出路径。在命令行可以用-o选项来设置特定的路径覆盖该配置。
html.series_filter 用于过滤展示内容。如在user.properties添加如下配置:
jmeter.reportgenerator.exporter.html.series_filter=^($取样器名称|$取样器名称2)(-success|-failure)?$
# 示例: 只显示取样器Transaction Controller-0和Transaction Controller-2,成功的请求
jmeter.reportgenerator.exporter.html.series_filter=^(Transaction Controller-0|Transaction Controller-1)(-success)?$
新增定制化图表
根据Jmeter定制报告生成逻辑, 定制报告在user.properties中定义
配置效果
Jmeter根据自定义的X和Y, 到jtl文件中获取数据, 在测试结果中的Custom Graphs构成图表
配置方式
user.properties中已经给了定制图表的配置示例
定制化图标只支持从csv拿取数据
不支持在csv数据中自定义添加数据
## Custom graph definition
#jmeter.reportgenerator.graph.custom_mm_hit.classname=org.apache.jmeter.report.processor.graph.impl.CustomGraphConsumer # 表明这是个定制图表,不用动
#jmeter.reportgenerator.graph.custom_mm_hit.title=Graph Title # 定义图表名
#jmeter.reportgenerator.graph.custom_mm_hit.property.set_Y_Axis=Response Time (ms) # 定义Y属性
#jmeter.reportgenerator.graph.custom_mm_hit.property.set_X_Axis=Over Time # 定义X属性
#jmeter.reportgenerator.graph.custom_mm_hit.property.set_granularity=${jmeter.reportgenerator.overall_granularity} # 颗粒度, 即最小刻度单位, 长时间压测设为60000 (1min)
#jmeter.reportgenerator.graph.custom_mm_hit.property.setSampleVariableName=VarName
#jmeter.reportgenerator.graph.custom_mm_hit.property.setContentMessage=Message for graph point label
示例:
allThreads随时间的变化图
jmeter.reportgenerator.graph.custom_mm_hit.classname=org.apache.jmeter.report.processor.graph.impl.CustomGraphConsumer
jmeter.reportgenerator.graph.custom_mm_hit.title=Chunk allThreads
jmeter.reportgenerator.graph.custom_mm_hit.property.set_Y_Axis=allThreads
jmeter.reportgenerator.graph.custom_mm_hit.property.set_X_Axis=Over Time
jmeter.reportgenerator.graph.custom_mm_hit.property.set_granularity=6000
jmeter.reportgenerator.graph.custom_mm_hit.property.setSampleVariableName=allThreads
jmeter.reportgenerator.graph.custom_mm_hit.property.setContentMessage=Number of allThreads
宽容度设定
配置效果
Jmeter通过你设定的宽容度, 计算APDEX显示在测试结果首页中
配置方式
user.properties中修改, 宽容度暂时按照设置为2s和8s
# Change this parameter if you want to override the APDEX satisfaction threshold.
# Set to 500 ms by default
jmeter.reportgenerator.apdex_satisfied_threshold=5000
# Change this parameter if you want to override the APDEX tolerance threshold.
# Set to 1500 ms by default
jmeter.reportgenerator.apdex_tolerated_threshold=15000
设定依据:
Example: A client has provided 3 seconds as response time NFR and 5 seconds as the maximum response time NFR, so 3 seconds becomes satisfied threshold value and 5 seconds become tolerated threshold value.
图表标题修改
配置效果
测试报告中图表表头的按照你自定义的名称展示
配置方式
# Configure this property to change the report title
jmeter.reportgenerator.report_title=Neotrident JMeter Dashboard Report
定义报告模板
报告汉化
通过Reference中报告汉化文章下载Jmeter资源, 解压进入对应版本report_temeplate文件夹
windows电脑, 将目录下的index.html.fmkr和content/pages中的所有fmkr文件转换为ANSI编码
请注意主目录下index文件也需要转换, 对应文章中漏掉了
可以使用notepad++进行转换
直接将report_template复制到Jmeter/bin目录下,替换文件
替换对应文件即可, 下载的report_temeplate不是全量数据
执行html报告生成命令
jmeter -g D:\xxx\Jmeter报告\report.jtl -o D:\xxx\Jmeter报告\cn_report
模板手动修改
通过对模板文件fmkr文件进行修改, 从而自定义报告模板
# 文件路径,分别对应html 5个页面
apache-jmeter-5\bin\report-template\content\pages\ *.fmkr
apache-jmeter-5\bin\report-template\index.html.fmkr
# 使用notepad++打开文件, 对文案,页面结构进行自定义修改
可直接当做html文件进行修改
服务器监控数据
Jmeter报告不会自动集成服务器监控插件中的测试数据, 需要通过jtl文件保存测试结果再形成测试图表
Jtl文件保存
环境准备
- Jmeter插件中心安装PerMon Metrics Collector
- 压测服务器中防止Server-agent文件夹
压测前准备
- 服务器打开agent
- 脚本内监控器PerMon Metrics Collector设置输出filepath
- 执行压测,filepath自动生成服务器测试数据文档
压测后Jmeter查看
- 打开JmeterGUI页面, PerMon Metrics Collector浏览jtl文件,
- 右键可保存图片到本地
使用python解析
本代码主要实现 PerMon Metrics Collector导出文件解析为html格式图表,方便与官方报告做集成
- 需要提前安装pyecharts pip install pyecharts
- 使用时直接传入 log文件, 不需要配置导出属性
# -*- coding: utf-8 -*-
"""
@Author : Feny
@Time : 2023/2/13 10:13
@File : serverLog2chart.py
备注:
"""
import os
from datetime import datetime
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
from pyecharts.charts import Line, Page
from pyecharts import options as opts
from pyecharts.globals import ThemeType
def data_clean( filename: str):
"""获取数据并进行清洗"""
data = pd.read_csv(filename)
# 加入列名
data.columns = ['timestamp', 'arg', 'ip_index', 'index', *list(n for n in range(13))]
# 分组展示
g = data.groupby('ip_index')
return g
def series2list(data: pd.DataFrame ,column: str):
# 获取1列数据
data_str = list(data[column])
# 将列数据转化为数字组成的列表
return list(map(eval, data_str))
def ts2time(ts):
"""格式化输出时间字符串"""
dt = datetime.fromtimestamp(ts/1000)
return dt.strftime("%d %H:%M:%S")
if __name__ == '__main__':
# 数据清洗,获取group
filename = "server.jtl"
g = data_clean(filename)
# 图表生成
page = Page(layout=Page.DraggablePageLayout)
for tuple in g:
index, df = tuple[0], tuple[1]
ts_list_origin, arg_list_origin = list(df['timestamp']), list(df['arg'])
time_list = list( map(ts2time, ts_list_origin))
arg_list = list( map(lambda x:x/1000,arg_list_origin))
line1 = (
Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(time_list)
.add_yaxis(index, arg_list)
.set_global_opts(title_opts=opts.TitleOpts(title=f"Server{index.split()[1]}监控图",
subtitle=f"此曲线图反映了{index.split()[1]}的趋势变化"))
)
page.add(line1)
# 使用pyecharts形成图表
page.render("serverCharts.html")
os.system("serverCharts.html")
效果示意
结论
- Jmeter应该使用CLi模式进行压测
- 通过jtl文件生成html图表, 客户端及服务器测试信息都实现了图表化展示
- 后续可通过前端工程师支持, 集成客户端,应用服务器, 数据库的性能测试结果
Reference
报告生成
jmeter(二十五)linux环境运行jmeter并生成报告 - 老_张 - 博客园 (cnblogs.com) — (非GUI模式)
jmeter(二十六)生成HTML性能测试报告 - 老_张 - 博客园 (cnblogs.com) — (报告生成和默认报告解读)
[jmeter之jtl文件解析 - 秒秒开心 - 博客园 (cnblogs.com)](https://www.cnblogs.com/miaomiaokaixin/p/6118081.html#:~:text=jmeter之jtl文件解析 1 t表示从请求开始到响应结束的时间 2 lt表示整个的空闲时间 3 ts表示访问的时刻 4,lb表示标题 6 rc表示返回的响应码 7 rm表示响应信息 8 tn表示线程的名字“1-138”表示第1个线程组的第138个线程。 更多项目)–jtl文件内容解析,GUI模式打开jtl报告
[JtlFiles - Apache JMeter - Apache Software Foundation](https://cwiki.apache.org/confluence/display/JMETER/JtlFiles#:~:text=JMeter can create text files containing the results,extension - but any extension can be used.) –官方jtl解读文档
Apdex
什么是Apdex和Apdex阈值?_应用性能管理 APM_常见问题_常见咨询问题_华为云 (huaweicloud.com) – apdex阈值解读
关于 jMeter 结果报表里的 APDEX (Application Performance Index) - 腾讯云开发者社区-腾讯云 (tencent.com)
Apache JMeter - User’s Manual: Component Reference – Sample Result Save Configuration解读 (文章搜索Sample Result Save Configuration),帮助不大
报告定制
How to generate correct JMeter HTML Dashboard Report? (perfmatrix.com) –没有图标定制,其他很全,好像被墙了
(90条消息) jmeter生成html性能结果报告_媛测的博客-CSDN博客_jmeter html报告显示时间到秒 – Sampler过滤
Html文档, 官方文档解读的也很好
Jmeter的Html报告汉化及解析 - 腾讯云开发者社区-腾讯云 (tencent.com) –报告汉化, 配置Apdex评估中满意的阈值
Apache JMeter - User’s Manual: Generating Dashboard Report –官方配置介绍
Jmeter生成HTML性能测试报告 - 腾讯云开发者社区-腾讯云 (tencent.com) –详细解读和定制图表
(87条消息) JMeter学习(三十四)测试报告优化_kangdong0222的博客-CSDN博客–修改报告展示信息, 如请求响应内容
(87条消息) Jmeter自动生成测试报告及Html报告汉化_Dreamlane的博客-CSDN博客_jmeter生成中文报告 –报告汉化
服务器监控数据
JMeter - Server Performance Metrics Collector | Vinsguru – 浏览器监控插件介绍
If you run JMeter in non GUI mode and want to save monitoring data to file, just configure result file saving in GUI as you do with other listeners. After running the test you may load saved file into GUI and see the values timeline. For more details, please visit.
JMeter Performance Metrics | Tips | Blazemeter by Perforce 服务器监控