文章目录
- 前言
- 一、概念原理
- 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 的基本原理是通过建立一个线程池,多线程运行取样器模拟用户请求,通过断言验证结果正确性,最后通过监听器来记录测试结果。
- X1-X5 这些组件用于模拟用户操作
- Y1 负责模拟用户请求, Y2 负责验证结果正确
- Z 负责结果的收集
执行总体顺序为:
- 配置元件
- 前置处理器
- 定时器
- 取样器
- 后置处理器
- 断言
- 监听器
如果添加了控制器,执行顺序还和控制器及作用域有关
1.2 性能测试术语
术语 | 含义 | 备注 |
---|---|---|
压测 | 是一种测试方法,用于测试系统在高负载下的性能 | 通过模拟大量用户访问系统,可以测试系统在高负载下的稳定性、可靠性和响应时间等指标。 |
并发数 | 一般说,指并发用户数。系统同时处理请求的用户数量。 | 此外还有并发连接数,每个用户可能会打开多个连接,因此并发连接数可能会大于并发用户数。 |
吞吐量 | 系统在单位时间内处理的请求数量 | |
QPS | Queries Per Second,每秒查询数 | |
TPS | Transactions Per Second,每秒处理的事务数 | 对单接口而言,TPS可以认为是等价于QPS的,比如访问一个页面/index.html,是一个TPS,而访问/index.html页面可能请求了3次服务器比如css、js、index接口,产生了3个QPS。 |
RT | Response Time,代表从客户端发起请求到服务端接受到请求并响应所有数据的时间差 | 一般取平均响应时间。 |
PV | Page 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 常用元件的如下所示:
- 线程组:用于模拟用户并发访问系统的情况,可以设置线程数、循环次数等参数。
- 取样器:Jmeter 中实际访问系统的组件,属于线程组内部
- 控制器:用于控制测试计划中各个元素的执行顺序和循环次数。
- 定时器:用来模拟用户在执行测试计划时的行为,例如,等待一段时间后再执行下一个请求。
- 前置/后置处理器:在执行测试计划时模拟用户的行为。前置处理器可以在发出“取样器请求”之前执行一些操作,例如修改取样器请求的设置或更新未从响应文本中提取的变量。后置处理器可以在取样器请求之后执行一些操作,例如提取响应文本中的变量或将响应数据写入文件。
- 配置元件:与取样器密切相关,可添加或修改请求
- 监听器:用于收集和显示测试结果,如响应时间、响应代码、响应消息等。
元件中不了解的选项可通过菜单栏的中 Help 访问互联网进行文档查询
2.1 线程组
下面是一些参数配置项解释:
-
Ramp-Up时间
JMeter需要多长时间才能启动所有线程。如果有10个线程,Ramp-Up时间为100秒,那么每个线程将在前一个线程开始后10秒内开始,总时间为100秒(第一个线程总是直接启动),以使测试完全达到速度。
-
延迟创建线程直到需要
如果打钩,则仅在经过了提升时间的适当比例时才会创建线程。这最适合于具有提升时间比执行单个线程的时间要长得多的测试。即,早期的线程在后面的线程开始之前结束。 如果未选择,则会在测试开始时创建所有线程(然后它们将暂停以获取提升时间的适当比例)。
-
调度器(Duration)
如果打钩,则可以进行配置,选择一个相对的结束时间。JMeter将使用它来计算结束时间。
2.2 取样器
每个取样器生成一个或多个样本结果,结果中具有各种属性(成功/失败、经过的时间、数据大小等),并且可以在不同的 Listener 观看。Jmeter 提供很多种取样器:如下所示
最常见的就是 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提供了很多控制器,方便测试各种场景,如下所示:
常用的控制器有:
- IF 控制器
- 仅一次控制器 登录场景常用
- 循环 控制器
- 随机控制器
2.4 定时器
Jmeter 请求之间是没有延时的,但实际工作有时候需要增加固定时间来测试,还有有时也需要让线程在某个时间点同时执行,那么就可以用到定时器功能
2.5 前置/后置处理器
-
前置处理器在取样器请求之前执行一些操作,后置取样器在之后进行操作。
-
前置处理器在HTTP请求常见的场景有:为每个线程分配一个不同的用户id。
-
后处理器最常用于处理响应数据。
2.6 配置元件
配置元件(Config Element)提供对静态数据配置的支持,可以为取样器设置默认值和变量。
像web浏览器一样存储和发送Cookie。如果有一个HTTP请求和相应里包含Cookie,Cookie管理器会自动存储Cookie,那么接下来针对特定web站点的所有请求中使用该Cookie。可在结果树中查看。
2.7 监听器
监听器是用于对结果进行监听,还可以查看、保存和读取已保存的测试结果。
下面以聚合报告为例,显示表格中的属性
属性名 | 含义 |
---|---|
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/
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每秒
5.2 数据库压测
对数据库进行压测,先要配置好JDBC 连接池,需要把驱动jar包到加入到lib目录下,重启 Jmeter,进行压测
参考
- https://github.com/aliesbelik/awesome-jmeter
- 全栈性能测试修炼宝典Jmeter实战
- 两个非常好用的测试工具jmeter和badboy