一、什么是性能测试?
性能测试是一种非功能性测试,主要目的是评估系统在特定负载条件下的响应时间、吞吐量、资源利用率和稳定性。性能测试不仅仅关注系统是否能正常运行,还关心在不同负载下是否会发生性能瓶颈,确保应用程序能够应对大规模并发用户的访问。
二、性能测试流程
-
需求分析:
- 明确性能目标,比如最大支持用户数、响应时间、吞吐量等。
-
测试设计:
- 设计测试场景,明确要测试哪些业务功能、用户行为,以及对应的负载和压力。
-
脚本编写(注意参数化、关联):
- 根据业务场景编写测试脚本,确保脚本能真实地模拟用户行为。
-
执行测试:
- 按照设计好的场景执行测试,逐步增加负载以观察系统性能变化。
-
监控与分析:
- 在测试期间监控服务器性能,收集数据。
-
结果分析与优化:
- 通过分析测试结果,发现性能瓶颈,提出优化方案。
三、性能指标
吞吐量 (Throughput):
-
- 单位时间内系统能够处理的请求数量或数据量。高吞吐量通常意味着系统具备更高的并发处理能力。
响应时间(一般不高于1.5s):
-
- 从用户发送请求到收到响应的时间。这个指标通常会影响用户体验。
资源利用率(一般低于80%):
-
- 监控CPU、内存、磁盘、网络带宽等资源的使用情况,帮助识别是否有瓶颈。
成功率(一般是99.99%):
四、性能测试的分类
- 基准测试(Benchmark Testing):
- 目的是确定系统在单个接口单个用户,没有压力下的基准性能指标。
-
负载测试 (Load Testing)(加压):
- 目的是确定系统在期望的负载条件下的表现。它通过模拟预期的用户数量来测试系统的响应时间和稳定性。
- 示例:测试电商网站在促销活动时能否同时处理成千上万的订单请求。
-
压力测试 (Stress Testing)(极限):
- 将系统推到极限,甚至超出预期负载,测试在异常高负载下系统的表现。
- 目的是找出系统的崩溃点以及在压力下的恢复能力。
- 示例:测试系统在高流量、数据库崩溃或硬件故障时的响应。
-
容量测试 (Capacity Testing):
- 测试系统能够处理的最大负载,以确定其最大处理能力。
- 帮助确定系统是否需要扩展资源来处理更多用户。
-
稳定性测试 (Stability/Soak Testing)(恒定压力):
- 长时间运行负载测试,检查系统是否会在持续高负载下出现内存泄漏、性能下降等问题。
- 示例:模拟网站24小时不停歇地处理请求,检查内存使用情况。
-
峰值测试 (Spike Testing):
- 测试系统在短时间内大量请求的情况下是否能够快速适应并恢复,模拟突然的流量激增情况。
五、性能测试工具:
-
JMeter:
- 一个开源的性能测试工具,适用于Web应用、数据库、FTP服务器等的测试。
-
LoadRunner:
- 商业级性能测试工具,功能强大,支持广泛的协议和复杂场景的模拟。
-
Gatling:
- 针对开发者的开源性能测试工具,基于Scala编写,擅长高并发测试。
-
k6:
- 现代化的开源负载测试工具,提供脚本化和云端集成,适用于测试API和微服务。
六、定位性能问题:
- 代码层:如:日志、exception、error。
- 数据库层:如:慢查询、数据连接池、死锁。
- 架构层:JVM、中间件nginx、MQ。
- 配置层:服务器。