性能测试 -Jmeter压测报告生成


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文件新增定制化信息, 后边会讲到~

默认模板html报告

配置报告图表

取样器过滤

配置效果

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文件保存

环境准备

  1. Jmeter插件中心安装PerMon Metrics Collector
  2. 压测服务器中防止Server-agent文件夹

压测前准备

  1. 服务器打开agent
  2. 脚本内监控器PerMon Metrics Collector设置输出filepath
  3. 执行压测,filepath自动生成服务器测试数据文档

压测后Jmeter查看

  1. 打开JmeterGUI页面, PerMon Metrics Collector浏览jtl文件,
  2. 右键可保存图片到本地

使用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 服务器监控


Author: Feny Lau
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Feny Lau !
  TOC