3. 测试工具选型:JMeter、wrk、Locust 基础与选择策略

说到吞吐测试,选对工具等于成功了一半。我见过不少团队,工具选错了,折腾半天数据根本没法看。今天咱们就把 JMeter、wrk、Locust 这三款主流工具掰开揉碎聊一聊。

3.1 JMeter 基础使用

JMeter 是老牌劲旅了。我最早接触性能测试就是用它,那时候还在做电商项目,压测登录接口。说实话,它的 GUI 界面第一次看确实有点懵,但用顺手了会发现它真的很强大。

核心概念

  • 线程组:模拟用户数,相当于并发量
  • 取样器:发什么请求(HTTP、JDBC 等)
  • 监听器:看结果(聚合报告、图形结果)
  • 断言:判断请求是否成功

快速上手

创建一个 HTTP 请求的测试计划,大概就这几步:

  1. 添加线程组,设置线程数(比如 100)、Ramp-Up 时间(10 秒)、循环次数
  2. 添加 HTTP 请求默认值,填好协议、域名、端口
  3. 添加 HTTP 请求取样器,填路径和参数
  4. 添加聚合报告监听器
  5. 点绿色三角运行

关键参数解读:聚合报告里的 Throughput 就是吞吐量(单位通常是 requests/sec)。90% Line 表示 90% 的请求在多少毫秒内完成,这个比平均响应时间更有参考价值。

我的经验:JMeter 跑分布式压测时,Controller 和 Agent 的时间一定要同步。我曾经因为时间差了几秒,聚合出来的数据全是乱的,排查了半天才发现是 NTP 没配好。

3.2 wrk 基础使用

wrk 是个轻量级选手,用 C 写的,性能极高。说白了,它就是一把手术刀,专门用来快速测量单接口的吞吐上限。

安装与基本命令

# 安装(Mac)
brew install wrk

# 基本用法
wrk -t12 -c400 -d30s http://localhost:8080/api/test

参数含义:-t 是线程数,-c 是连接数,-d 是持续时间。

输出解读

Running 30s test @ http://localhost:8080/api/test
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    45.67ms   12.34ms 198.00ms   75.00%
    Req/Sec   723.45     89.21     1.02k    70.00%
  259842 requests in 30.00s, 38.97MB read
Requests/sec:   8661.40
Transfer/sec:      1.30MB

看到 Requests/sec: 8661.40 了吗?这就是吞吐量。wrk 的输出非常干净,没有多余的东西。

注意:wrk 只支持 HTTP/1.1,不支持 HTTPS(除非编译时加了 OpenSSL)。而且它不能做复杂的业务逻辑,比如登录态保持、参数关联。它就是纯压测工具,不是测试框架。

3.3 Locust 基础使用

Locust 是用 Python 写的,它的设计理念很特别——用代码定义用户行为。我个人很喜欢这种方式,因为可编程性极强。

一个简单的压测脚本

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 5)  # 用户等待时间 1-5 秒

    @task
    def view_homepage(self):
        self.client.get("/")

    @task(3)
    def view_item(self):
        self.client.get("/item?id=1001")

你看,@task(3) 表示这个接口被访问的概率是前者的 3 倍。这种权重设计在模拟真实用户行为时特别有用。

运行与监控

# 启动 Web 界面
locust -f locustfile.py --host=http://localhost:8080

打开浏览器访问 http://localhost:8089,就能看到实时图表。Locust 的 Web UI 做得相当漂亮,可以动态调整并发数,这点 JMeter 和 wrk 都比不了。

适用场景:需要模拟复杂用户行为、需要动态调整压测参数、团队熟悉 Python。不适合纯性能基准测试,因为 Locust 自身的开销比 wrk 大不少。

3.4 工具对比与选择策略

这三款工具各有千秋。我画了张图,帮你快速理清思路:

吞吐测试工具选型决策图 你的测试目标是什么? 快速基准测试 wrk 复杂业务场景 JMeter 灵活可编程 Locust 选型建议 • 单接口压测、快速摸高 → wrk(轻量、高效) • 复杂业务流程、分布式压测 → JMeter(生态完善) • 自定义用户行为、动态调整 → Locust(Python 友好)

详细对比表

维度 JMeter wrk Locust
开发语言 Java C Python
学习曲线 中等(GUI 复杂) 低(命令简单) 低(Python 基础)
最大并发能力 高(分布式) 极高(单机万级) 中(受 Python GIL 限制)
协议支持 HTTP/HTTPS/JDBC/FTP 等 HTTP/1.1 HTTP/HTTPS(可扩展)
结果报告 丰富(图表、HTML 报告) 简单(命令行输出) 实时 Web 图表
分布式支持 原生支持 不支持 支持(需额外配置)
适用场景 全链路压测、复杂场景 快速基准测试 行为模拟、持续集成

我的选择策略

嗯,这里我直接给结论:

  • 想快速知道接口能扛多少 QPS → 用 wrk,30 秒出结果
  • 要做完整的性能回归,有复杂的业务逻辑 → 用 JMeter,它的插件生态能帮你搞定大部分问题
  • 团队全是 Python 工程师,需要灵活定制 → 用 Locust,写代码比拖拽组件快多了

避坑指南:我曾经在一个项目里只用 wrk 压测,结果上线后接口在高峰期挂了。后来发现 wrk 的请求模式太单一,没有模拟真实用户的思考时间和行为分布。所以我的建议是:wrk 用来摸高,JMeter 或 Locust 用来做精细化压测,两者结合才是王道。