JMeter初体验:从入门到入门的性能测试之旅
一、关于性能测试
1、性能测试概述
性能测试是一种非功能测试,旨在评估系统在不同负载条件下的性能表现。它包括负载测试、压力测试、稳定性测试和基准测试等。性能测试的目的是确保系统在预期的负载下能够正常运行,并满足用户对响应时间、吞吐量和其他关键性能指标的期望。
2、性能测试与功能测试对比
- 目的:功能测试主要关注系统是否正确实现了预期功能,而性能测试则关注系统的运行效率和稳定性。
- 测试内容:功能测试验证每个功能是否按需求工作,性能测试则检查系统在高负载下的响应时间和资源使用情况。
- 技术要求:功能测试通常需要详细的业务知识和逻辑判断能力,而性能测试则需要较强的技术背景,特别是在性能监控和数据分析方面。
3. 性能测试准入时间点
- 功能测试完成后:首先应确保所有功能都按照设计规格正常工作。
- 系统趋于稳定后:当软件进入较为稳定的开发阶段,开始进行性能测试以评估其在实际环境中的表现。
4. 性能测试关注点
- 接口响应时间:用户操作到系统响应的时间间隔。(50-1000毫秒)
- 吞吐量:单位时间内系统能处理的事务量。1000万每天,2000万每天,……,10以每天
- 并发用户数:系统能同时处理的最大用户数量。
- TPS:TransactionPerSecond事务处理能力,每秒处理事务数。
5. 性能测试期望值定义来源
- 用户需求:基于用户对系统性能的具体期望设定目标值。
- 行业标准:参考同行业内类似系统的性能标准来确定合理的性能指标。
- 运营数据推算:通过实际运营数据来推测。
- 竞品性能数据参考:参考竞品的性能标准来确定合理的性能指标。
6. 影响系统性能的因素
- 硬件配置:服务器、存储设备和网络设施的性能直接影响系统的整体表现。
- 软件效率(代码性能):代码质量和算法优化程度决定了程序执行的速度。
- 系统架构:分布式架构、缓存机制等设计选择会影响系统的扩展性和可靠性。
- 用户负载:实际使用中的用户行为模式也会影响系统性能。
- 网络架构:网络架构包括网络拓扑结构、带宽和延迟等。优化网络架构可以提高数据传输速度,减少延迟,从而提升系统整体性能。
- 存储读写性能:存储读写性能直接影响系统的响应时间和吞吐量。高性能的存储设备和优化的存储策略可以显著提高系统的数据处理能力。
7. 性能测试关键技术
- 压力测试工具:如JMeter、LoadRunner等,用于模拟大量用户的并发访问。
- 监控与分析技术:使用APM(应用性能管理)工具来实时监控系统状态,收集数据进行分析。
- 压力类型:
- 短时大并发:验证最大处理能力
- 长时小并发:验证长时间运行的稳定性
8. 性能测试的价值
- 确保用户体验:通过优化系统性能提升用户满意度。
- 降低风险与成本:提前发现潜在问题避免上线后的大规模故障,减少维护费用。
- 预测系统的性能瓶颈点
- 预测系统性能冗余度
二、JMeter简介与第一个压测脚本
1、JMeter简介
Apache JMeter是一款开源的、纯Java编写的性能测试工具,专为负载测试和性能测量设计。它支持多种协议和服务,包括HTTP(S)、SOAP/REST Web服务、FTP、数据库(通过JDBC)、LDAP等。JMeter不仅适用于功能测试,还能用于性能测试,帮助开发者和测试人员理解应用在不同负载条件下的表现。
2、JMeter特点
-
多协议支持:JMeter不仅支持HTTP/HTTPS协议,还支持SOAP/REST Web服务、FTP、数据库(通过JDBC)、LDAP等多种协议和服务。
-
开源免费:作为一款开源软件,JMeter允许开发者免费使用,并可以根据需要进行二次开发。
-
跨平台性:由于是基于Java开发的,JMeter可以在多个平台上运行,包括Windows、Linux和Mac OS X。
-
完全多线程框架:JMeter允许通过多个线程并发取样,模拟大量用户同时访问的场景,从而测试服务器在高负载下的性能。
-
可扩展性:JMeter具有高度的可扩展性,可以通过插件来扩展其功能。它还提供了多种负载统计表和计时器供用户选择。
-
可视化界面:JMeter拥有友好的GUI界面,使得操作更加直观和便捷。用户可以通过图形化界面快速创建和配置测试计划。
-
结果分析:JMeter提供了丰富的监听器,可以以图表、表格、树形和日志文件等不同格式显示测试结果,帮助用户深入分析和理解性能数据。
-
脚本录制与回放:JMeter可以记录浏览器上的用户活动,并在Web应用程序中模拟这些活动,从而实现脚本的录制与回放。
-
断言功能:为了验证程序是否返回了期望的结果,JMeter允许使用正则表达式创建断言,确保测试的准确性和可靠性。
3、JMeter下载及安装
-
下载
- 下载JDK:由于JMeter是基于Java开发的,因此首先需要确保已安装Java Development Kit(JDK)。建议使用JDK 8或更高版本。
- 下载JMeter:访问JMeter官方网站,选择适合操作系统的版本进行下载。对于Windows用户,通常下载zip格式的压缩包;对于Linux用户,则下载tgz格式的压缩包。
- 官⽹ https://jmeter.apache.org/
- binary 可运⾏⽂件包
-
安装
- 解压文件:将下载的JMeter压缩包解压到指定目录中,例如“E:\apache-jmeter-5.6.3”。
- 配置环境变量:在系统环境变量中添加两个新的系统变量,一个为
JMETER_HOME
,其值为JMeter的安装路径;另一个为CLASSPATH
,其值为JMeter安装目录下的lib\ext文件夹中的几个关键Jar文件。 - 验证安装:在命令行中输入
jmeter
命令,如果JMeter成功启动,则说明环境变量配置正确。
3、JMeter功能模块
-
测试计划:测试计划是JMeter测试的起点,包含一个或多个线程组及配置元件、监听器、定时器、前置处理器、后置处理器、断言等组件。右键点击测试计划可以添加这些组件。
-
线程组:线程组用来定义JMeter在执行测试时运行的线程数,可以设置线程数量、Ramp-Up时间和执行测试的时间。常见的线程组有Open Model Thread Group、线程组、setUp 线程组和tearDown 线程组。
-
配置元件:JMeter配置元件可以用来进行参数化、初始化默认值和变量、存储服务器的响应信息以及配置链接数据库等。例如CSV Data Set Config、HTTP信息头管理器、HTTP Cookie管理器、HTTP缓存管理器等。
-
采样器:采样器负责发送请求并接收响应,是JMeter的核心功能之一。常用的采样器包括HTTP请求、FTP请求、JDBC请求等。
-
监听器:监听器用于收集测试结果数据并以图表或表格的形式展示出来。常用的监听器有查看结果树、聚合报告、总结报告等。
-
断言:断言用于验证程序是否返回了期望的结果。JMeter允许使用正则表达式创建断言。
-
逻辑控制器:逻辑控制器用于控制采样器的执行顺序和条件。常用的逻辑控制器有if控制器、循环控制器、事务控制器等。
-
前置处理器和后置处理器:前置处理器和后置处理器分别在采样器执行之前和之后运行,可以用于修改请求或处理响应。例如,可以使用前置处理器添加自定义请求头,使用后置处理器提取响应中的特定数据。
-
模块化测试(测试片段):JMeter支持模块化测试,可以将系统分解成若干个功能模块,每个模块独立完成特定的任务。这样可以提高测试的可重用性和可维护性。
4、JMeter界面模块
- 标题栏:标题栏主要显示JMeter的程序版本、当前脚本的名称以及脚本的储存路径,提供了对当前操作状态的基本了解。
- 菜单栏:菜单栏包含了程序的所有功能分类目录,用户可以通过菜单栏对程序进行几乎所有的操作。例如,新建测试计划、打开或保存文件、编辑配置元件等。
- 工具栏:工具栏提供了菜单栏中某些功能的快捷按钮,方便用户快速执行常用操作,如启动测试、停止测试等。
- 测试计划树形目录:测试计划树形目录以树形结构展示测试计划的内容标签,类似于用例名称,用户可以点击标签查看任意标签的内容。
- 内容展示区:内容展示区用于展示当前所选树形目录标签的内容,当日志输出框显示时,还可以看到程序的运行日志记录。
5、第⼀个压测需求与业务操作步骤
5.1需求
压测对象 | 中国计算机技术职业资格网 |
压测页面 | 首页,报考指南,考试用书 |
步骤 | 步骤 -访问首页 -单击“报考指南” -单击“考试用书“ |
操作手段 | 录制回放 |
5.2录制脚本的配置
-
打开Jmeter
-
新建压测脚本
-
添加HTTP(S) Test Script Recorder
-
添加Thread Group 线程组
-
添加Recording Controller 录制控制器
-
打开HTTP(S) Test Script Recorder
设置Port=8888(系统没有被占用的)
设置Target Controller = Test Plan>Tread Group>Recording Controller
-
在 Requests Filtering 添加“include”与 “Exclude”URL 正则匹配表达式
-
⽬的:避免录制过多没必要的请求
-
Include: .*ruankao\.org\.cn.*
-
Exclude:.*\.(js|css|PNG|jpg|ico|png|gif).*
-
-
关于链接过滤的⼏点说明
-
exclude 去掉⼀些诸如图⽚、js、css 等静态请求,这些静态资源⼀般会 单独存放,不会占⽤服务器运算资源,所以压测的时候可以不测试这些资源
-
include 包含内容,只抓取软考网URL的内容,不抓其他的⽹站的内容 正则表达试匹配原理快速⼊⻔说明⻅下⻚图⽚说明
-
-
打开火狐浏览器-设置
5.3开始录制
-
点击录制按钮 start
- 执行录制
-
-访问首页中国计算机技术职业资格网
-
-单击“报考指南”
-
-单击“考试用书“
-
5.4验证回放
- 添加 Result Tree 回放验证
-
关于View Results Tree的用途:
-
详细查看请求响应:
- View Results Tree能够显示每个HTTP请求的详细信息,包括请求的名称、返回状态码、返回内容等。
- 通过这种方式,用户可以方便地查看每个请求的详细信息,包括响应头、响应体、错误信息等。
-
调试和验证:
- 在调试测试计划期间,View Results Tree非常有用,因为它可以提供详细的请求和响应数据,帮助用户找出问题所在。
- 它支持多种查看模式,如Text、HTML、JSON、XML等,可以根据实际需求选择不同的显示格式来展示响应结果信息。
-
过滤和搜索:
- View Results Tree提供了搜索功能,用户可以通过输入查询信息来过滤出符合要求的请求,并高亮显示。
- 它还支持正则表达式匹配,使搜索更加灵活和强大。
-
保存和加载结果:
- 用户可以将测试结果保存到一个文件中,以便后续分析或分享。文件名可以是完整路径,后缀支持csv、html等格式。
- 同时,也可以打开一个现有的结果文件进行浏览,便于回顾和比较不同测试的结果。
5.5响应断⾔
5.5.1添加响应断⾔
-
选择需要添加断⾔的请求:
- 在测试计划中找到你想要添加断⾔的HTTP请求节点。
-
右键点击请求节点:
- 在请求节点上右键点击,选择“添加” -> “断言” -> “响应断言”。
-
配置响应断⾔:
- 在弹出的“响应断言”对话框中,你可以配置各种参数来定义断⾔条件。
5.5.2配置响应断⾔
-
字段名称:
- 指定要检查的响应字段,例如响应文本、响应头等。
-
模式匹配规则:
- 选择匹配规则,如包含(Contains)、等于(Equals)、正则表达式(Regex)等。
-
期望值:
- 输入你期望的响应内容或格式。
-
其他选项:
- 可以勾选“忽略空白字符”(Ignore Whitespace)以忽略响应中的空白字符。
- 可以勾选“区分大小写”(Case Sensitive)以区分大小写进行匹配。
5.5.3断⾔的实际值与设定值相符
- 如果响应内容符合预期,断⾔会标记为成功。
- 如果响应内容不符合预期,断⾔会标记为失败,并显示错误信息。
5.5.4示例
假设你有一个HTTP请求,其响应内容是一段JSON数据,你想确保其中某个字段的值是预期的。
-
添加响应断⾔:
- 在HTTP请求节点上右键点击,选择“添加” -> “断言” -> “响应断言”。
-
配置响应断⾔:
-
-
正确
-
字段名称:选择“Text Response”。
- 模式匹配规则:选择“Contains”。
- 期望值:输入
中国计算机技术职业资格网
。
-
-
错误
-
字段名称:选择“Text Response”。
- 模式匹配规则:选择“Contains1”。
- 期望值:输入
中国计算机技术职业资格网1
。
-
-
-
运行测试:
- 运行测试计划,如果响应中包含中国计算机技术职业资格网,断⾔将标记为成功;否则,将标记为失败。
- 正确
- 错误
5.6添加聚合压测报告
在JMeter中,聚合压测报告(Aggregate Report)是一种常用的监听器,用于汇总和展示测试结果的统计信息。通过聚合报告,你可以获得关于请求响应时间的详细统计数据,如平均时间、最小/最大时间、吞吐量等。:
5.6.1添加聚合报告
-
选择需要添加聚合报告的线程组:
- 在测试计划中找到你想要添加聚合报告的线程组节点。
-
右键点击线程组节点:
- 在线程组节点上右键点击,选择“添加” -> “监听器” -> “聚合报告”。
-
配置聚合报告:
- 在弹出的“聚合报告”对话框中,你可以配置各种参数来定义报告的内容和格式。
5.6.2配置聚合报告
-
名称:
- 为聚合报告指定一个名称,以便在测试计划中识别。
-
保存结果到文件:
- 勾选“写入结果到文件/读取结果从文件”,并指定文件路径和名称。这样,你可以在测试结束后查看详细的报告数据。
-
其他选项:
- 可以勾选“显示每个样本的结果”(Show each sample result),以显示每个请求的详细结果。
- 可以勾选“仅显示错误”(Only show errors),以只显示失败的请求。
5.6.3运行测试并生成报告
-
运行测试计划:
- 运行你的测试计划,聚合报告将自动收集并展示所有请求的统计信息。
-
查看报告:
- 在聚合报告中,你可以看到以下统计信息:
- 标签:请求的名称或标签。
- #样本:请求的数量。
- 平均值:请求的平均响应时间。
- 中位数:请求的中位响应时间。
- 90%行:90%请求的响应时间小于或等于这个值。
- 95%行:95%请求的响应时间小于或等于这个值。
- 99%行:99%请求的响应时间小于或等于这个值。
- 最小值:请求的最小响应时间。
- 最大值:请求的最大响应时间。
- 错误率:请求的错误率。
- 吞吐量:每秒处理的请求数。
- 接收KB/秒:每秒接收的数据量(以KB为单位)。
- 发送KB/秒:每秒发送的数据量(以KB为单位)。
- 在聚合报告中,你可以看到以下统计信息:
5.6.4示例
假设你有一个HTTP请求,其响应时间是你需要监控的关键指标。
-
添加聚合报告:
- 在HTTP请求所在的线程组节点上右键点击,选择“添加” -> “监听器” -> “聚合报告”。
-
配置聚合报告:
- 名称:输入“My Aggregate Report”。
- 勾选“写入结果到文件/读取结果从文件”,并指定文件路径和名称,例如
results.csv
。
-
运行测试:
- 运行测试计划,聚合报告将自动收集并展示所有请求的统计信息。
-
查看报告:
- 在聚合报告中,你可以看到所有请求的详细统计信息,包括平均响应时间、中位数、90%行、95%行、99%行、最小值、最大值、错误率、吞吐量等。
5.7性能指标解读
5.7.1. Max(最大请求响应时间)
- 定义:Max表示所有请求中最长的一个请求所花费的时间。
- 意义:Max值可以揭示系统在极端情况下的性能瓶颈。如果Max值很高,可能意味着系统在某些时刻处理请求的能力不足,存在潜在的性能问题。
- 注意:虽然Max值很重要,但它并不能全面反映系统的整体性能,因为一个极端的高值可能会被其他大多数较低的响应时间所掩盖。
5.7.2. Error%(错误率)
- 定义:Error%表示在测试过程中发生错误的请求占总请求数的百分比。
- 意义:高错误率通常意味着系统存在稳定性或可靠性问题,需要进一步排查和修复。
- 注意:错误率是衡量系统稳定性的重要指标,但仅凭错误率无法确定错误的原因和影响范围。
5.7.3. Throughput(吞吐量)
- 定义:Throughput表示单位时间内系统能够处理的请求数量,通常以每秒请求数(RPS)或事务数(TPS)为单位。
- 意义:Throughput是衡量系统处理能力的重要指标,高吞吐量通常意味着系统具有较好的性能。
- 注意:吞吐量受多种因素影响,包括硬件配置、网络带宽、应用逻辑等,因此在比较不同系统时需要综合考虑这些因素。
5.7.4. Received KB/sec(每秒从服务器端接收到的数据量)
- 定义:Received KB/sec表示单位时间内从服务器端接收到的数据量,通常以千字节(KB)为单位。
- 意义:Received KB/sec可以帮助你了解系统的数据传输效率,特别是在下载或流媒体传输场景中。
- 注意:这个指标受网络带宽和服务器性能的影响,需要结合其他指标综合分析。
5.7.5. Sent KB/sec(每秒从客户端发送的请求的数量)
- 定义:Sent KB/sec表示单位时间内从客户端发送的请求数据量,通常以千字节(KB)为单位。
- 意义:Sent KB/sec反映了客户端的请求负载情况,有助于了解客户端对服务器的压力。
- 注意:这个指标与客户端的并发用户数和请求大小密切相关,需要结合实际情况进行解释。
5.7.6. 平均值的困扰 ~ 个别极端结果对实际性能数据的干扰
- 定义:平均值是所有数据点的和除以数据点的数量。
- 意义:平均值可以提供整体趋势的信息,但在性能测试中,平均值可能会受到个别极端结果的干扰,导致不能准确反映系统的实际性能。
- 注意:为了更准确地反映系统性能,应该关注90%行、95%行、99%行等百分位数值,这些数值更能客观反映实际性能情形。
5.7.7. %Line(百分位线)
- 定义:%Line表示在一定百分比内的请求响应时间,如90%、95%、99%等。
- 意义:%Line更能客观反映实际性能情形,因为它排除了极端值的干扰,提供了更可靠的性能指标。
- 注意:不同的百分位线适用于不同的场景,例如95%行常用于一般性能评估,而99%行则适用于对极端性能要求较高的场景。
5.8JMeter静默压测
在JMeter中进行静默压测(即脱离UI运行)是一种高效且自动化的测试方式,特别适用于需要大规模并发请求的场景。以下是关于如何进行静默压测的详细步骤和注意事项:
5.8.1. 准备JMX脚本
首先,你需要一个已经配置好的JMX脚本文件,这个文件包含了你的压测计划、线程组、采样器、监听器等所有配置信息。
5.8.2. 命令行格式
使用以下命令格式来执行静默压测:
bash复制代码
jmeter -n -t $jmx_file -l $jtl_file
-n
:表示以非GUI模式运行JMeter。-t
:指定JMX脚本文件路径。-l
:指定结果输出文件路径(通常为JTL文件)。
5.8.3. 示例命令
假设你的JMX脚本文件名为test_plan.jmx
,你希望将结果输出到results.jtl
文件中,可以使用以下命令:
bash复制代码
jmeter -n -t test_plan.jmx -l results.jtl
5.8.4. 生成压测报告
完成静默压测后,你可以使用JMeter自带的工具或第三方工具生成详细的压测报告。以下是几种常见的方法:
5.8.4.1使用JMeter自带工具生成报告
-
打开JMeter GUI:
bash复制代码
jmeter -g results.jtl -o /path/to/output/folder
-g
:指定输入的JTL文件。-o
:指定输出报告的文件夹路径。
-
查看报告: 生成的报告会包含各种图表和统计数据,帮助你分析系统的性能表现。
5.8.4.2使用第三方工具生成报告
你也可以使用一些第三方工具如Apache JMeter Plugins中的插件来生成更丰富的报告。
5.8.5. 好处
- 脱离UI运行:无需启动JMeter GUI,节省资源,提高效率。
- 自动化:适合集成到CI/CD流水线中,实现持续集成和持续交付。
- 可扩展性:可以轻松调整并发用户数、请求频率等参数,适应不同的测试需求。
5.8.6. 注意事项
- 资源消耗:大规模并发测试可能会消耗大量系统资源,确保测试环境有足够的硬件支持。
- 网络带宽:高并发请求可能会占用大量网络带宽,确保网络环境稳定。
- 日志管理:静默模式下,日志记录较少,建议在JMX脚本中添加适当的日志记录,以便排查问题。