本文主要讲述Jmeter使用CLI模式下压测报告的生成及定制
目前对于小并发量的产品, 测试使用GUI模式进行压测是一个很普遍的状况. GUI页面写好脚本, 直接开压, 然后在监控器一张张截图写个测试报告, 虽然Jmeter启动窗口已经提示GUI模式只用来写脚本和Debug
因团队需求, 最近要定义一个标准的压测流程, 而压测模式改为了CLI模式, 报告的生成就要再出一套解决方案
graph LR
jmx脚本文件--Jmeter运行测试-->生成包含测试结果数据的jtl文件--Jmeter命令生成报告-->html文件
user.properties--配置报告图表-->html文件
report-template--定义报告模板-->html文件
user.properties和reprot-template均在 Jmeter文件夹bin目录下
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官方wiki快速解读
Jmeter默认模板报告分为3个部分
Dashboard
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文件保存测试结果再形成测试图表
环境准备
压测前准备
压测后Jmeter查看
本代码主要实现 PerMon Metrics Collector导出文件解析为html格式图表,方便与官方报告做集成
# -*- 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")
效果示意