当前位置: 首页 > news >正文

Jmeter测试


洞悉系统瓶颈:驾驭 JMeter,解锁性能潜力

在当今瞬息万变的数字化时代,用户对应用的性能预期达到了前所未有的高度。一个响应迟缓、崩溃频繁的系统,轻则损害用户体验和品牌声誉,重则导致巨大的商业损失。因此,性能测试,特别是压力测试,成为了软件开发生命周期中不可或缺的一环。

在众多性能测试工具中,Apache JMeter 凭借其开源、跨平台、功能强大且易于扩展的特性,赢得了全球无数性能测试工程师的青睐。今天,我们就来深入探讨 JMeter,一起驾驭它,洞悉系统瓶颈,解锁应用性能的真正潜力。


JMeter 是什么?为什么选择 JMeter?

Apache JMeter 是一款 100% 纯 Java 开发的开源桌面应用,最初设计用于测试 Web 应用的性能,但其功能已扩展到可以对多种协议和服务器类型(如 HTTP、HTTPS、FTP、JDBC、SOAP/REST Web Services、JMS、SMTP、TCP 等)进行负载和性能测试。

为什么选择 JMeter?

  1. 开源免费且功能强大: 无需昂贵的授权费用,即可享受企业级性能测试能力。
  2. 协议支持广泛: 几乎涵盖了主流的应用层协议,满足各种测试需求。
  3. 图形化界面友好: 通过直观的 GUI 组件,可以方便地构建复杂的测试场景。
  4. 高度可扩展: 丰富的插件生态系统,允许用户根据具体需求定制和扩展功能。
  5. 跨平台运行: 基于 Java 开发,可以在任何支持 Java 的操作系统上运行。
  6. 易于集成: 可以与 CI/CD 流程无缝集成,实现自动化性能测试。
  7. 录制与回放: 提供代理服务器模式,方便录制用户操作并生成测试脚本。

JMeter 核心组件(庖丁解牛)

理解 JMeter 的核心组件是高效使用它的基础。让我们来快速概览一些最常用的组件:

  • 测试计划 (Test Plan): JMeter 脚本的根目录,包含所有测试元素。
  • 线程组 (Thread Group): 模拟用户并发行为的区域。在这里,你可以定义并发用户数(线程数)、Ramp-Up Period(启动所有线程所需时间)、循环次数等。
  • 取样器 (Sampler): 向服务器发送请求的原子操作,如 HTTP 请求、JDBC 请求等。它是模拟用户行为的关键。
  • 配置元件 (Config Element): 在取样器发送请求之前进行配置,例如 HTTP Cookie 管理器、CSV Data Set Config(数据参数化)等。
  • 监听器 (Listener): 收集并展示测试结果,提供图表、表格、日志等多种展示形式,如聚合报告、结果树(查看详细请求/响应)、图形结果等。
  • 断言 (Assertion): 验证服务器响应是否符合预期,如响应断言、HTML 断言等,用于判断请求是否成功。
  • 逻辑控制器 (Logic Controller): 控制取样器发送请求的顺序或逻辑,如 While Controller、If Controller、ForEach Controller 等。
  • 前置处理器 (Pre-Processor): 在取样器执行前执行的操作,如用户参数、BeanShell PreProcessor 等。
  • 后置处理器 (Post-Processor): 在取样器执行后执行的操作,如正则表达式提取器、JSON Extractor 等,用于提取响应数据。

JMeter 压力测试实战:以 Web 应用为例

为了更好地阐释 JMeter 的用法,我们以对一个简单的 Web 应用进行压力测试为例。

1. 构建测试计划
  1. 启动 JMeter: 运行 bin 目录下的 jmeter.bat (Windows) 或 jmeter.sh (Linux/macOS)。
  2. 新建测试计划: 默认即为一个空的测试计划。
2. 添加线程组

右键点击 “测试计划” -> “添加” -> “线程 (用户)” -> “线程组”

  • 线程数 (Number of Threads): 假设我们要模拟 100 个并发用户。
  • Ramp-Up period (in seconds): 假设我们希望这 100 个用户在 10 秒内全部启动完成,则设置为 10。
  • 循环次数 (Loop Count): 设置为“永远”,或者指定一个具体的次数,比如 5 次。
3. 添加 HTTP 请求默认值(可选但推荐)

右键点击 “线程组” -> “添加” -> “配置元件” -> “HTTP 请求默认值”
在这里配置目标服务器的 IP 地址/域名和端口,这样后续的 HTTP 请求取样器就无需重复填写。

4. 添加 HTTP 请求取样器

右键点击 “线程组” -> “添加” -> “取样器” -> “HTTP 请求”

  • 协议 (Protocol): httphttps

  • 服务器名称或 IP (Server Name or IP): 例如 www.example.com (如果已经配置了 HTTP 请求默认值,这里可以留空)。

  • 路径 (Path): 例如 /login/index.html

  • 方法 (Method): GETPOST

  • 发送参数 (Send Parameters with the Request): 对于 POST 请求,将表单参数添加在这里。

    {% highlight xml %}

    username
    testuser
    password
    password123
    {% endhighlight %}

5. 添加后置处理器(参数化与关联)

如果需要进行登录后的操作,通常会涉及到 Session IDToken 的传递,这时就需要使用后置处理器来提取响应中的动态数据并进行关联。

右键点击 “HTTP 请求” (登录请求) -> “添加” -> “后置处理器” -> “正则表达式提取器”

  • 引用名称 (Name of created variable): sessionId (你可以自定义变量名)。
  • 正则表达式 (Regular Expression): 例如从响应头或响应体中提取,Set-Cookie: JSESSIONID=(.+?);<input name="csrf_token" value="(.+?)">。关键在于正确匹配需要提取的值。
  • 模板 (Template): $1$ (表示提取正则表达式中第一个捕获组的值)。
  • 匹配数字 (Match No.): 1 (表示匹配到的第一个值)。

然后,在后续的 HTTP 请求中,可以使用 ${sessionId} 来引用这个提取到的变量。

6. 添加配置元件(数据参数化)

为了模拟不同的用户,我们需要进行数据参数化。

右键点击 “线程组” -> “添加” -> “配置元件” -> “CSV Data Set Config”

  • 文件名 (Filename): 浏览器到一个 CSV 文件,例如 users.csv,内容可以是:
    user1,pass1
    user2,pass2
    
  • 变量名称 (Variable Names): username,password (与 CSV 文件中的列名对应)。
  • 分隔符 (Delimiter): ,
  • 遇到文件结束符:停止/循环: 根据需求选择。

然后在 HTTP 请求中,将静态的 testuser 替换为 ${username}password123 替换为 ${password}

7. 添加断言

为了验证请求是否成功,我们可以在 HTTP 请求下添加断言。

右键点击 “HTTP 请求” -> “添加” -> “断言” -> “响应断言”

  • 要测试的字段: 响应文本、URL、响应代码等。
  • 模式匹配规则: 包含、匹配、相等。
  • 要测试的模式: 例如,对于登录成功,响应体中可能包含“登录成功”或重定向后的特定文本。
8. 添加监听器

右键点击 “线程组” -> “添加” -> “监听器” -> “聚合报告”“查看结果树”

  • 聚合报告 (Aggregate Report): 提供汇总性的性能指标,如平均响应时间、吞吐量、错误率等。
  • 查看结果树 (View Results Tree): 显示每个请求的详细信息,包括请求头、体、响应头、体以及断言结果,是调试测试脚本的利器。
9. 运行测试(CLI 模式更佳)

在 JMeter GUI 中,点击绿色启动按钮即可运行测试。然而,在进行实际的压力测试时,强烈推荐使用非 GUI 模式(命令行模式)运行 JMeter,以节省系统资源,获得更准确的测试结果。

jmeter -n -t /path/to/your/testplan.jmx -l /path/to/results.jtl -e -o /path/to/dashboard
  • -n:非 GUI 模式运行。
  • -t:指定测试计划文件 (.jmx 格式)。
  • -l:指定结果文件 (.jtl 格式,用于存储原始测试数据)。
  • -e -o:在测试结束后自动生成 HTML 报告仪表盘。
10. 分析结果

测试结束后,查看聚合报告和生成的 HTML 报告,重点关注:

  • 响应时间 (Average, Median, 90% Line, 95% Line, 99% Line): 用户的感知速度。
  • 吞吐量 (Throughput): 系统在单位时间内处理的请求数,通常以 req/s 表示。
  • 错误率 (Error %): 有多少百分比的请求失败了。
  • 发送/接收字节 (Sent/Received Bytes): 网络流量情况。

结合这些数据,可以判断系统在当前负载下的性能表现,并识别潜在的瓶颈(如高响应时间、低吞吐量、高错误率)。


JMeter 进阶技巧与最佳实践

  • 参数化与关联: 几乎是所有真实世界测试的关键,确保模拟的用户行为足够真实。
  • 逻辑控制器: 模拟更复杂的业务流程,如条件判断、循环操作。
  • 定时器 (Timer): 模拟用户思考时间,使请求发送更符合真实用户行为,如 Constant Timer、Gaussian Random Timer。
  • Pacing (步调控制器): 控制请求的发送速度,有助于更精确地模拟实际负载。
  • 分布式测试: 当单台机器 JMeter 无法产生足够大的负载时,可以利用多台机器进行分布式测试。
  • 资源监控: 结合 Prometheus/Grafana 或其他监控工具,实时监控被测服务器的 CPU、内存、网络、磁盘 I/O 等指标,以便在 JMeter 发现性能问题时,能够快速定位到是服务器资源限制还是应用代码问题。
  • 结果分析: 不要只看平均值,关注 90%、95%、99% Line,它们更能反映用户体验。
  • 测试场景设计: 根据业务需求和用户行为模式,设计合理的并发、持续时间、请求组合。
  • 版本控制: 将 JMeter 脚本纳入版本控制系统,方便团队协作和历史追溯。

结语

JMeter 作为一款功能强大的开源性能测试工具,其学习曲线相对平缓,但其深度和广度足以应对各种复杂的性能测试场景。通过灵活运用其核心组件和掌握最佳实践,我们不仅能够找出系统的性能短板,还能验证优化效果,最终交付一个高可用、高性能的卓越产品。

性能测试并非一蹴而就,它是一个持续迭代和优化的过程。希望这篇文章能为您驾驭 JMeter 开启性能测试之旅提供有益的指南。现在,就开始您的 JMeter 实践,让您的系统在压力下展现出最佳姿态吧!



文章转载自:

http://c0Lxu6YD.zztkt.cn
http://aRsthCGD.zztkt.cn
http://jVGDAhUn.zztkt.cn
http://Qc1v2c4a.zztkt.cn
http://15dkjfS2.zztkt.cn
http://WF7fus3G.zztkt.cn
http://Oqajq2mv.zztkt.cn
http://kJhkNluJ.zztkt.cn
http://Fd7KW8ie.zztkt.cn
http://GXR93Yzn.zztkt.cn
http://QTsduZjm.zztkt.cn
http://NawyJumq.zztkt.cn
http://mnfjWq9q.zztkt.cn
http://AlGS7vig.zztkt.cn
http://SZXmeqjg.zztkt.cn
http://5SEyJcv1.zztkt.cn
http://dCi0awbU.zztkt.cn
http://lAe1YWMz.zztkt.cn
http://jpBTNjYJ.zztkt.cn
http://z6t1Eo5G.zztkt.cn
http://48RFC0sB.zztkt.cn
http://Zgp1gxx5.zztkt.cn
http://NBonmB98.zztkt.cn
http://gbesRpQH.zztkt.cn
http://bGbi8jIY.zztkt.cn
http://XR779Lnh.zztkt.cn
http://EIRhy9N6.zztkt.cn
http://EzuEQqIP.zztkt.cn
http://FmtZxtpY.zztkt.cn
http://8XL1HhuY.zztkt.cn
http://www.dtcms.com/a/380018.html

相关文章:

  • 神经网络基本概念
  • 【打包app】uniapp打包ios端和安卓端app
  • 【LeetCode 每日一题】3000. 对角线最长的矩形的面积
  • 制造业档案管理混乱:档案宝如何破解?
  • 第4周 数组的概念和常见操作
  • vue,uniapp 实现卷帘对比效果
  • 鸿蒙 NEXT UI 性能优化实战:打造流畅用户界面的关键策略
  • 使用UniApp实现一个AI对话页面
  • 智能科技与搜索引擎优化关键词的新契机
  • 搜维尔科技:全身可穿戴Teslasuit动捕服的功能,自立式FES装置
  • Java 大视界 -- Java 大数据在智能医疗健康档案数据分析与个性化健康管理中的应用(410)
  • RK3588 Android12默认移除导航栏
  • HBuilder 运行编译器内存溢出
  • lesson59:JavaScript 控制流详解:分支结构与循环语句全指南
  • Avalonia 基础导航实现:从页面切换到响应式交互全指南
  • 【连载2】C# MVC 自定义错误页设计:404/500 处理与 SEO 优化
  • java jdbc连接sqlserver2008R2版本数据库报错,驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
  • 企业级AI大模型选型指南:从评估部署到安全实践
  • Spring Boot + Redis 缓存性能优化实战:从5秒到毫秒级的性能提升
  • 【Vue2手录09】购物车实战
  • 【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022)
  • PAT乙级_1111 对称日_Python_AC解法_无疑难点
  • Kafka面试精讲 Day 16:生产者性能优化策略
  • vue 批量自动引入并注册组件或路由
  • Kubernetes(K8s)详解
  • 趣味学solana(介绍)
  • Apache Thrift:跨语言服务开发的高性能RPC框架指南
  • Flutter 应用国际化 (i18n) 与本地化 (l10n) 完整指南
  • 第 5 篇:深入浅出学 Java 语言(JDK8 版)—— 精通类与对象进阶,掌握 Java 面向对象核心能力
  • Gin-Vue-Admin学习笔记