当前位置: 首页 > news >正文

Easy-Jmeter: 性能测试平台

目录

  • 写在开始
  • 1 系统架构
  • 2 表结构设计
  • 3 测试平台生命周期
  • 4 分布式压测
  • 5 压力机管理
  • 6 用例管理
    • 6.1 新增、编辑用例
    • 6.2 调试用例
    • 6.3 启动测试
    • 6.4 动态控量
    • 6.5 测试详情
    • 6.6 环节日志
    • 6.7 实时数据
    • 6.8 测试结果
  • 7 测试记录
  • 7 用例分析
  • 8 系统部署
    • 8.1普通部署
    • 8.2容器化部署
  • 写在最后

写在开始

    在经历了一段相对较长的时间后,在最近我完成了性能测试平台初版的所有功能,这是我在跨越近一年时间中的最大收获。最初有看到网上有个人或团队开发的性能测试平台,就在想如果要实现这么一个工具,这个工具应该是什么样子,应该怎样去做。那时我个人写的接口自动化测试平台已经在公司小范围的使用,同时在不断的优化功能,便暂时将其保留为一个想法。在去年打算将这个想法变为现实,便一点一点的摸索与思考,一点一点的将其实现。由于只是利用业余时间,并且这个过程遇到不少困难,这个系统的实现跨越了较长的时间。相比较之前实现的接口自动化测试平台,这次在做性能测试平台时一个比较大的进步是在开始写代码前,设计阶段准备的充分很多,这次做了完整的原型,不再是一边写一边设计新页面。
    开源工具在功能和专业性上已经足够好了,为什么还要做平台化,平台化的意义是什么呢?我认为工具平台化的好处有以下几点:1.方便团队协作和数据整合:开源工具大多是C/S架构的,不利于团队之间共享和交互,也无法归集和整合历史数据;2.定制化功能:平台化在开源工具的基础上可以结合业务实现自定义功能,与外部系统对接,使得测试变得更加灵活和方便;3.降低成本:界面化比原有系统会操作相对简单,降低了压测环境的维护成本、操作成本和管理成本;4.个人提升:提升个人在代码、性能测试方面的深度。
    目前有非常多的开源性能测试工具,它们的功能都非常完备和成熟,所以在最开始,设计的理念就是在压测功能上尽可能的复用成熟工具的功能。jmeter作为一个开源的性能测试工具,在业内具有权威性的地位,所以这个性能测试平台基于jmeter进行开发。技术栈使用vue+springboot前后端分离,基础的业务框架使用开源的Lin-CMS管理系统,其提供用户、权限、认证等基础功能。数据库使用mysql5.7、mongodb4.2、influxdb1.8,文件存储使用minio文件服务器。实现了用例与测试数据管理、分布式压力测试、实时压测数据查看、测试结果查看与下载、历史测试数据查询和测试结果分析等功能。

源码地址:https://github.com/guojiaxing1995/easy-jmeter
原型地址:https://modao.cc/app/Qf56LAncrokbxs3iOBMRap

EasyJmeter性能测试平台

1 系统架构

系统架构
用户访问web页面,再由页面通过http请求访问业务后端服务。每台压力机服务器(只支持linux)上有且仅有一个jmeter,同时安装一个agent来控制jmeter运行,agent和服务端使用socketio实时通讯,用于服务端下发指令和agent上报状态。业务数据使用mysql进行存储,测试结果的详细数据使用mongodb存储,压测过程中的热数据使用influxdb存储,测试用例脚本、压测数据文件和压测结果文件(日志、jtl、报告)使用minio文件服务器存储。

2 表结构设计

mysql中除去原本CMS框架系统自带的表,测试平台业务表有6张

表名描述
project工程表,管理测试用例的单位
machine压力机表,管理压力机
file文件表
case用例表
task记录表,记录一次压测执行
task_log记录日志表

mongodb中业务集合有2个

集合名描述
reportjmeter报告数据
statistics单个用例的历史整合数据

3 测试平台生命周期

在这里插入图片描述

平台化对压测进行管理,就要定义一次性能测试的各个阶段,这些阶段组成了压测平台的生命周期。生命周期包含了四个阶段,分别是配置、运行、收集和清理。配置阶段主要为将测试所需的数据如jmx脚本、csv文件、扩展jar文件从minio下载到各个压力机,将需要切分的csv文件进行切分,切分就是将一个csv文件内的数据按照压力机的个数分为多份,最后配置脚本和配置文件等参数。配置成功后agent向服务端报告状态,待所有压力机配置完成服务端下发运行指令,进入压测状态,压测状态为jmeter持续运行中并收集测试数据。所有压力机运行完成上报后统一进入收集状态,上传测试结果文件并对结果进行处理并归集。所有压力机都完成收集后进入清理状态,每台压力机重置测试环境。在这一系列阶段中,平台不能丢失对各个阶段的管理,系统在当前阶段出现问题后要可以闭环,所以前三个阶段失败后都会进入清理阶段。同时可以手动的停止前三个阶段,终止压力测试。

4 分布式压测

jmeter本身是支持分布式压测的,但存在一些缺陷,如需要不少额外配置,master节点不参与压测浪费资源,测试数据实时回传master浪费带宽。压测平台本身就已经实现通过agent控制jmeter,agent和服务端通过长连接进行实时通信,在此基础上,由服务端控制各个压力机运行,平台就实现了对于压力机的分布式调度。

5 压力机管理

压力机管理
一台压力机上部署一个agent服务和jmeter,jmeter需要将其安装路径设置为环境变量JMETER_HOME,agent根据环境变量定位jmeter,每分钟判断一次jmeter是否可用并上报ip、版本、路径给服务端,和服务端维护的ip地址匹配作为压力机是否在线的依据,匹配一致的压力机会更新jmeter的版本和安装路径。

6 用例管理

用例列表
用例管理可以新增、编辑、查询、调试、删除用例,可以对目标用例进行启动测试、终止测试、查看测试详情、动态控制TPS和跳转用例的历史记录列表。

6.1 新增、编辑用例

编辑用例

用例新增、编辑时填写用例名称、选择项目,项目为当前系统维护,用来进行用例分类。
上传保存好的jmx文件、csv文件、jar文件,csv文件可选是否切分。

6.2 调试用例

在列表页面点击调试按钮,可以打开调试弹框,点击启动对当前用例以一个线程发起一次请求.如查看结果树一样,可以查看接口的响应和请求信息。
在这里插入图片描述
点击引擎日志,可以查看对应请求的jmeter日志
在这里插入图片描述

6.3 启动测试

在这里插入图片描述

在列表点击启动按钮弹出测试启动弹框,选择运行的并发线程数、压测时间、启动线程的时间、容量控制,容量控制会在下文详细展开。压力机可以选择个数或指定某几台压力机。日志等级为jmeter日志等级。报告时间颗粒度为jmeter生成报告图表的时间采样频率,默认0为系统内置采样率,为0时系统会根据压测时间来设置采样间隔。实时数据展示开关控制本次测试是否记录实时数据并展示。
在测试过程中可以通过列表或详情的进度条查看当前的状态,运行状态的测试可以查看已运行时间的百分比。

6.4 动态控量

这里的动态控量是指吞吐量的限制与动态调节。这个高阶知识点最早是在其他文章中看到的。
在压测时,“控量”是非常重要的,JMeter 是根据线程数大小来控制压力强弱的,但我们制定的压测目标中的指标往往是吞吐量(QPS/TPS),这就给测试人员带来了不便之处,必须一边调整线程数,一边观察QPS/TPS 达到什么量级了。为了解决这个问题,JMeter 提供了吞吐量控制器的插件,我们可以通过设定吞吐量上限来限制 QPS/TPS,达到控量的效果。
在这里插入图片描述
上面的做法能够确保将吞吐量控制在一个固定值上,但这样还远远不够,实际工作中我们希望在每次压测执行时能够随时调节吞吐量,比如,在某个压力下服务容量没有问题,我们希望在不停止压测的情况下,再加一些压力。方案就是将目标吞吐量设置为变量,在测试过程中调整这个值。
在这里插入图片描述
修改jmeter.properties参数

#---------------------------------------------------------------------------
# BeanShell configuration
#---------------------------------------------------------------------------# BeanShell Server properties
#
# Define the port number as non-zero to start the http server on that port
beanshell.server.port=9000
# The telnet server will be started on the next port# Define the server initialisation file
beanshell.server.file=../extras/startup.bsh

执行测试过程中,通过外部命令访问BeanShell服务就能植入我们的BeanShell脚本和全局变量

java -jar <jmeter_path>/lib/bshclient.jar localhost 9000 update.bsh <参数>

自定义的吞吐量更新脚本update.bsh如下:

import org.apache.jmeter.util.JMeterUtils;getprop(p){ // get a JMeter propertyreturn JMeterUtils.getPropDefault(p,"");
}setprop(p,v){ // set a JMeter propertyprint("Setting property '"+p+"' to '"+v+"'.");JMeterUtils.getJMeterProperties().setProperty(p, v);
}
setprop("throughput", args[0]);

在平台中可以通过页面修改吞吐量限制
在这里插入图片描述

6.5 测试详情

在这里插入图片描述
点击用例进入目标用例最近一次测试的详情页面,进行中的用例会展示测试进度。顶部显示用例的基础信息,下方显示测试情况,有并发线程数、压测时长、测试人员、压测开始结束时间、压力机台数,可以下载jmeter日志、测试脚本文件。测试完成后会显示聚合报告。

6.6 环节日志

在这里插入图片描述

测试时实时展示测试阶段每一个环节的进度以及对应环节下每一台压力机的环节结果。更好的管理生产周期状态和排查问题。

6.7 实时数据

在这里插入图片描述
在这里插入图片描述

jmeter支持 Backend Listener 将测试结果实时发往 InfluxDB,平台向 InfluxDB 轮询查询数据,并展示在页面上。目前展示了总TPS、总错误趋势、错误事务统计,以及指定事务筛选,查看对应事务TPS、错误趋势和错误类型分类。除此以外,也可以集成开源数据可视化系统Grafana,进行更加丰富的数据展示。

6.8 测试结果

图表报告1
在这里插入图片描述
在这里插入图片描述
在测试完成后,可以查看测试图表信息,包含TPS、平均响应时间、总TPS、随时间变化的响应时间百分位数(成功响应)、活动线程数共5个图表,以及错误类型占比和错误排行榜top5。点击右上角报告下载按钮,下载jmeter测试报告可查看更多详细数据。

7 测试记录

在这里插入图片描述
测试记录模块可以查看所有的测试记录,支持按照测试编号、用例名称、测试时间、测试结果进行查询。点击详情跳转对应记录的测试详情页,

7 用例分析

在这里插入图片描述
顶部可查看系统数据,包含项目数、用例数、压力机数、测试次数、压测总时长以及总请求数。
左侧为用例列表,支持查看指定用例的平均响应时间、90th响应时间、平均吞吐量、测试次数、压测时长和请求数。支持查看多次测试的响应时间趋势、吞吐量和错误率,可以帮助测试与开发人员在系统优化后,一目了然的查看优化情况。

8 系统部署

8.1普通部署

  1. 安装mysql5.7数据库
  2. 安装mongodb4.2数据库
  3. 安装influxdb1.8数据库
  4. 安装minio文件服务器,设置指定bucket的Access Policy为public
  5. 部署server、agent。代码结构中api目录下为后端目录,后端使用springboot,修改配置文件并打包。其中作为server启动时设置socket.server.enable为true,作为agent启动时设置socket.client.enable为true,agent需要设置服务端socketio地址serverUrl。agent所在压力机需要配置jmete安装路径作为环境变量JMETER_HOME.
  6. 前端服务打包。代码结构中web目录下为前端服务,前端使用vue,node版本v12.13.0,打包命令 npm run build。
  7. 安装nginx。将web目录下default.conf按照实际情况修改,将前端包和配置文件放入nginx指定目录下启动。

8.2容器化部署

  1. 构建后端jar包,代码结构中api目录下为后端目录,后端框架springboot,maven构建命令,mvn clean package
  2. 构建前端dist包,前端使用vue,node版本v12.13.0,打包命令 npm run build
  3. 编辑项目根目录下docker-compose.yaml 文件,修改environment中的minio地址和influxdb地址为实际地址,修改volumes中宿主机jmeter地址为实际地址。项目根目录下执行docker-compose up -d构建镜像并启动。

写在最后

    对于测试工具或其他效能工具,我认为它最重要的就是要好用,这一点涉及到页面交互、功能设计等放放面面。之前做的接口自动化测试平台,有的同事认为可以方便的实现接口的测试,但也有同事认为在使用上还不够友好,我也持续进行了优化,并增加了一些功能,最终还算满意。但后期不管怎样去改,它的基本功能结构在一开始就已经定了,所以设计阶段的工作尤其重要,这次在设计上投入了不少时间。但很多事情并不能等完全想明白再去做,因为有时候事情存在难度、在遇到困难时是没有办法完全理清的,遇到这种时候,就在尽可能准备充分后下手去做,迈开第一步。
    测试平台已经具备了基本的性能测试功能。目前只进行了初步的使用,在后续结合实际业务使用中,我会不断进行功能优化。如果有好的想法和建议,欢迎随时沟通。

相关文章:

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…...

Unity3D Lua与C#的相互调用与性能剖析详解

前言 在游戏开发中&#xff0c;经常会遇到Lua与C#之间的相互调用的情况。本文将详细介绍Unity3D中Lua与C#的相互调用的方式&#xff0c;并对其性能进行剖析。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01…...

鸿蒙开发路由跳转踩坑

文章目录 前言常见路由不能跳转问题总结 一、前言 02-25 10:40:10.799 42182-2075594 E C03900/Ace: [manifest_router.cpp(GetPagePath)-(0)] [Engine Log] cant find this page pages 02-25 10:40:10.799 42182-2075594 E C03900/Ace: [page_router_manager.cpp(StartPush…...

SpringBoot 3 新特性

目录 1. GraalVM1.1 生成本地可执行应用1.2 生成docker镜像 2. 支持虚拟线程3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件&#xff0c;可以显著提升启动速度、峰值性能以及减少内存应用。传统的应用都是编译成字节码&#xff0c;…...

Day02:Web架构前后端分离站Docker容器站集成软件站建站分配

目录 常规化站点部署 站库分离 前后端分离 集成软件搭建Web应用 Docker容器搭建Web应用 建立分配站 静态 与 伪静态 总结 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗…...

链表和顺序表的优劣分析及其时间、空间复杂度分析

链表和顺序表的优劣分析及其时间、空间复杂度分析 一、链表和顺序表的优劣分析二、算法复杂度<font face "楷体" size 5 color blue>//上面算法的执行次数大致为&#xff1a;F&#xff08;N&#xff09; N^22*N10;   N 10,F(10) 1002010 130次   N 1…...

QQ防红跳转短网址生成网站完整源码

使用此源码可以生成QQ自动跳转到浏览器的短链接&#xff0c;无视QQ报毒&#xff0c;任意网址均可生成。 全新界面&#xff0c;网站背景图采用Bing随机壁纸 支持生成多种短链接 兼容电脑和手机页面 生成网址记录功能&#xff0c;域名黑名单功能 网站后台可管理数据 安装说明&am…...

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…...

【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据

【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据 1. 问题描述2. 解决方案&#xff08;binlog&#xff09;2.1 构造测试环境2.2 查看 MySQL 环境是否开启 binlog2.3 查看所有的 binlog 日志记录2.4 查看当前正在使用的是哪一个 binlog 文件2.5 查看此时的 binlo…...

天翼云登录参数JavaSrcipt逆向

天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …...

AI与大数据:智慧城市安全的护航者与变革引擎

一、引言 在数字化浪潮的席卷下&#xff0c;智慧城市正成为现代城市发展的新方向。作为城市的神经系统&#xff0c;AI与大数据的融合与应用为城市的安全与应急响应带来了革命性的变革。它们如同城市的“智慧之眼”和“聪明之脑”&#xff0c;不仅为城市管理者提供了强大的决策…...

adb pull 使用

adb pull 是 Android Debug Bridge (ADB) 工具提供的一个命令&#xff0c;用于将设备上的文件拷贝到计算机上。通过 adb pull 命令&#xff0c;实现从 Android 设备上获取文件并保存到本地计算机上。 使用 adb pull 命令的基本语法如下&#xff1a; adb pull <设备路径>…...

算法【线性表的查找-顺序查找】

线性表的查找-顺序查找 顺序查找基本思想应用范围顺序表的表示数据元素类型定义查找算法示例分析 时间效率分析顺序查找的特点如何提高查找效率 顺序查找 基本思想 在表的多种结构定义方式中&#xff0c;线性表是最简单的一种。而顺序查找是线性表查找中最简单的一种。 顺序查…...

力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列 文章目录 题目描述思路复杂度Code 题目描述 思路 我们统一标记&#xff1a;str1[i]代表text1表示的字符数组&#xff0c;str2[j]代表text2表示的字符数组&#xff1b;LCS代表最长的公共子序列&#xff1b;&#xff08;我们易得只有str1[i]和str…...

如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…...

C语言文件知识点

一.解释一些问题 1.标准输入文件&#xff08;sdtin&#xff09;&#xff0c;通常对应终端的键盘。 2.标准输出文件&#xff08;stdout&#xff09;和标准错误输出文件&#xff08;stderr&#xff09;&#xff0c;这两个文件 都对应终端的屏幕。 &#xff08;解释&#xff1a…...

C语言:数组指针 函数指针

C语言&#xff1a;数组指针 & 函数指针 数组指针数组名 数组访问二维数组 函数指针函数指针使用回调函数 typedef关键字 数组指针 数组本质上也是一个变量&#xff0c;那么数组也有自己的地址&#xff0c;指向整个数组的指针&#xff0c;就叫做数组指针。 我先为大家展示…...

全面介绍HTML的语法!轻松写出网页

文章目录 heading(标题)paragraph(段落)link(超链接)imagemap(映射)table(表格)list(列表)layout(分块)form(表单)更多输入:datalistautocompleteautofocusmultiplenovalidatepatternplaceholderrequired head(首部)titlebaselinkstylemetascriptnoscript iframe HTML&#xff…...

数学建模【相关性模型】

一、相关性模型简介 相关性模型并不是指一个具体的模型&#xff0c;而是一类模型&#xff0c;这一类模型用来判断变量之间是否具有相关性。一般来说&#xff0c;分析两个变量之间是否具有相关性&#xff0c;我们根据数据服从的分布和数据所具有的特点选择使用pearson&#xff…...

「优选算法刷题」:字母异位词分组

一、题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "na…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...