软件测试入门——第三十四课(软件性能测试与JMeter实战入门指南)
一、性能测试基础概念
1.1 什么是性能测试?
性能测试是通过模拟真实用户负载,验证系统在特定条件下的响应时间、吞吐量、资源利用率等指标是否满足预期要求的测试过程。它是保障软件系统稳定性和可扩展性的关键环节。
1.2 性能测试的核心目标
- 评估系统容量:确定系统在正常和峰值负载下的处理能力
- 发现性能瓶颈:识别CPU、内存、I/O、网络等资源瓶颈
- 验证稳定性:确保系统在长时间运行下不会出现性能衰减
- 优化系统配置:为系统调优提供数据支持
二、性能测试实施流程
2.1 需求分析与场景设计
关键步骤:
- 业务理解:深入分析被测系统的业务逻辑、用户行为模式
- 性能指标定义:
- 响应时间:单事务/页面加载时间
- 吞吐量:单位时间内处理的请求数
- 并发用户数:同时在线操作的用户数量
- 资源利用率:CPU、内存、磁盘、网络使用率
- 测试场景设计:
- 基准测试:单用户验证功能正确性
- 负载测试:模拟正常业务压力
- 压力测试:逐步增加负载至系统极限
- 稳定性测试:长时间运行验证系统稳定性
2.2 测试计划制定
计划要素:
- 测试范围与目标
- 测试环境配置(硬件、软件、网络)
- 测试数据准备策略
- 风险评估与应对方案
- 团队分工与时间安排
2.3 测试执行与监控
执行阶段:
- 环境准备:搭建与生产环境相似的测试环境
- 脚本开发:使用JMeter等工具录制/编写测试脚本
- 数据准备:准备足够的测试数据,避免数据瓶颈
- 执行监控:实时监控系统资源使用情况
- 问题定位:分析性能瓶颈,提出优化建议
2.4 测试报告与优化
报告内容:
- 测试概述与目标
- 测试环境配置详情
- 性能测试结果数据
- 性能瓶颈分析
- 优化建议与改进方案
- 测试结论与风险评估
三、JMeter安装与配置详解
3.1 环境准备:JDK安装
3.1.1 JDK下载与安装
下载地址:访问Oracle官网或OpenJDK项目获取JDK安装包
- Oracle JDK:https://www.oracle.com/java/technologies/downloads/
- OpenJDK:https://adoptium.net/
安装步骤:
# 1. 运行安装程序,选择安装路径(建议:D:\Java\jdk1.8.0_xxx)# 2. 安装过程中会提示安装JRE,建议与JDK同一目录# 3. 完成安装后验证版本java-version
3.1.2 环境变量配置(Windows系统)
系统变量配置:
新建JAVA_HOME变量:
变量名:JAVA_HOME 变量值:D:\Java\jdk1.8.0_191 # 替换为实际安装路径修改Path变量:
在Path变量值末尾追加: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;验证配置:
# 打开命令提示符,执行以下命令 java -version javac -version # 查看Java安装位置 where java where javac
常见问题解决:
- Java命令不生效:检查Path变量中是否存在多个Java路径,保留正确的即可
- 版本冲突:将系统自带的java.exe重命名或调整Path顺序
3.2 JMeter安装与启动
3.2.1 JMeter下载
官方下载地址:http://jmeter.apache.org/download_jmeter.cgi
版本选择建议:
- 生产环境:选择稳定版本(如5.4.3)
- 学习测试:可选择最新版本体验新功能
3.2.2 安装步骤
解压安装包:
# 将下载的apache-jmeter-5.3.zip解压到指定目录# 建议路径:D:\Tools\apache-jmeter-5.3启动JMeter:
# 方法1:双击bin目录下的jmeter.bat# 方法2:通过命令行启动cdD:\Tools\apache-jmeter-5.3\bin jmeter.bat
3.2.3 界面语言设置
修改配置文件:
- 打开
bin/jmeter.properties文件 - 找到
language=配置项 - 修改为:
language=zh_CN
- 打开
临时设置:
- 启动JMeter后,通过菜单修改:Options → Choose Language → Chinese
3.2.4 启动问题排查
问题:JMeter闪退
解决方案:
# 1. 以管理员身份打开命令提示符 # 2. 切换到JMeter的bin目录 cd /d D:\Tools\apache-jmeter-5.3\bin # 3. 执行启动命令,查看错误信息 jmeter.bat # 4. 常见原因及解决: # - Java环境未正确配置:重新配置JAVA_HOME和Path # - 端口冲突:修改jmeter.properties中的server_port # - 内存不足:调整bin/jmeter.bat中的HEAP设置四、JMeter核心组件详解
4.1 测试计划结构
JMeter按照树形结构组织测试元素,执行顺序遵循以下规则:
- 配置元件:最先执行,用于初始化测试数据
- 前置处理器:在采样器之前执行
- 定时器:在采样器之前执行(除非作用域不同)
- 采样器:执行实际的请求
- 后置处理器:在采样器之后执行
- 断言:验证响应结果
- 监听器:收集和展示测试结果
4.2 线程组配置
线程组是性能测试的负载模型,主要参数:
# 基础配置示例 线程数:100 # 模拟的并发用户数 Ramp-Up时间:5秒 # 在5秒内启动所有线程 循环次数:永远 # 持续运行,或指定循环次数 调度器:启用 # 设置测试持续时间 持续时间:600秒 # 测试运行10分钟参数详解:
- 线程数:虚拟用户数量,代表同时执行测试的用户
- Ramp-Up时间:控制线程启动速度,避免瞬间高并发
- 循环次数:每个线程执行测试计划的次数
- 调度器:控制测试的开始时间、结束时间和持续时间
4.3 常用断言类型
4.3.1 响应断言
用途:验证HTTP响应内容是否符合预期
配置要点:
- 测试字段:响应文本、响应代码、响应消息等
- 匹配模式:包含、匹配、相等、子字符串等
- 自定义失败消息:便于问题定位
4.3.2 断言持续时间
用途:性能测试中验证响应时间是否在可接受范围内
配置示例:
最大持续时间:2000毫秒 # 响应时间超过2秒则断言失败4.3.3 断言大小
用途:验证响应数据大小
应用场景:
- 确保API返回数据量在合理范围
- 检测是否返回了完整的数据集
- 预防数据传输过程中的截断问题
4.4 监听器使用指南
4.4.1 察看结果树
功能:查看每个请求的详细请求和响应信息
使用场景:
- 调试阶段:查看请求参数和响应内容
- 问题排查:分析失败请求的具体原因
- 数据验证:确认返回数据格式和内容
注意事项:
- 生产压测时禁用,避免内存溢出
- 可配置仅保存错误日志,减少资源消耗
4.4.2 聚合报告
核心性能指标:
| 指标 | 说明 | 理想范围 |
|---|---|---|
| 平均值 | 平均响应时间 | 根据业务要求设定 |
| 中位数 | 50%请求的响应时间 | 应接近平均值 |
| 90%百分位 | 90%请求的响应时间 | < 平均值的2倍 |
| 95%百分位 | 95%请求的响应时间 | < 平均值的3倍 |
| 最小值 | 最快响应时间 | - |
| 最大值 | 最慢响应时间 | 不应有异常峰值 |
| 异常% | 失败请求比例 | < 1% |
| 吞吐量 | 每秒处理请求数 | 越高越好 |
| 接收/发送KB/sec | 网络吞吐量 | 根据带宽评估 |
4.4.3 保存结果到文件
配置步骤:
- 添加监听器 → 保存响应到文件
- 配置文件名和路径
- 选择保存内容:仅错误、所有样本等
- 配置文件格式:CSV、XML、JSON
乱码解决方案:
# 方法1:修改JMeter配置文件# 在jmeter.properties中添加:sampleresult.default.encoding=UTF-8# 方法2:处理已生成的文件# 用记事本打开CSV文件 → 另存为 → 编码选择ANSI → 用Excel打开4.4.4 JMeter基础介绍
jmeter本身不需要安装,只需要配置好JDK环境,然后在在jmeter文件中的bin文件中打开jmeter.bat文件即可
最新版本,建议配置的JDK最好用1.7及以上版本
一、基础构成
1、组成部分
1)负载发生器:产生负载,多进程或多线程模拟用户行为
2)用户运行器:脚本运行引擎,用户运行器附加在进程或线程上,根据脚本模拟指定的用户行为
3)资源生成器:生成测试过程中服务器、负载机的资源数据
4)报表生成器:根据测试中获得的数据生成报表,提供可视化的数据显示方式·
2、主要概念
2.1测试计划(test plan)
描述一个性能测试,包含本次测试所有相关功能
2.2.threads(users)线程
Setup thread group:
一种特殊类型的线程,可用于执行预测试操作。即执行测试前进行定期线程组的执行
Teardown thread group:
一种特殊类型的线程,可用于执行测试后动作。即执行测试结束后执行定期的线程组
以上两个线程组,举个例子:loadrunner的脚本除了action里是真正的脚本核心内容,还有初始化“环境”的初始化脚本和测试完毕后对应的清除信息的脚本块,与其对应
Thread group:
通常添加使用的线程,一般一个线程组可看做一个虚拟用户组,其中每个线程为一个虚拟用户
2.3测试片段(test fragment)
2.5版本之后新增的一个选项,是一种特殊的线程组,在测试树上与线程组一个层级,但是它不被执行,除非它是一个模块控制器或者被控制器所引用时才会被执行
2.4控制器
Jmeter有2种控制器:取样器(sampler)和逻辑控制器(Logic Controller)
作用:用这些原件驱动处理一个测试
1)取样器(Sampler)
是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler
如 HTTP Request Sampler 、 FTP Request Sampler 、TCP Request Sampler 、JDBC Request Sampler 等
每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。
Java Request Sampler 和 Beanshell Request Sampler 是两种特殊的可定制的 Sampler (暂不讨论)
2)逻辑控制器(Logic Controller)
包含两类原件:
一类是控制Test Plan中Sampler节点发送请求的逻辑顺序控制器,常用的有:If Controller、Swith Controller、Loop Controller、Random Controller等
另一类是用来组织和控制Sampler节点的,如Transaction Controller、Throughput Controller等
2.5监听器(Listener)
对测试结果进行处理和可视化展示的一系列组件,常用的有图形结果、查看结果树、聚合报告等
以上的五类原件就可以构成一个简单的性能测试脚本
下面再介绍几种jmeter提供的其他组件:
2.6配置原件(Config Element)
用于提供对静态数据配置的支持。CSV Date Set Config可以将本地数据文件形成数据池(Date Pool),而对应于HTTP Request Configuration
和TCP Request Sample等类型的Configuration元件则可以修改这些Sample的默认数据等
2.7定时器(Time)
用于操作之间设置等待时间,等待时间使性能测试中常用的控制客户端QPS的手段,jmeter定义了Constant Times、
Constant Throughput Times、Guass Ramdon Times等不同类型的Times
2.8断言(Assertions)
用于检查测试中得到的响应数据等是否符合预期,Assertions一般用来设置检查点,用以保证性能测试过程中的数据交互与预期一致
2.9前处理器(Pre Processors)
用于在实际请求发出之前对即将发出的请求进行特殊处理。
例如:Count处理器可以实现自增操作,自增后生成的的数据可以被将要发出的请求使用,而HTTP URL Re—Writing Modifier处理器则可以实现URL重写,
当URL中有sessionID一类的session信息时,可以通过该处理器填充发出请求实际的sessionID。
2.10后处理器(Post Processors)
用于对Sampler发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据(类似loadrunner中的关联)。
例如:Regular Expression Extractor用于提取响应数据中匹配某正则表达式的数据段,并将其填充在参数中,Xpath Extractor则可以用于提取响应数据中通过给定Xpath值获得的数据
五、性能测试最佳实践
5.1 测试环境规划
- 环境隔离:测试环境与生产环境隔离,避免相互影响
- 数据准备:使用真实数据或模拟数据,保证数据代表性
- 监控部署:提前部署系统监控工具(如JConsole、VisualVM)
5.2 脚本开发规范
- 参数化:使用CSV数据文件或随机函数生成测试数据
- 关联处理:正确处理动态参数(如Session ID、Token)
- 思考时间:模拟真实用户操作间隔
- 断言策略:合理设置断言,避免误判
5.3 测试执行策略
- 预热阶段:先运行低负载测试,让系统达到稳定状态
- 梯度加压:逐步增加并发用户数,观察系统表现
- 峰值测试:在系统极限负载下运行,发现瓶颈
- 稳定性测试:长时间运行,检查内存泄漏等问题
5.4 结果分析与报告
分析维度:
- 响应时间趋势分析
- 吞吐量与并发用户关系
- 资源使用率分析
- 错误率与系统稳定性
报告模板:
1. 测试概述 2. 测试环境 3. 测试场景与目标 4. 测试结果数据 5. 性能瓶颈分析 6. 优化建议 7. 测试结论六、常见问题与解决方案
6.1 JMeter内存优化
# 修改bin/jmeter.bat中的内存设置 set HEAP=-Xms1g -Xmx4g # 初始1G,最大4G set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50% set TENURING=-XX:MaxTenuringThreshold=26.2 分布式测试配置
控制机配置:
- 修改bin/jmeter.properties中的remote_hosts
- 启动远程服务器:jmeter-server.bat
执行命令:
jmeter-n-ttestplan.jmx-R192.168.1.101,192.168.1.102-lresult.jtl
6.3 测试数据管理
- 使用CSV Data Set Config管理测试数据
- 定期清理测试数据,避免数据污染
- 使用随机函数生成唯一性数据
通过系统学习上述内容,您将能够独立完成企业级性能测试任务,为软件系统的稳定性和可扩展性提供有力保障。