测试工具jmeter使用

jmeter介绍

Apache JMeter™ 应用程序是开源软件,是一个 100% 纯 Java 应用程序,旨在负载测试功能行为和测量性能。 它最初设计用于测试 Web 应用程序,但后来扩展到其他测试功能。

Apache JMeter 可用于测试静态和动态资源、Web 动态应用程序的性能。
它可用于模拟服务器、服务器组、网络或对象上的重负载,以测试其强度或分析不同负载类型下的整体性能。
Apache JMeter 功能包括:

        1. 能够加载和性能测试许多不同的应用程序/服务器/协议类型:

              网络 - HTTP、HTTPS(Java、NodeJS、PHP、ASP.NET,...)
              SOAP/REST 网络服务
              FTP
              通过 JDBC 数据库
              LDAP
              通过 JMS 的面向消息的中间件 (MOM)
              邮件 - SMTP(S)、POP3(S) 和 IMAP(S)
              本机命令或 shell 脚本
              TCP
              Java 对象
        2. 功能齐全的测试 IDE,允许快速记录测试计划(来自浏览器或本机应用程序)、构建和调试。
        3. CLI 模式(命令行模式(以前​​称为非 GUI)/无头模式)从任何 Java 兼容的操作系统(Linux、Windows、Mac OSX 等)加载测试
        4. 完整且可随时呈现的动态 HTML 报告
        5. 通过从最流行的响应格式、HTML、JSON、XML 或任何文本格式中提取数据的能力轻松关联
        6. 完全的可移植性和 100% 的 Java 纯度。
7. 完整的多线程框架允许多线程并发采样和不同线程组同时采样不同功能。
8. 缓存和离线分析/重放测试结果。
9. 高度可扩展的核心:

        可插拔采样器允许无限的测试功能。
        可编写脚本的采样器(与 JSR223 兼容的语言,如 Groovy 和 BeanShell)
        可以使用可插拔计时器选择多个负载统计信息。
        数据分析和可视化插件允许极大的可扩展性和个性化。
        函数可用于为测试提供动态输入或提供数据操作。
        通过适用于 Maven、Gradle 和 Jenkins 的第 3 方开源库轻松实现持续集成。

jmeter优缺点及与loadrunner对比

jmeter(二) 优缺点_我的E家-CSDN博客_jmeter的优缺点

安装java环境

jmeter依赖java环境

地址:JDK 18 Early-Access Builds

arm环境

curl -OL https://download.java.net/java/early_access/jdk18/29/GPL/openjdk-18-ea+29_linux-aarch64_bin.tar.gz

x86环境

curl -OL https://download.java.net/java/early_access/jdk18/29/GPL/openjdk-18-ea+29_linux-x64_bin.tar.gz

解压

mkdir /home/java

tar -xf openjdk-18-ea+29_linux-aarch64_bin.tar.gz -C /home/java

设置环境变量

export JAVA_HOME=/home/java/jdk-18

运行jmeter

下载并解压

curl -OL https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.tgz

tar -xf apache-jmeter-5.4.3.tgz

cd apache-jmeter-5.4.3/bin/

运行

根据操作系统决定运行哪个文件,linux下运行jmeter,windows运行jmeter.bat,mac运行jmeter.sh

./jmeter

启动之后如下图所示

测试工具jmeter使用_第1张图片

jmeter使用

注意:使用jdk18时从本地打开.jmx文件会报如下错误

Uncaught Exception java.lang.IllegalAccessError: class com.github.weisj.darklaf.ui.filechooser.DarkFilePaneUIBridge$DetailsTableModel (in unnamed module @0x55a1c291) cannot access class sun.awt.shell.ShellFolder (in module java.desktop) because module java.desktop does not export sun.awt.shell to unnamed module @0x55a1c291 in thread Thread[AWT-EventQueue-0,6,main]. See log file for details.

解决方式为在jmeter文件中添加--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED

如果客户端只有x86的机器,建议使用jdk8,不会有上述错误

支持中文

测试工具jmeter使用_第2张图片

http请求

(1)添加线程组

测试工具jmeter使用_第3张图片

添加完成后有以下参数可自行设置:

  • users: 并发线程数
  • seconds: 启动全部线程所需的时间
  • loop Count: 循环次数,每个线程对每个接口发起的请求数

注意:客户端最大支持的线程数,一般为1000到2000,表示模拟的用户数,如果请求url有多个,则一个用户会发送多次请求

(2)添加http请求

测试工具jmeter使用_第4张图片

添加完成之后如下图所示,如果有一些通用的参数,比如server name or IP,也可以在上层比如线程组或plan层添加http默认值

测试工具jmeter使用_第5张图片

(4)添加header管理器,用于设置请求头,如果plan中所有请求都使用相同的请求头,则可以在plan上添加header管理器,或者在线程组上添加

测试工具jmeter使用_第6张图片

(5)添加断言,以下表示添加返回值断言

测试工具jmeter使用_第7张图片

有如下参数可设置,表示如果返回值中的以下某些内容不满足定义的断言会被认为是一次失败请求

测试工具jmeter使用_第8张图片

比如要求返回状态码必须为200

测试工具jmeter使用_第9张图片

(6)添加监听器,如下表示汇总报告,其他报告可自行测试

测试工具jmeter使用_第10张图片

(7)发送请求,运行图标运行,结果如下

测试工具jmeter使用_第11张图片

并不是所有的组件都要添加,如果没有则可以不添加,比如header,不加断言也是可以的。

手动一个一个添加url很麻烦,后面会用到使用blazemeter自动录制接口。

blazemeter安装

blazemeter介绍

是一个chrome浏览器插件,用于录制接口供jmeter使用,相比于上面一个一个添加接口,blazemeter可以在浏览器上通过鼠标点击的方式自动录制接口并保存为.jmx文件,然后在jmeter中打开即可

blazemeter下载

https://www.crxforchrome.com/crx/286/

curl -OL https://download1655.mediafire.com/mrzmzstds8ng/hiwpv4sie1kxang/mbopgmdnpcbohhpnfglgohlbhfongabi-4.25.0-CrxforChrome.com.crx

添加插件

拖动到chrome浏览器扩展程序,添加完成后如下图所示

测试工具jmeter使用_第12张图片

blazemeter使用

注意:生成.jmx文件需要登录

(1)首先给脚本取个名字,只能大小,就算小写输入也会变成大写,生成文件时会自动变成小写

测试工具jmeter使用_第13张图片

(2)点击红色按钮开始录制

测试工具jmeter使用_第14张图片

(3)点击页面上需要录制的接口,可批量录制很多接口

(4)点击红色方块按钮结束录制,此时插件可能会在页面上消失,需要重新点下插件

(5)点击save按钮

(6)选择.jmx格式保存,即会将.jmx文件下载到本地

(7)从本地打开录制的.jmx文件,会看到已经录制了很多接口

测试工具jmeter使用_第15张图片

测试工具jmeter使用_第16张图片  

(8)注意可能会录制一些不需要的接口,可自己手动删除,另外不会录制header、cookie等数据,但是考虑到这些信息中一般会包含一些token等会过期的数据,录制下来也是得修改的

(9)手动添加header

在浏览器上进入待测网站,鼠标右键检查元素,复制header(以下只为演示,与上面录制的接口不匹配)

测试工具jmeter使用_第17张图片

找到HTTP Header manager,从剪切板粘贴

测试工具jmeter使用_第18张图片

(10)设置并行线程数、时间、循环次数

(11)添加监视器统计结果

(12)添加断言(可选)

(13)添加cookie等其他需要的参数(可选)

分布式jmeter

单节点jmeter性能有瓶颈Jmeter系列(39)- Jmeter 分布式测试 - 云+社区 - 腾讯云

slave节点

运行jmeter-server的节点

修改bin/jmeter.properties文件

(1)修改 server_port,可修改为任意没有被占用的端口

server_port=1234

(2)修改 server.rmi.port,与server_port保持一致

server.rmi.port=1234

(3)修改server.rmi.ssl.disable,默认为false,表示需要认证,改为true

server.rmi.ssl.disable=true

    否则会报错

# ./jmeter-server

Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:

    java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录)

An error occurred: Listen failed on port: 0; nested exception is:

    java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录)

(4)运行

# ./jmeter-server

Created remote object: UnicastServerRef2 [liveRef: [endpoint:[172.20.42.70:23899](local),objID:[5bd8b49f:17e28398d54:-7fff, -295455111283112346]]]

(5)也可自定义服务,让jmeter-server开机自启动

# cat /lib/systemd/system/jmeter-server.service

[Unit]

Description=test

[Service]

Type=simple

PIDFile=/run/jmeter.pid

EnvironmentFile=/etc/systemd/jmeter-server.conf

ExecStart=/root/apache-jmeter-5.4.3/bin/jmeter-server

ExecReload=/bin/kill -SIGHUP $MAINPID

ExecStop=/bin/kill -SIGINT $MAINPID

[Install]

WantedBy=multi-user.target

--------------

# cat /etc/systemd/jmeter-server.conf

JAVA_HOME="/root/java-se-8u41-ri"

---------------

# systemctl daemon-reload

# systemctl start jmeter-server.service

# systemctl enable jmeter-server.service

master节点

master节点为运行图形化界面的节点

(1)修改bin/jmeter.properties文件

# Remote Hosts - comma delimited

remote_hosts=172.20.42.71:1234,172.20.42.70:1234

#remote_hosts=localhost:1099,localhost:2010

# RMI port to be used by the server (must start rmiregistry with same port)

server_port=1234

server.rmi.ssl.disable=true

# 实时查看压力机结果

mode=Standard

(2)重启jmeter,可能会出现界面不显示结果的问题,使用如下方式启动

./jmeter -Djava.rmi.server.hostname=${本机IP}

(3)查看界面如下

测试工具jmeter使用_第19张图片

(4)可选择某个slave节点进行测试,也可start all在所有slave节点进行测试

(5)选择运行的节点下会有如下输出

注:master节点不开机自启

最佳实践

(1)在GUI界面将脚本调试好,但并不进行真正的测试

(2)使用jmeter命令行,不启动GUI模式进行真正的测试,因为GUI会占大量资源,容易卡死

(3)不实时查看结果,只做最后的统计,将#mode=Standard注释掉

(4)压力机不要跑其他应用,以免受其他应用影响

(5)压力机配置最好一致,以免配置低的压力机影响结果,一般4c4g配置即可,单压力机性能瓶颈主要出在java本身

(6)先测试一下单压力机最大支持的并发数,避免因为压力机瓶颈导致测试结果异常,如: 

两台压力机,循环数2,请求在1秒内发出,总共4000次请求,也就是单机1000次并发的结果入下:

两台压力机,循环数2,请求在1秒内发出,总共8000次请求,也就是单机2000次并发的结果入下: 

数据基本差不多,说明本次测试的单个压力机支持的最大并发数能达到2000

 命令行运行

# ./jmeter -Djava.rmi.server.hostname=172.20.16.185 -n -t ./test1.jmx -l rlt -r -e -o ./report
-Djava.rmi.server.hostname最好指定,否则可能会收集不到结果
n表示无GUI运行
t表示要运行的jmx文件
l指生成的文件名称
r指远程将所有agent启动
-e -o表示生成html结果

(3)生成的html结果在report目录下

$ ls report
content  index.html  sbadmin2-1.0.7  statistics.json

(4)将html用浏览器打开,可查看运行结果,更多详情可点开左侧导航栏查看

测试工具jmeter使用_第20张图片

注意:生成html结果只能用jdk8,因jdk8没有arm架构,因此master节点必须为x86架构,且必须使用jdk8,不然无法生成html结果,其他节点使用jdk18目前测试无影响,经测试4c4g虚拟机单机可提供2000并发 

参考

jmeter

Apache JMeter - Apache JMeter™

jmeter(二) 优缺点_我的E家-CSDN博客_jmeter的优缺点

Jmeter系列(39)- Jmeter 分布式测试 - 云+社区 - 腾讯云

blazemeter

Jmeter最适用录制工具BlazeMeter - 知乎

推荐几款常用的性能测试工具-InfoQ

你可能感兴趣的:(测试,java,jmeter,blazemeter,性能测试)