Java开源工具库使用之压测JMeter

news2024/11/18 0:45:53

文章目录

  • 前言
  • 一、概念原理
    • 1.1 Jmeter 原理
    • 1.2 性能测试术语
    • 1.3 web项目性能标准
  • 二、常用元件
    • 2.1 线程组
    • 2.2 取样器
    • 2.3 控制器
    • 2.4 定时器
    • 2.5 前置/后置处理器
    • 2.6 配置元件
    • 2.7 监听器
  • 三、插件
    • 3.1 第三方插件
    • 3.2 录制插件
  • 四、JSR223 脚本及函数
    • 4.1 JSR223 脚本
    • 4.2 函数变量
  • 五、实际案例
    • 5.1 登录压测
    • 5.2 数据库压测
  • 参考

前言

Apache JMeter 是一款开源的 Java 应用程序,用于对软件进行性能测试。它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器等。

​ JMeter 提供了图形化用户界面,使得测试人员可以轻松地创建和运行测试计划,并查看测试结果。JMeter 还可以模拟多种负载类型,包括静态和动态资源,如文件、图片、视频、数据库等。

官方文档地址:https://jmeter.apache.org/usermanual/

github 地址:https://github.com/apache/jmeter

一、概念原理

1.1 Jmeter 原理

Jmeter 的基本原理是通过建立一个线程池,多线程运行取样器模拟用户请求,通过断言验证结果正确性,最后通过监听器来记录测试结果。

ROUTE

  • X1-X5 这些组件用于模拟用户操作
  • Y1 负责模拟用户请求, Y2 负责验证结果正确
  • Z 负责结果的收集

执行总体顺序为:

  1. 配置元件
  2. 前置处理器
  3. 定时器
  4. 取样器
  5. 后置处理器
  6. 断言
  7. 监听器

如果添加了控制器,执行顺序还和控制器及作用域有关

1.2 性能测试术语

术语含义备注
压测是一种测试方法,用于测试系统在高负载下的性能通过模拟大量用户访问系统,可以测试系统在高负载下的稳定性、可靠性和响应时间等指标。
并发数一般说,指并发用户数。系统同时处理请求的用户数量。此外还有并发连接数,每个用户可能会打开多个连接,因此并发连接数可能会大于并发用户数。
吞吐量系统在单位时间内处理的请求数量
QPSQueries Per Second,每秒查询数
TPSTransactions Per Second,每秒处理的事务数对单接口而言,TPS可以认为是等价于QPS的,比如访问一个页面/index.html,是一个TPS,而访问/index.html页面可能请求了3次服务器比如css、js、index接口,产生了3个QPS。
RTResponse Time,代表从客户端发起请求到服务端接受到请求并响应所有数据的时间差一般取平均响应时间。
PVPage View,即页面浏览量,是指网站或应用程序在一定时间内被访问的数量

1.3 web项目性能标准

下面是通用互联网服务端性能判断标准

维度不通过通过
超时概率> 0.5‰<0.5‰
错误概率> 0.5‰<0.5‰
TPS< 期望高峰值> 期望高峰值
CPU利用率> 75%<75%
响应事件> 大于期望时间< 期望时间
Load平均每核CPU 的Load > 1平均每核CPU 的Load < 1
JVM 内存使用率> 75%< 75%
Full GC 频率平均 < 0.5h1次平均 > 0.5h1次

二、常用元件

JMeter 常用元件的如下所示:

  1. 线程组:用于模拟用户并发访问系统的情况,可以设置线程数、循环次数等参数。
  2. 取样器:Jmeter 中实际访问系统的组件,属于线程组内部
  3. 控制器:用于控制测试计划中各个元素的执行顺序和循环次数。
  4. 定时器:用来模拟用户在执行测试计划时的行为,例如,等待一段时间后再执行下一个请求。
  5. 前置/后置处理器:在执行测试计划时模拟用户的行为。前置处理器可以在发出“取样器请求”之前执行一些操作,例如修改取样器请求的设置或更新未从响应文本中提取的变量。后置处理器可以在取样器请求之后执行一些操作,例如提取响应文本中的变量或将响应数据写入文件。
  6. 配置元件:与取样器密切相关,可添加或修改请求
  7. 监听器:用于收集和显示测试结果,如响应时间、响应代码、响应消息等。

元件中不了解的选项可通过菜单栏的中 Help 访问互联网进行文档查询

2.1 线程组

jmeter_01_thread_group

下面是一些参数配置项解释:

  • Ramp-Up时间

    JMeter需要多长时间才能启动所有线程。如果有10个线程,Ramp-Up时间为100秒,那么每个线程将在前一个线程开始后10秒内开始,总时间为100秒(第一个线程总是直接启动),以使测试完全达到速度。

  • 延迟创建线程直到需要

    如果打钩,则仅在经过了提升时间的适当比例时才会创建线程。这最适合于具有提升时间比执行单个线程的时间要长得多的测试。即,早期的线程在后面的线程开始之前结束。 如果未选择,则会在测试开始时创建所有线程(然后它们将暂停以获取提升时间的适当比例)。

  • 调度器(Duration)

    如果打钩,则可以进行配置,选择一个相对的结束时间。JMeter将使用它来计算结束时间。

2.2 取样器

每个取样器生成一个或多个样本结果,结果中具有各种属性(成功/失败、经过的时间、数据大小等),并且可以在不同的 Listener 观看。Jmeter 提供很多种取样器:如下所示

jmeter_02_sampler

最常见的就是 Http 请求

jmeter_03_sampler_http

  • 协议

    可选 HTTP, HTTPS , FILE

  • 内容编码

    使用的内容编码(用于POST、PUT、PATCH和FILE)。这是要使用的字符编码,并且与HTTP头部的 Content-Encoding 无关。

  • 与浏览器兼容的头

    当使用 multipart/form-data 时,这样会抑制HTTP头部的 Content-Type和Content-Transfer-Encoding,只发送Content-Disposition。

  • 编码?

    对url中的特殊字符进行编码

  • 包含等于?

    当传递键值时,当值是空字符串时,一些应用程序不期望有等号

2.3 控制器

当处理更复杂的测试流程时,需要类似 编程语言中的if/for 控制顺序和循环次数那样,对整体测试流程进行把控,jmeter提供了很多控制器,方便测试各种场景,如下所示:

jmeter_04_controller

常用的控制器有:

  • IF 控制器
  • 仅一次控制器 登录场景常用
  • 循环 控制器
  • 随机控制器

2.4 定时器

Jmeter 请求之间是没有延时的,但实际工作有时候需要增加固定时间来测试,还有有时也需要让线程在某个时间点同时执行,那么就可以用到定时器功能

jmeter_05_timer

2.5 前置/后置处理器

jmeter_07_pre

  • 前置处理器在取样器请求之前执行一些操作,后置取样器在之后进行操作。

  • 前置处理器在HTTP请求常见的场景有:为每个线程分配一个不同的用户id。

  • 后处理器最常用于处理响应数据。

2.6 配置元件

配置元件(Config Element)提供对静态数据配置的支持,可以为取样器设置默认值和变量。

jmeter_08_config_element

像web浏览器一样存储和发送Cookie。如果有一个HTTP请求和相应里包含Cookie,Cookie管理器会自动存储Cookie,那么接下来针对特定web站点的所有请求中使用该Cookie。可在结果树中查看。

2.7 监听器

监听器是用于对结果进行监听,还可以查看、保存和读取已保存的测试结果。

jmeter_06_listener

下面以聚合报告为例,显示表格中的属性

属性名含义
Label样本标签名,取样器是Http请求就是 Http请求名
Samples具有相同标签的样品数量,取样器是http请求 就是发送请求的数量
Average请求的响应时间,平均值
Median响应时间从小排到大,处于50%位置,50 % 的样本花费不超过这个时间;剩下的至少花了同样的时间。
90% Line处于 90% 位置
95% Line处于 95% 位置
99% Line处于 99% 位置
Min最小值
Max最大值
Error %请求错误率
Throught吞吐量
Received KB/sec从服务端接收的数据速率 KB/s
Sent KB/sec发送到服务端的数据速率,KB/s

三、插件

3.1 第三方插件

Jmeter 作为一个开源插件,在某些功能上比不过商业软件LoadRunner,但是有增加插件功能,可以根据自己所需安装想要的插件。

  • 插件网站:https://jmeter-plugins.org/wiki/Start/

jmeter_09_jmeter_plugin

3.2 录制插件

badboy 是一款用C++开发的测试工具,被设计用于测试和开发复杂的动态应用, 但是已经很久未更新了。

用过jmeter的人都知道,jmeter测试简单点的静态页面还成,脚本制作也就三两步就搞定了。但是要是制作复杂点的测试脚步就非常困难了,比如登录系统输入用户名和密码,什么函数、参数配置之类的,肯定会把你搞晕。而且网上 jmeter 相关复杂点的案例也非常少,它本身提供的帮助文档也只有一个很简单的例子,用处不大。有了badboy就不一样了,它可以提供像 loadrouner 一样的录屏功能,不需要你自己去配置什么协议、参数、cookie manager之类的,只要你把你的测试过程录制出来,然后save as jmeter 脚本格式就ok了

官网不能访问了,网上找到一个 badboy安装包:链接: https://pan.baidu.com/s/1Ae3tLuP3q7301SzyXDGw2A 提取码: jcg5

四、JSR223 脚本及函数

4.1 JSR223 脚本

jsr233 是 java 对脚本语言的支持规范,jmeter 支持脚本语言

  • BeanShell

    • 一个小型的、免费的、可嵌入使用Java编写的具有对象脚本语言特性的Java源码解释器。

    • github地址:https://github.com/beanshell/beanshell

  • groovy

    • 一种基于JVM的敏捷开发语言,它结合了Python、Ruby和Smalltalk]的许多强大的特性
  • javascript

4.2 函数变量

JMeter函数是一种特殊的值,它可以填充测试中任何取样器或其他元素的字段,语法如下所示:

${__functionName(var1,var2,var3)}

JMeter 变量引用语法如下所示:

${VARIABLE}

文档:https://jmeter.apache.org/usermanual/functions.html

五、实际案例

5.1 登录压测

准备100个用户登录,对登录接口进行压测,测试项目用的是开源项目: 微人事。

下面是个生成用户的存储过程:

DELIMITER $$
CREATE PROCEDURE generate_sql()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 99 DO
        SET @sql = CONCAT("INSERT INTO `vhr`.`hr` (`name`, `phone`, `telephone`, `address`, `enabled`, `username`, `password`, `userface`, `remark`) VALUES ('系统管理员', '18568887789', '029-82881234', '深圳南山', '1', 'admin", LPAD(i, 3, '0'), "', '$2a$10$ySG2lkvjFHY5O0./CPIE1OI8VJsuKYEzOYzqIa7AJR6sEgSzUFOAm', 'http://bpic.588ku.com/element_pic/01/40/00/64573ce2edc0728.jpg', NULL);");
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;
call generate_sql

准备user.csv,修改代码中去掉验证码部分,最终测试吞吐量为50每秒

jmeter_10_example_login

5.2 数据库压测

对数据库进行压测,先要配置好JDBC 连接池,需要把驱动jar包到加入到lib目录下,重启 Jmeter,进行压测

jmeter_11_database_stress_test

参考

  1. https://github.com/aliesbelik/awesome-jmeter
  2. 全栈性能测试修炼宝典Jmeter实战
  3. 两个非常好用的测试工具jmeter和badboy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场难题:克服压力、提升自我能力,勇闯职场巅峰

在当今激烈的职场竞争中&#xff0c;职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这些问题都是需要克服的问题。作为一名在职场中求生存&#xff0c;求发展的职业人士&#xff0c;我们必须学会适应这些挑战&#xff0c;掌…

Java基础面试题突击系列1

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

面了个 Java 实习生,小伙很优秀!

大家好&#xff0c;我是鱼皮&#xff0c;前几天给自己的公司面试了一位 Java 暑期实习生&#xff0c;候选人目前是大三。 整个过程我都录屏了&#xff0c;并且在征得候选人的同意后&#xff0c;把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考…

强化学习代码规划之深度学习预备

现在到了自动编码器和解码器&#xff0c;同样&#xff0c;先练几遍代码&#xff0c;再去理解 import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matpl…

文心一言和ChatGPT最全对比

文心一言和ChatGPT都是基于深度学习技术的自然语言处理模型&#xff0c;有各自的优势和使用场景&#xff0c;无法简单地比较 ChatGPT 和文心一言哪一个功能更强大&#xff0c;它们各自具有优势和局限性&#xff0c;需要根据具体需求进行选择&#xff0c;以下一些具体对比&#…

HttpRunner 接口自动化测试进阶

这里我们介绍一下通过调试源码的方式来做接口测试&#xff1a; 1、获取源码 github下载或pycharm的git checkout功能去获取&#xff0c;这里直接下载 通过ide打开解压后的源码包 源码包含三层目录结构&#xff1a;docs帮助文档、httprunner核心库、tests自测文件 2、源码结…

小白量化《穿云箭集群量化》(8) 实盘核聚变氢弹策略

小白量化《穿云箭集群量化》&#xff08;8&#xff09; 核聚变策略 上一篇介绍了超级订单SuperOrder功能在股票上买入策略&#xff0c;这篇介绍MetaTrader5期货外汇的双向交易策略。 交易策略比较有名的是马丁策略&#xff0c;马丁策略是单向策略。 我们设计了双向策略原子弹策…

新来的实习生太牛了,还是我们太弱了?...

前几天有个朋友向我哭诉&#xff0c;说她在公司工作&#xff08;软件测试&#xff09;了7年了&#xff0c;却被一个实习生代替了&#xff0c;该何去何从&#xff1f; 这是一个值得深思的问题&#xff0c;作为职场人员&#xff0c;我们确实该思考&#xff0c;我们的工作会被实习…

Qt布局管理器

一、布局管理器 1.1、布局管理器的作用 布局管理器是摆放控件的辅助工具&#xff0c;主要解决组件的位置和大小无法自适应父窗口变化的问题&#xff0c;主要功能如下&#xff1a; 自动调整控件的位置&#xff0c;包括控件之间的间距、对齐等当用户调整窗口大小时&#xff0c;位…

【洛谷】P1404 平均数

【洛谷】P1404 平均数 题目描述 给一个长度为 n n n 的数列&#xff0c;我们需要找出该数列的一个子串&#xff0c;使得子串平均数最大化&#xff0c;并且子串长度 ≥ m \ge m ≥m。 输入格式 第一行两个整数 n n n 和 m m m。 接下来 n n n 行&#xff0c;每行一个整数 …

激光点云3D目标检测算法之CenterPoint

激光点云3D目标检测算法之CenterPoint 本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 前言 CenterPoint是CVPR 2021的论文《Center-based 3D Object Detection and Tracking》中提出的一个激光点云3D目标检测与跟踪算法框架&#xff0c;与以往算法不同的是&#xff…

一大波特斯拉人形机器人上线,马斯克震撼官宣2款新车!

来源 | 新智源 ID | AI-era 【导读】这次特斯拉股东日&#xff0c;虽没有新车&#xff0c;但马斯克确定Cybertruck今年一定会来。 特斯拉股东日&#xff0c;依旧没有新车。 万众瞩目的马斯克登台继续画饼&#xff0c;「我不官宣新车&#xff0c;不过新车年销量会超过500万」…

【云原生】k8sPod基础概念

k8sPod基础概念 一、Pod概述1、pod概念2、Pod资源限制 二、Pod的两种使用方式三、资源共享1、创建Pod的方式2、Pod功能 四、底层容器Pause1、Pause共享资源2、Pause主要功能3、Pod与Pause结构设计用意 五、镜像的拉取策略1、Pod容器镜像拉取策略2、Pod重启策略 六、容器的分类1…

信息收集-ip地址

1、cdn网络 CDN&#xff08;Content Delivery Network&#xff09;网络是一种分布式网络架构。它通过将内容&#xff08;如网页、图片、视频等&#xff09;缓存到公共的服务器上&#xff0c;以便更快速、更可靠地交付给用户所在的位置。CDN解决了Internet中的一些固有瓶颈和性…

【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill)

0、版本说明 Ubuntu22.04对应的ROS2的版本为Humble Hawksbill&#xff08;ros-humble&#xff09; 如果不是在Ubuntu22.04中安装ROS&#xff0c;请参考下面Ubuntu和ROS的版本对应关系 1、更新apt包列表 $ sudo apt update2、设置编码 将ubuntu环境语言编码设置为en_US en_…

appium自动化测试实战详解及框架搭建

目录 一、Appium的介绍 二、Appium实战&#xff08;以真机为例&#xff09; 一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;其支持iOS和安卓平台上的原生的&#xff0c;基于移动浏览器的&#xff0c;混合的应用。 1、 使用appium进行自动化测试的好…

【C++】容器篇(一)—— vector 的基本概述以及模拟实现

前言&#xff1a; 在之前&#xff0c;我们已经对 string类进行了基本的概述&#xff0c;并且手动的实现了string类中常用的接口函数。本期&#xff0c;我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类&#xff0c;本期的 vector 相对来说实现起…

CSAPP复习(三)

CH1: 但是如果问什么时候 得到二进制文件 那就是汇编的时候 CH2 sizeof 的返回值是一个无符号数 然后i-D自动默认是一个无符号数 无符号数不能出现负数 所以出现了一个循环 所以永远不可能循环完成。 CH7链接 什么是静态库&#xff1f;使用静态库的优点是什么&#xff1f; …

在windows内使用virtualbox搭建安卓x86--以及所遇到的问题解决--3

一.ARM兼容包的植入 1.下载arm包: 2.安装arm兼容包 3.验证arm兼容包是否移植成功 二.触屏无效 三.玩游戏卡顿严重 一.ARM兼容包的植入 在AndroidX86系统内大部分应用(国内)并没有适配X86架构&#xff0c;安装基于arm架构的应用会出现报错的情况&#xff0c;如遇到此问题可…

【Linux网络】Linux防火墙

Linux防火墙 一 、Linux包过滤防火墙概述1.1iptables概述1.2netfitel与iptables的关系1.3四表五链1.3.1 四表1.3.2五链1.3.3数据包到达防火墙时&#xff0c;规则表之间的优先顺序**1.3.4规则链之间的匹配顺序** 二、iptables的安装与配置方法2.1iptables的安装2.2iptables的配置…