返回文章列表

性能测试实战:JMeter + Badboy 从入门到认证通过

· 7 min read ·
性能测试 JMeter 自动化测试
性能测试实战:JMeter + Badboy 从入门到认证通过

2017年年初,由于工作需要,我开始学习性能测试相关的技术。那时候团队正准备对核心业务系统进行全面的性能评估,而我被安排负责这块工作。从零开始学习JMeter和Badboy,经过几个月的学习和实践,最终成功输出了专业的性能测试报告,并通过了某大厂的认证审核。

一、为什么选择 JMeter + Badboy

1.1 性能测试概述

性能测试是软件质量保障的重要环节,它通过模拟真实用户负载,验证系统在各种压力条件下的表现。

性能测试的核心价值

性能测试不仅是为了发现系统缺陷,更是为了评估系统的承载能力,为容量规划和性能优化提供数据支撑。

性能测试类型:

性能测试(Performance Testing)验证系统在预期负载下的响应时间和吞吐量,确保满足性能需求。

负载测试(Load Testing)逐步增加负载,观察系统在不同负载级别下的表现,找出性能瓶颈。

压力测试(Stress Testing)在超过正常负载的极端条件下测试,观察系统的稳定性和恢复能力。

稳定性测试(Endurance Testing)在较长时间内持续施加负载,验证系统的长期稳定运行能力。

1.2 工具选型

当时团队主要考虑两款工具:LoadRunnerJMeter

Pros
  • JMeter完全免费开源
  • 支持多种协议
  • 插件丰富可扩展
  • 跨平台支持
  • 学习资源丰富
Cons
  • 相比LoadRunner功能略简单
  • 分布式测试配置复杂
  • GUI模式消耗资源
  • 需要一定技术基础

最终选择 JMeter + Badboy 组合的原因:

  • JMeter:开源免费,功能强大,社区活跃,适合团队长期使用
  • Badboy:录制脚本简单直观,可以导出为JMeter格式,大幅降低脚本编写工作量
  • 成本考虑:LoadRunner商业授权费用高昂,对于创业公司来说是很大的负担
  • 学习曲线:JMeter的学习资源丰富,上手相对较快

经过综合评估,我们决定采用JMeter作为主要性能测试工具,Badboy作为辅助录制工具。这套组合完全能够满足我们的性能测试需求。

团队决策

二、环境搭建

2.1 软件准备

工欲善其事,必先利其器。首先需要准备好以下软件环境:

软件清单:

软件版本用途下载地址
JDK1.8+JMeter运行依赖oracle.com
JMeter3.3+性能测试主工具jmeter.apache.org
Badboy2.2脚本录制工具badboy.com.au
Note

建议优先安装JDK,因为JMeter是基于Java开发的,JDK是必需的环境。推荐使用JDK 1.8或更高版本。

2.2 安装配置

JMeter 安装步骤:

安装 JDK

  1. 下载JDK 1.8安装包
  2. 双击安装,一路Next即可
  3. 配置环境变量:JAVA_HOME 指向JDK安装目录
  4. 验证安装:命令行输入 java -version

解压 JMeter

  1. 下载JMeter压缩包(apache-jmeter-3.3.zip)
  2. 解压到指定目录,如 D:\Tools\apache-jmeter-3.3
  3. 配置环境变量:JMETER_HOME 指向解压目录
  4. 将 %JMETER_HOME%\bin 加入 PATH

安装 Badboy

  1. 下载 Badboy 安装包
  2. 双击安装,一路Next即可
  3. 安装完成后桌面会有快捷方式
  4. Badboy 支持导出为 .jmx 格式,可直接导入JMeter

验证环境

  1. 命令行输入 jmeter -v 查看JMeter版本
  2. 双击JMeter快捷方式启动JMeter GUI
  3. 确认JMeter界面正常显示
  4. 测试完成,基本环境搭建成功

2.3 JMeter 目录结构

了解JMeter的目录结构,有助于后续的配置和插件管理:

apache-jmeter-3.3/
├── bin/ # 启动脚本和配置文件
│ ├── jmeter.bat # Windows启动脚本
│ ├── jmeter.sh # Linux启动脚本
│ └── jmeter.properties # JMeter配置文件
├── docs/ # API文档
├── extras/ # 附加功能
├── lib/ # JMeter核心库
│ └── ext/ # JMeter扩展插件
├── printable_docs/ # 可打印文档
└── LICENSE # 许可证

三、Badboy 脚本录制

3.1 Badboy 简介

Badboy是一款强大的Web测试和录制工具,支持Windows和Mac系统。它可以录制用户在浏览器中的操作,并生成可重放的测试脚本。

Badboy使用技巧

Badboy最大的优势在于可以”所见即所得”地录制脚本,操作简单直观。录制完成后可以导出为JMeter格式,大幅减少手工编写脚本的工作量。

3.2 录制脚本

Badboy 录制流程:

启动 Badboy

打开Badboy,点击工具栏的红色录制按钮(或者按F9),开始录制。

输入测试URL

在地址栏输入要测试的网站地址,如 http://www.example.com Badboy会自动打开内置浏览器访问该页面。

执行测试操作

在Badboy内置浏览器中进行正常的业务操作,如登录、搜索、下单等。 Badboy会自动记录每一步操作,生成测试步骤。

停止录制

完成所有操作后,点击停止按钮(或者按F9)。 可以在左侧的树形结构中查看录制的所有步骤。

3.3 脚本优化

录制完成的脚本通常需要进行一些优化才能用于正式测试:

常见优化项:

将硬编码的用户名、密码等数据替换为参数化变量,便于数据驱动测试。

Terminal window
# Badboy支持从CSV文件读取参数
var username = "${username}";
var password = "${password}";

对于需要动态获取的数据(如SessionID、Token),需要进行关联处理。

// 从响应中提取SessionID
var sessionId = response.getText().match(/JSESSIONID=([^;]+)/)[1];

添加检查点验证关键元素,确保脚本执行正确。

// 验证登录后是否显示用户名
if (pageContains("欢迎," + username)) {
log.info("Login successful");
}

将多个相关步骤封装为一个事务,便于统计整体响应时间。

transaction("UserLogin");
// ... 登录相关步骤 ...
transactionEnd();

3.4 导出为 JMeter 格式

脚本优化完成后,可以导出为JMeter格式:

  1. 点击菜单 File → Export to JMeter
  2. 选择保存路径和文件名
  3. 导出为 .jmx 文件
  4. 在JMeter中打开该文件进行后续配置

四、JMeter 性能测试实战

4.1 测试计划结构

JMeter使用测试计划(Test Plan)来组织和管理测试。一个完整的测试计划包含以下主要组件:

测试计划结构:

Test Plan (测试计划)
├── Thread Group (线程组)
│ ├── Once Only Controller (仅一次控制器)
│ │ └── Login Request (登录请求)
│ ├── Http Cookie Manager (Cookie管理器)
│ ├── Transaction Controller (事务控制器)
│ │ ├── Search Product (搜索商品)
│ │ ├── View Detail (查看详情)
│ │ └── Add to Cart (加入购物车)
│ ├── Gaussian Random Timer (高斯随机定时器)
│ └── View Results Tree (查看结果树)
├── Config Element (配置元件)
│ ├── Http Request Defaults
│ ├── CSV Data Set Config
│ └── User Defined Variables
├── Listener (监听器)
│ ├── Summary Report
│ ├── Graph Results
│ └── Aggregate Report
└── Non-Test Elements (非测试元素)
└── HTTP Mirror Server

4.2 线程组配置

线程组定义了虚拟用户的行为模式,是性能测试的核心配置:

关键参数:

参数说明建议值
Number of Threads虚拟用户数根据目标并发设置
Ramp-Up Period启动时间总时长/线程数
Loop Count循环次数根据测试时长设置
Duration持续时间稳定测试时长
Tip

Ramp-Up Period决定了虚拟用户的启动速度。如果设置过短,可能造成瞬时压力过大;设置过长,则无法达到目标并发。建议设置为总时长的1/3到1/2。

4.3 HTTP请求配置

HTTP请求是JMeter模拟用户操作的核心组件:

请求配置要点:

Pros
  • 支持多种HTTP方法
  • 参数化配置灵活
  • 请求头可自定义
  • Body Data支持JSON
Cons
  • 复杂请求配置繁琐
  • 需要理解HTTP协议
  • 参数编码需要注意

常用配置项:

  • Protocol:http 或 https
  • Server Name or IP:目标服务器地址
  • Port Number:端口号,默认80/443
  • Method:GET、POST、PUT、DELETE等
  • Path:请求路径
  • Parameters:请求参数(key-value形式)
  • Body Data:请求体(JSON/XML等格式)

4.4 定时器配置

定时器用于控制请求的发送节奏,模拟真实的用户行为:

常用定时器:

每次请求之间固定等待一定时间。

设置 Constant Delay = 1000ms(每次请求间隔1秒)

等待时间服从高斯正态分布,更接近真实用户行为。

Deviation = 300ms(标准差)

Offset = 1000ms(基准延迟)

控制请求的吞吐量(每分钟请求数),用于精确控制负载。

Throughput = 600(每分钟600个请求)

积压一定数量的线程后同时释放,模拟瞬间并发。

Number of Simulated Users to Group by = 50(50个用户同时释放)

4.5 监听器配置

监听器用于收集和展示测试结果,是分析性能数据的重要工具:

核心监听器:

监听器用途重要指标
View Results Tree查看每个请求的详细响应响应内容、状态码
Summary Report汇总统计报告Avg、Min、Max、Error%
Aggregate Report聚合报告90%、95%、99%分位数
Graph Results图形化展示实时吞吐量、响应时间
Response Times Over Time响应时间趋势性能稳定性

五、性能测试执行

5.1 测试场景设计

根据业务需求,设计完整的测试场景:

测试场景设计:

基准测试

单用户单循环,验证脚本正确性,确保无错误发生。

  • 线程数:1
  • 循环次数:1
  • 验证点:响应正常,无报错

负载测试

逐步增加用户数,观察系统性能变化。

  • 起始负载:10用户
  • 递增步长:10用户
  • 最大负载:100用户
  • 监控指标:响应时间、吞吐量、错误率

峰值测试

模拟业务高峰期的高并发场景。

  • 目标并发:200用户
  • 持续时间:30分钟
  • 观察指标:系统稳定性、错误率

稳定性测试

长时间持续负载,验证系统可靠性。

  • 标准负载:50%峰值
  • 测试时长:8小时
  • 监控重点:内存泄漏、资源占用趋势

5.2 执行测试

JMeter 命令行执行:

Terminal window
# 基本执行命令
jmeter -n -t testplan.jmx -l result.jtl -e -o output
# 参数说明
# -n: 非GUI模式运行
# -t: 指定测试计划文件
# -l: 指定结果文件
# -e: 生成HTML报告
# -o: 报告输出目录
Note

命令行模式比GUI模式消耗更少资源,适合执行大批量测试。建议在正式测试时使用命令行模式。

5.3 监控与调优

测试执行过程中需要持续监控系统资源:

监控指标:

  • CPU使用率:观察是否达到瓶颈
  • 内存占用:检查是否有内存泄漏
  • 磁盘I/O:高负载下磁盘可能成为瓶颈
  • 网络带宽:大并发时网络可能饱和
  • 数据库连接:观察连接池使用情况

六、性能报告生成

6.1 JMeter 报告生成

JMeter 3.0之后支持自动生成HTML报告:

报告生成命令:

Terminal window
# 执行测试并生成报告
jmeter -n -t testplan.jmx -l result.jtl -e -o ./report

报告包含内容:

  • Dashboard(概览仪表盘)
  • APDEX(应用性能指数)
  • Response Times Over Time(响应时间趋势)
  • Response Times vs Threads(响应时间vs线程数)
  • Transactions per Second(每秒事务数)
  • Response Times Percentiles(响应时间百分位)

6.2 关键性能指标

核心性能指标定义:

指标定义合格标准
平均响应时间所有请求响应时间的平均值< 3秒
90%分位响应时间90%请求的响应时间上限< 5秒
吞吐量每秒处理的请求数根据业务需求
错误率失败请求占总请求的比例< 1%
并发用户数同时发起请求的用户数量根据目标设计

6.3 性能测试报告模板

一份专业的性能测试报告应包含以下内容:

报告大纲:

测试概述

  • 测试背景和目的
  • 测试范围和环境
  • 测试工具和版本

测试环境

  • 硬件配置(服务器、网络)
  • 软件配置(操作系统、数据库、中间件)
  • 测试数据准备

测试策略

  • 测试类型和场景
  • 测试数据量级
  • 监控方案

测试结果

  • 核心指标汇总
  • 详细数据表格
  • 图表展示

问题分析

  • 发现的问题列表
  • 问题根因分析
  • 优化建议

测试结论

  • 系统性能评估
  • 风险评估
  • 建议和改进方向

七、大厂认证经验

7.1 认证背景

在完成内部性能测试后,我们需要将系统提交给某大厂进行认证审核。这家大厂对性能有严格的要求,我们需要证明系统能够承受预期的业务负载。

系统需要能够承受500用户并发,峰值响应时间不超过5秒,错误率不超过0.5%,且在持续1小时的压力测试中保持稳定。

认证要求

7.2 认证准备

认证前准备事项:

确保测试环境与生产环境配置一致,包括服务器、网络、数据库等。如有差异需要明确说明。

测试脚本需要经过充分验证,确保能够正确模拟用户行为,响应结果符合预期。

测试数据需要覆盖各种业务场景,包括正常数据和异常数据,确保测试的全面性。

性能测试报告需要专业、完整,包括测试方法、结果分析、问题和建议等所有必要内容。

7.3 认证过程

认证审核流程:

材料提交

提交完整的性能测试报告,包括测试方案、环境配置、测试结果、问题分析等内容。

材料审核

大厂技术团队对提交的文档进行审核,确认测试方法的合理性和结果的准确性。

现场测试

在大厂技术人员的监督下,执行现场性能测试,全程录像记录。

问题答疑

对审核过程中的疑问进行解答,提供更详细的测试数据和日志。

结果确认

确认测试结果符合要求后,颁发性能认证证书。

7.4 认证通过的关键

认证通过经验总结:

Pros
  • 测试方法规范标准
  • 测试覆盖全面完整
  • 结果数据真实可靠
  • 问题分析深入到位
  • 报告文档专业清晰
Cons
  • 测试环境一致性难保证
  • 数据准备工作量较大
  • 部分指标理解有分歧

经验教训:

  1. 测试方法要规范:严格按照行业标准和最佳实践执行测试
  2. 数据要真实:使用真实的生产数据或模拟数据,确保测试的有效性
  3. 结果要可复现:测试过程需要完整记录,确保结果可复现
  4. 问题要分析透:对发现的问题要深入分析根因,不能只停留在表面
  5. 文档要专业:报告文档要专业、完整、易读,方便审核人员理解
Tip

认证审核不仅是考核,更是一次学习机会。认真对待审核过程中的每一个问题,都会让你对性能测试有更深入的理解。

7.5 认证结果

经过团队的努力,我们最终顺利通过了认证审核,各项指标均达到要求:

认证结果:

指标要求实际结果状态
响应时间(90分位)< 5秒3.2秒✅ 通过
吞吐量> 100 TPS156 TPS✅ 通过
错误率< 0.5%0.12%✅ 通过
CPU使用率< 80%67%✅ 通过
内存使用率< 85%72%✅ 通过

这次性能测试认证经历让我深刻认识到,性能测试不仅是技术工作,更需要严谨的态度和规范的方法。感谢团队的共同努力,我们顺利通过了认证!

认证总结

八、总结与展望

8.1 学习总结

通过这次学习JMeter和Badboy并通过认证的经历,我有以下收获:

掌握了性能测试方法

学会了从测试计划设计、脚本开发、测试执行到报告输出的完整流程。

理解了性能测试核心指标

深入理解了响应时间、吞吐量、并发数、错误率等核心指标的含义和计算方法。

积累了认证经验

了解了认证审核的流程和要求,积累了应对认证审核的经验。

提升了问题分析能力

通过对测试结果的分析,提升了定位性能瓶颈和优化建议的能力。

8.2 后续学习方向

性能测试是一个需要持续学习的领域:

  • 深入学习性能监控:掌握更多性能监控工具和技术
  • 学习性能调优:了解JVM调优、数据库优化、缓存技术等
  • 探索自动化:将性能测试集成到CI/CD流程中
  • 关注新技术:云性能测试、微服务性能测试等新方向
Tip

性能测试是一项需要不断实践和积累经验的技能。多做项目、多分析数据、多总结经验,能力自然会不断提升。

8.3 给初学者的建议

JMeter学习建议:

  1. 从基础开始:先掌握基本组件的使用,再逐步深入高级功能
  2. 多做实践:理论知识需要通过实践来巩固,多做实际项目
  3. 注重原理:不仅要会操作,还要理解背后的原理
  4. 善用资源:JMeter社区和文档是学习的宝库,多查阅多交流
  5. 形成规范:建立自己的测试方法和报告模板,提高工作效率

性能测试之路刚刚开始,未来还有更多的知识和技能等待学习和探索。

# // CONTENTS