一、性能测试基础:定义、目的与分类
1.1 性能测试到底在测什么?
先问大家一个问题:你写了一个接口,本地跑起来响应时间 5ms,你觉得稳了。结果上线后用户一多,直接飙到 5 秒。为什么会这样?
这就是性能测试要解决的问题。说白了,性能测试就是「在特定负载下,观察系统能不能扛得住、跑得快」。我个人的理解更直白一些:它是在模拟真实用户的行为,看看系统会不会崩、会不会慢、会不会丢数据。
我记得刚入行那会儿,有个同事把性能测试和压力测试混为一谈。其实它们有区别,后面我会细说。但核心目标就三个:
- 验证系统能不能满足预期的性能指标(比如 QPS 要达到 1000)
- 发现系统的性能瓶颈(到底是 CPU 不够,还是数据库慢?)
- 评估系统的稳定性和容量(能支撑多少用户同时在线?)
核心要点:性能测试不是「测一次就完事」,它是一个持续的过程。每次代码变更、架构调整,都可能影响性能表现。
1.2 性能测试的分类,你分得清吗?
很多新手容易把各种「性能测试」名词搞混。我按自己的经验,把它们分成四类:
| 类型 | 目的 | 典型场景 |
|---|---|---|
| 负载测试 | 验证系统在预期负载下的表现 | 模拟 1000 用户并发访问首页 |
| 压力测试 | 找到系统的极限在哪里 | 逐步增加并发,直到系统崩溃 |
| 稳定性测试 | 验证系统长时间运行是否正常 | 持续压测 24 小时,观察内存泄漏 |
| 容量测试 | 评估系统能支撑的最大用户数 | 根据业务增长预测,规划扩容 |
嗯,这里要注意:实际项目中,这些测试往往是组合使用的。比如先做负载测试确认基线,再做压力测试找极限,最后跑稳定性测试看长期表现。
我的经验:我曾经在一个电商项目中,只做了负载测试就上线了。结果双十一当天,系统在峰值流量下直接挂了。后来复盘发现,压力测试没做,根本不知道极限在哪里。从那以后,我每个项目都会把压力测试作为必选项。
1.3 性能回归:为什么每次改代码都要重新测?
性能回归测试,说白了就是「每次代码变更后,重新跑一遍性能测试,确保新代码没有让性能变差」。你想想看,一个功能迭代,可能只是加了一个日志,结果导致数据库连接池被占满。这种事情我遇到过不止一次。
性能回归的核心逻辑很简单:
- 建立基线:在代码变更前,跑一次完整的性能测试,记录所有指标。
- 执行变更:部署新代码。
- 对比测试:用同样的场景和参数,再跑一次。
- 分析差异:响应时间变长了?吞吐量下降了?CPU 使用率升高了?
避坑指南:我曾经在一次回归测试中,发现响应时间下降了 20%,高兴得不行。结果仔细一看,是因为测试环境的缓存没清,命中了旧数据。所以回归测试一定要保证环境一致,包括缓存、数据库状态、网络延迟等。
1.4 吞吐量:系统真正的「产能」
吞吐量,英文叫 Throughput,是性能测试里最核心的指标之一。它衡量的是「单位时间内系统能处理多少请求」。常见的单位有:
- QPS(Queries Per Second):每秒查询数,常用于读场景。
- TPS(Transactions Per Second):每秒事务数,常用于写场景。
- RPS(Requests Per Second):每秒请求数,通用指标。
我个人的习惯是,在压测报告中优先关注 TPS,因为它更能反映系统的真实处理能力。举个例子:一个下单接口,QPS 可能很高,但每个请求只查一次数据库。而 TPS 包含了整个下单流程(查库存、扣余额、生成订单),更能体现系统的负载能力。
吞吐量和响应时间的关系,就像「流水线」和「单件工时」:
- 响应时间短,不一定吞吐量高(比如串行处理,一次只能处理一个)。
- 吞吐量高,不一定响应时间短(比如并行处理,但每个请求排队时间长)。
关键公式:吞吐量 = 并发数 / 平均响应时间。这个公式虽然简单,但能帮你快速估算系统容量。比如你希望 QPS 达到 1000,平均响应时间是 200ms,那么并发数至少需要 200。
1.5 本章知识体系图
下面这张图,是我自己总结的性能测试基础框架。你可以把它当作一张「地图」,后续章节都会围绕这些核心概念展开。
1.6 本章小结
这一章我们聊了性能测试的「骨架」:
- 性能测试的定义:模拟负载,验证系统表现。
- 四种分类:负载、压力、稳定性、容量,各有各的用途。
- 性能回归:每次改代码都要重新测,别偷懒。
- 吞吐量:系统的「产能」,用 QPS/TPS 来衡量。
我个人觉得,理解这些基础概念,比学会用工具更重要。工具只是手段,思路才是核心。下一章我们会深入具体的压测工具和实战场景,到时候这些概念都会用上。
一个小建议:如果你刚开始接触性能测试,可以先从「负载测试」入手,用 JMeter 或 Locust 跑一个简单的接口。先感受一下「并发数」和「响应时间」之间的关系,比看十篇文章都管用。