3. 性能测试基础:测试类型与工具选型

性能测试这事儿,说白了就是给系统“称体重”。你得知道它到底能扛多少活,什么时候会累趴下。我做了这么多年性能优化,见过太多上线前没测透,结果被用户流量冲垮的案例。今天咱们就把这块地基打牢。

3.1 三种核心测试类型

性能测试不是一锤子买卖。我个人习惯把它分成三类,每类解决不同的问题。

3.1.1 负载测试

负载测试,就是看系统在“正常”工作状态下的表现。比如你预期每天有10万用户访问,那就模拟10万用户来跑一跑。

核心目标:

  • 验证系统能否支撑预期流量
  • 找到系统的最佳工作点
  • 确认响应时间、吞吐量是否达标

我在项目中遇到过一件事:某电商平台做双11前的负载测试,模拟了80%的预期流量,一切正常。结果上线当天,流量只到了60%就开始卡顿。后来发现是测试数据太“干净”,没有考虑真实用户的数据分布。嗯,这里要注意:测试数据一定要贴近生产环境。

3.1.2 压力测试

压力测试就有点“暴力”了。它要找到系统的极限在哪里。说白了,就是一直加压,直到系统崩溃。

核心目标:

  • 找到系统的性能拐点
  • 观察系统崩溃后的恢复能力
  • 验证限流、降级等保护机制是否生效

我曾经做过一个支付系统的压力测试。加压到正常流量的3倍时,系统突然返回了大量500错误。你以为这是坏事?其实不是。这说明我们的限流阈值设置得太高了,应该提前触发保护。你想想看,与其让系统直接挂掉,不如优雅地拒绝一部分请求。

⚠️ 避坑指南: 我曾经犯过一个错误:压力测试只测了10分钟。结果系统在15分钟时才开始出现内存泄漏。所以压力测试的时间要足够长,至少持续30分钟以上。

3.1.3 稳定性测试

稳定性测试,也叫“耐力测试”。它不追求高并发,而是看系统能不能长时间稳定运行。比如跑个72小时,看看内存会不会涨,连接会不会断。

核心目标:

  • 发现内存泄漏问题
  • 验证连接池、线程池的回收机制
  • 检查日志、监控系统是否正常工作

我记得有个项目,负载测试和压力测试都过了,结果上线一周后,数据库连接池被耗尽。原因就是某个接口没有正确释放连接。稳定性测试就是专门抓这种“慢性病”的。

3.2 测试工具选型

工具选得好,测试事半功倍。我这些年用过不少工具,挑三个最常用的聊聊。

3.2.1 JMeter

JMeter 是老牌工具了,功能非常全面。它支持各种协议,HTTP、JDBC、JMS 都能测。

优点:

  • 图形化界面,上手快
  • 插件生态丰富
  • 支持分布式压测

缺点:

  • 资源消耗大,单机并发有限
  • 脚本维护成本高

我个人习惯用 JMeter 做中小型项目的性能测试。它的图形化界面确实方便,团队成员都能看懂。

3.2.2 Locust

Locust 是用 Python 写的,脚本就是代码。它最大的特点是“轻量”和“灵活”。

优点:

  • 代码化脚本,易于版本管理
  • 支持分布式,扩展性好
  • Web 界面实时查看结果

缺点:

  • 需要 Python 基础
  • 协议支持不如 JMeter 全面

来看一个简单的 Locust 脚本示例:

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 5)
    
    @task
    def index_page(self):
        self.client.get("/")
    
    @task(3)
    def view_item(self):
        self.client.get("/item?id=1001")

这段代码模拟了用户访问首页和商品详情页的行为。你看,代码非常简洁,而且可以轻松集成到 CI/CD 流水线中。

3.2.3 wrk

wrk 是个命令行工具,用 C 语言写的。它最大的特点就是“快”。

优点:

  • 性能极高,单机可以压出几十万 QPS
  • 资源消耗极低
  • 适合做基准测试

缺点:

  • 只支持 HTTP 协议
  • 功能单一,没有图形界面

我一般用 wrk 做快速验证。比如改了个配置,想知道效果怎么样,跑一下 wrk 几秒钟就出结果了。

wrk -t12 -c400 -d30s http://localhost:8080/api

这条命令的意思是:用12个线程,保持400个并发连接,持续压30秒。

3.3 工具选型对比

特性 JMeter Locust wrk
上手难度 低 中 高
脚本灵活性 中 高 低
单机性能 中 中 高
协议支持 多 中 少
分布式支持 好 好 差
适用场景 综合测试 灵活定制 基准测试
💡 我的建议: 如果你刚入门,先从 JMeter 开始。等遇到复杂场景了,再考虑 Locust。wrk 可以作为辅助工具,专门做快速验证。

3.4 知识体系总览

下面这张图,把本章的核心内容串起来了。你可以把它当作一个“速查地图”。

性能测试基础:类型与工具 测试类型 负载测试 验证预期流量 找到最佳工作点 压力测试 找到系统极限 验证保护机制 稳定性测试 长时间运行 发现慢性问题 工具选型 JMeter 图形化界面 协议支持丰富 Locust 代码化脚本 灵活可扩展 wrk 高性能基准测试 资源消耗极低 选型建议 入门首选 JMeter 复杂场景 Locust 快速验证 wrk 组合使用 取长补短 效果最佳
📌 核心要点:
  • 负载测试看“能不能扛”,压力测试看“极限在哪”,稳定性测试看“能扛多久”
  • 工具没有绝对的好坏,关键看场景。JMeter 适合综合测试,Locust 适合灵活定制,wrk 适合快速验证
  • 测试数据要贴近生产环境,测试时间要足够长

好了,性能测试的基础就聊到这儿。记住一点:测试不是走过场,而是为了发现真实问题。你投入多少心思,系统就会回报你多少稳定。

可可精品资料库