通过AI可知:
Apache JMeter 是一款开源的、基于Java的压力测试和性能测试工具,它主要用于对软件和服务器进行性能测试和负载测试。JMeter 可以模拟多种用户请求,包括但不限于Web请求、数据库请求、FTP请求等,以评估系统在高负载情况下的表现。
以下是JMeter的一些主要特性:
- 多协议支持:JMeter 支持多种协议,包括HTTP/HTTPS、FTP、TCP/UDP、JDBC等。
- 多线程测试:JMeter 可以模拟多用户同时对服务器进行请求,以测试服务器在高并发情况下的性能。
- 图形化界面:JMeter 提供了直观的图形化界面,用户可以通过拖拽组件来构建测试计划。
- 结果分析:JMeter 提供了丰富的结果分析工具,包括图表、聚合报告等,帮助用户了解测试结果。
- 可扩展性:JMeter 允许用户通过编写自定义代码来扩展其功能,例如添加新的协议支持或自定义的断言。
- 远程测试:JMeter 支持分布式测试,可以在多个服务器上运行测试计划,以模拟更大规模的负载。
- 脚本功能:JMeter 支持使用JMeter脚本语言(JSR223)编写脚本,以实现更复杂的测试逻辑。
- 集成其他工具:JMeter 可以与其他工具集成,如CI/CD工具、监控工具等,以实现自动化测试和性能监控。
- 跨平台:JMeter 是基于Java开发的,因此可以在任何支持Java的平台上运行。
- 社区支持:作为一个开源项目,JMeter 有一个活跃的社区,用户可以从社区获得帮助和资源。
JMeter 通常用于以下场景:
- 性能测试:评估应用程序在特定负载下的性能。
- 负载测试:模拟大量用户同时访问应用程序,以测试其在高负载下的行为。
- 压力测试:测试应用程序在极端条件下的稳定性和性能。
- 配置测试:测试不同硬件、软件、网络配置对应用程序性能的影响。
- 可用性测试:模拟用户操作,测试应用程序的可用性和响应时间。
JMeter 是性能测试工程师和开发人员常用的工具之一,它帮助他们识别性能瓶颈,优化系统性能。
JMeter⼯作原理
安装JMeter
打开JMeter
- 方式一:点击bat文件
- 方式二:命令行启动
- 添加JMeter系统环境变量
- 修改JMeter语言:在JMeter的bin目录下,修改文件中的内容:language=zh_CN
JMeter基本使⽤流程
- 启动JMeter
- 在"测试计划"下添加"线程组
- 在"线程组"下添加"HTTP"取样器
- 填写"HTTP请求"的相关请求数据
- 在"线程组"下添加"查看结果树"监听器
- 点击"启动"按钮运⾏,查看接⼝测试结果
JMeter元件作⽤域和执⾏顺序
在JMeter中,元件的作⽤域和执⾏顺序是⾮常重要的概念
作⽤域:
- JMeter元件的作⽤域主要由测试计划的树形结构中的元件⽗⼦关系来确定。
执⾏顺序:
- 取样器(sampler)元件内组件不依赖其他元件就可执⾏,因此取样器不存在作⽤问题
- 元件作⽤域只对它的⼦节点有作⽤
- 其他作⽤域默认根据测试计划中树形结构来定;
重点组件
线程组
控制JMeter将⽤于执⾏测试的线程数,也可以把⼀个线程理解为⼀个测试⽤⼾。
线程数:⼀个线程即⼀个测试⽤⼾,设置发送的请求次数
Ramp-up时间(秒):设置性能测试运⾏时间,单位为秒 循环次数:
- 配置指定次数:控制脚本循环执⾏的次数
- 配置循环永远
- 需要调度器配置使⽤
- 运⾏时间:脚本执⾏时间
- 延迟启动时间:脚本等待指定时间才能运⾏
HTTP取样器
添加必需的配置:
http协议
http主机名/IP
端⼝
- http协议端⼝号80
- https端⼝号443
请求⽅法
路径(⽬录+参数)
- 内容编码(默认的ISO国际标准,但对中⽂⽀持不友好,可以使⽤utf-8)
参数
- 参数可以拼在路径⾥,也可以卸载参数中
- POST参数要放到消息体数据中{wd:test}
查看结果树
取样器结果:统计请求相关的信息
Thread Name:线程组名称
Sample time:发送请求时间
load time:响应时间
Response code :接⼝响应状态码
- 请求:HTTP请求的请求头和请求体的详细信息
- 响应:HTTP响应的响应头和响应体的详细信息
HTTP Cookie管理器
选择standard即可
HTTP Cookie管理器像Web浏览器⼀样存储和发送Cookie。如果HTTP请求并且响应包含cookie,则 Cookie管理器会⾃动存储该cookie,并将其⽤于将来对该特定⽹站的所有请求。每个JMeter线程都有 ⾃⼰的"cookie存储区"。因此,正在测试使⽤cookie存储会话信息的⽹站,则每个JMeter线程都将拥 有⾃⼰的会话。此类Cookie不会显⽰在Cookie管理器显⽰屏上,可以使⽤"查看结果树监听器"查看。 缓存配置可选择standard(标准)或compatibility(兼容的),当然也可以⼿⼯添加⼀些cookie.
添加了HTTP Cookie管理器后,会⾃动存储并发送Cookie
如果设置了Cookie就会自动发送Cookie
HTTP请求默认值
- 设置HTTP协议默认值
⽤⼾定义的变量
添加⽅式:线程组---配置元件---⽤⼾定义的变量
可以自定义变量
有时我们只想要在固定的场景⾥使⽤参数化,改动后不希望影响到其他的脚本。
使⽤:在HTTP请求的取样器中引⼊定义的变量。${参数名}
适⽤场景:变量需要在多个脚本中使⽤,⽅⾯统⼀管理和修改
CSV数据⽂件设置
以登陆接⼝为例,当我们执⾏登陆接⼝的性能测试时,⼿动配置了⽤⼾名和密码为固定的username和 password,然⽽实际使⽤中不可能只有⼀个⽤⼾登陆,为了模拟更真实的登录环境,我们需要提供更 多的⽤⼾username和password来实现登录操作
添加⽅式:线程组⸺配置元件⸺CSV数据⽂件设置
操作步骤
CSV数据⽂件设置
- ⽂件名:填写csv⽂件的路径。建议使⽤绝对路径
- ⽂件编码:UTF-8 • 变量名称:从csv数据⽂件中读起的数据需要保存到的变量名。有多个变量时⽤逗号分隔
- 是否忽略⾸⾏:是否从csv数据⽂件第⼀⾏开始读取
- 分隔符:要求与csv数据⽂件中多列的分隔符⼀致
- 遇到⽂件结束符再次循环:若选择为True当数据不够的时候会从头取。若选择False,则需要勾选 下⾯的配置,遇到⽂件结束符停⽌线程,这⾥如果不勾选,请求将会报错
- 编写test.csv⽂件,⽰例:
- 修改登陆接⼝及其他涉及到username和password获取的参数
- 修改完该配置后,登陆接⼝发起请求时将从csv⽂件中获取配置好的username和password参数,获 取顺序为从上往下依次获取
- 修改线程组中线程数,使得每次取到的username和password都不⼀样
JSON提取器
- 接⼝响应成功,通过提取返回值对应字段,可⽤于其他接⼝的参数配置
- 添加JSON提取器
针对某⼀个HTTP请求接⼝添加JSON提取器
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"grades": {
"math": 90,
"science": 78,
"history": 82
},
"languages": ["English", "Spanish", "French"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"hasPets": null
}
JSON操作符参考:
参考⽂档:https://github.com/json-path/JsonPath
- 获取相应中的所有blogId元素:$..Id
- 获取第⼀个blogId元素:$.[0]Id
添加JSON配置
配置json提取的参数
JSON断⾔
接⼝发送请求成功,响应码为200并不能完全代表接⼝请求成功,我们更多需要关注接⼝响应数据是否符合预期
添加JSON断⾔
针对某⼀个HTTP请求接⼝添加JSON断⾔
添加JSON配置
同JSON提取器语法配置
注意
- 若不选Additionally assert value,表⽰添加断⾔值,则可⽤来判断字段是否存在
- 选择Additionally assert value,则必须添加Expected Value期望的断⾔值
- 若不选Match as regular expression正则匹配,则Expected Value必须填写完整,少⼀个字符都 会导致断⾔失败
- 若选择Match as regular expression正则匹配,则Expected Value可以仅写上部分关键词即可断⾔成功
同步定时器(集合点)
为了达到并发的效果,需要添加同步定时器
- JMeter同步定时器的作⽤主要在于模拟多⽤⼾并发访问的场景,确保多个线程能够同时执⾏某个操 作,以达到真正的并发效果
- 当多个线程同时启动时,它们可能会在不同的时间间隔内执⾏,这样就⽆法达到真正的并发效果。同 步定时器的作⽤就是将这些线程的执⾏时间同步,使它们在同⼀时间点执⾏。它可以在多个线程之间 制造⼀定的延迟,直到同时到达指定时间点,再同时执⾏后续的操作
- 此外,同步定时器可以理解为集合点,当线程数量达到指定值后,再⼀起释放,可以瞬间产⽣很⼤的 压⼒。这样,可以更好地模拟真实的⽤⼾并发访问场景,提⾼测试的准确性和可靠性
- 在性能测试过程中,为了真实模拟多个⽤⼾同时进⾏操作以度量服务器的处理能⼒,可以使⽤同步定 时器来设置集合点。不过,虽然通过加⼊集合点可以约束请求同时发送,但不能确保请求同时到达服 务器,所以只能说是较真实模拟并发
现实⽣活中,红绿灯就相当于⼀个集合点,有⼈先到达,有⼈后达到,但必须等到绿灯后所有⼈才能开始过⼈⾏道
事务控制器
JMeter事务控制器的作⽤主要⽤于测试执⾏嵌套测试元素所花费的总时间。这相当于模拟⽤⼾进⾏⼀ 系列操作的测试
在进⾏⻚⾯性能测试或API性能测试时,事务控制器是⼀个⾮常重要的⼯具。它可以帮助测试⼈员更准 确地评估系统性能,尤其是在涉及多个接⼝或操作的复杂场景中。例如,在订单提交的过程中,可能 需要调⽤多个接⼝,并且某些接⼝可能依赖于前⼀个接⼝的结果。在这种情况下,使⽤事务控制器可 以将这些接⼝统⼀视为⼀个事务进⾏性能测试,从⽽得到更接近真实场景的性能测试结果
若不添加事务控制器,则⼀个接⼝即⼀个事务
添加了事务控制器后,可以将多个接⼝统⼀放到⼀个事务控制器下作为⼀个事务
安装插件
在真实企业压测场景中,我们通常为⼀点⼀点的逐步增加线程数,因此需要安装新的插件来⽀持线程 数的配置。
通过插件管理⼯具下载其他插件
下载其他监听器插件
下载线程组插件
点击Apply Changes and Restart JMeter等待下载完成并重启JMeter
下载完成后再线程和监听器中可以看到新增的元件
Stepping Thread Group
This group will start:启动多少个线程,同线程组中的线程数
First, wait for:等待多少秒才开始压测,⼀般默认为0
Then start:⼀开始有多少个线程数,⼀般默认为0
Next,add:下⼀次增加多少个线程数
threads every:当前运⾏多⻓时间后再次启动线程,即每⼀次线程启动完成之后的的持续时间;
using ramp-up:启动线程的时间;若设置为5秒,表⽰每次启动线程都持续5秒
then hold loadfor:线程全部启动完之后持续运⾏多⻓时间
finally,stop/threadsevery:多⻓时间释放多少个线程;若设置为5个和1秒,表⽰持续负载结束之后 每1秒钟释放5个线程
常⻅监听器
聚合报告
从聚合报告可以看到性能测试过程中整体的数据变化
Response Times Over Time
Response Times Over Time主要⽤于监听整个事务运⾏期间的响应时间。在测试过程中,它可以帮助 测试⼈员观察并分析响应时间的实时平均值以及整体响应时间的⾛向。通过这⼀监听器,测试⼈员能 够更直观地了解系统在不同时间点的响应性能,从⽽发现可能存在的性能问题或瓶颈。
Response Times Over Time的图形展⽰中,横坐标通常代表运⾏时间,⽽纵坐标则代表响应时间(单 位是毫秒)。测试人员可以根据图形中的趋势线来判断响应时间的稳定性以及是否存在⼤的波动。例 如,如果响应时间在某个时间点突然增加,这可能意味着系统在该时间点遇到了性能问题
Transactions per Second(TPS)
JMeter中的Transactions per Second(TPS)监听器是⼀个⽤于分析系统吞吐量的重要⼯具。TPS, 即每秒事务数,表⽰⼀个客⼾机向服务器发送请求后服务器做出反应的过程。这个指标反映了系统在 同⼀时间内处理业务的最⼤能⼒。TPS值越⾼,说明系统的处理能⼒越强。
在使⽤TPS监听器时,横坐标通常代表运⾏时间,⽽纵坐标则代表TPS值。通过监听器展⽰的图表,可 以清晰地看到TPS值随时间的变化情况。在图表中,红⾊通常表⽰通过的TPS,⽽绿⾊可能表⽰失败的 TPS。这有助于我们快速识别系统性能的变化和瓶颈。
测试报告
JMeter测试报告是⼀个全⾯⽽详细的⽂档,它提供了关于测试执⾏结果的详细信息,帮助⽤⼾全⾯评 估系统的性能并进⾏性能优化
⽣成性能测试报告的命令:
Jmeter -n -t 脚本⽂件 -l ⽇志⽂件 -e -o ⽬录
-n : ⽆图形化运⾏
-t : 被运⾏的脚本
-l : 将运⾏信息写⼊⽇志⽂件,后缀为jtl的⽇志⽂件
-e : ⽣成测试报告
-o : 指定报告输出⽬录
注意:⽇志⽂件和⽬录可以不存在,若为已经存在的情况下需要保证内容为空,否则会出现错误!
正确演⽰⽰例:
性能测试报告⽣成成功后,在rizhi⽂件夹下将出现以下内容:
双击index.html⽂件,界⾯展⽰如下: