前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >性能测试 -Jmeter压测报告生成

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

作者头像
打铁读书郎
发布2024-04-11 21:17:00
1510
发布2024-04-11 21:17:00
举报

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

本文主要讲述Jmeter使用CLI模式下压测报告的生成及定制

需求产生

S背景

目前对于小并发量的产品, 测试使用GUI模式进行压测是一个很普遍的状况. GUI页面写好脚本, 直接开压, 然后在监控器一张张截图写个测试报告, 虽然Jmeter启动窗口已经提示GUI模式只用来写脚本和Debug

因团队需求, 最近要定义一个标准的压测流程, 而压测模式改为了CLI模式, 报告的生成就要再出一套解决方案

T目标

  • Jmeter生成报告流程定义
  • Jmeter报告模板定制

Jmeter报告生成逻辑

代码语言:javascript
复制
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模式(命令行执行),可以提升负载的并发数

代码语言:javascript
复制
jmeter -n -t xxx.jmx

非GUI模式中, 可以使用-l生成jtl 文件, -e 生成html报告文件

代码语言:javascript
复制
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报告文件

代码语言:javascript
复制
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添加如下配置:

代码语言:javascript
复制
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数据中自定义添加数据

代码语言:javascript
复制
## 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随时间的变化图

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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

设定依据:

代码语言:javascript
复制
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.

图表标题修改

配置效果

测试报告中图表表头的按照你自定义的名称展示

配置方式

代码语言:javascript
复制
# 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报告生成命令

代码语言:javascript
复制
jmeter -g D:\xxx\Jmeter报告\report.jtl -o D:\xxx\Jmeter报告\cn_report

模板手动修改

通过对模板文件fmkr文件进行修改, 从而自定义报告模板

代码语言:javascript
复制
# 文件路径,分别对应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文件, 不需要配置导出属性
代码语言:javascript
复制
# -*- 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图表, 客户端及服务器测试信息都实现了图表化展示
  • 后续可通过前端工程师支持, 集成客户端,应用服务器, 数据库的性能测试结果
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 20230317_性能测试 -Jmeter压测报告生成
    • 需求产生
      • S背景
      • T目标
    • Jmeter报告生成逻辑
      • 报告生成
        • Jmater命令行
        • Jtl文件详解
        • Jmeter报告解读
      • 配置报告图表
        • 取样器过滤
        • 新增定制化图表
        • 宽容度设定
        • 图表标题修改
      • 定义报告模板
        • 报告汉化
        • 模板手动修改
      • 服务器监控数据
        • Jtl文件保存
        • 使用python解析
      • 结论
      相关产品与服务
      腾讯云服务器利旧
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档