环境与工具准备:JMeter / Locust / Gatling 选型对比、安装与第一个脚本

做压测,选对工具是第一步。我见过不少团队,工具选错了,后面折腾半天才发现根本不适合自己的场景。今天咱们就把 JMeter、Locust、Gatling 这三款主流工具掰开揉碎讲清楚,然后带你把环境搭好,跑出第一个 Hello World 脚本。

三款工具的核心差异

先看一张对比表,心里有个底:

维度 JMeter Locust Gatling
开发语言 Java(GUI + XML) Python Scala / Java DSL
脚本方式 GUI 拖拽 + 少量配置 纯代码(Python 类) DSL 代码(Scala / Java)
并发模型 线程池(每个 VU 一个线程) 协程(gevent) Akka Actor(异步)
资源消耗 较高(线程开销大) 低(协程轻量) 低(异步非阻塞)
分布式支持 原生支持(主从模式) 原生支持(主从 + 无 Master) 需额外配置(企业版更好)
学习曲线 低(GUI 友好) 中(需 Python 基础) 中高(DSL 语法)
报告质量 基础 HTML + 插件扩展 Web 实时 + 可导出 精美 HTML(自带图表)

我的建议:如果你团队里 Java 多、习惯 GUI 操作,选 JMeter 上手最快。如果你们是 Python 栈、想写代码控制压测逻辑,Locust 更灵活。要是追求高性能、报告漂亮、CI/CD 集成方便,Gatling 值得投入。

JMeter 安装与环境配置

JMeter 依赖 JDK 8+。我个人习惯用 JDK 11,稳定且兼容性好。

  1. 下载 JDK:去 Oracle 或 Adoptium 下载,安装后配好 JAVA_HOME 环境变量。
  2. 下载 JMeter:从 Apache 官网下载二进制包,解压到 C:\tools\apache-jmeter-5.6.3(Windows)或 /opt/jmeter(Linux)。
  3. 启动:Windows 双击 bin/jmeter.bat,Linux 执行 sh bin/jmeter.sh。

小技巧:启动时加 -n 参数进入命令行模式,适合 CI 跑脚本。比如 jmeter -n -t test.jmx -l result.jtl。

Locust 安装与环境配置

Locust 用 Python 写,安装简单。但要注意 Python 版本,我建议 3.9 以上。

# 创建虚拟环境(推荐)
python -m venv locust_env
source locust_env/bin/activate  # Windows 用 locust_env\Scripts\activate

# 安装 Locust
pip install locust

# 验证安装
locust --version

安装完就能用了。Locust 默认会启动 Web UI,端口 8089,方便实时看结果。

我曾经踩过的坑:在 Windows 上直接 pip install locust 有时会报 gevent 编译错误。解决办法是提前装好 Microsoft C++ Build Tools,或者用 pip install locust[windows] 安装带预编译包的版本。

Gatling 安装与环境配置

Gatling 需要 JDK 11+,推荐 JDK 17。它自带 Maven 和 Gradle 插件,但最省事的是用捆绑包。

  1. 下载捆绑包:从 Gatling 官网下载 gatling-charts-highcharts-bundle-3.11.5.zip。
  2. 解压:放到 /opt/gatling 或 C:\tools\gatling。
  3. 运行示例:执行 bin/gatling.sh(Linux)或 bin/gatling.bat(Windows),选择示例脚本跑一遍。

我建议:用 Maven 或 Gradle 管理 Gatling 项目,方便版本控制和 CI 集成。在 pom.xml 里加 Gatling 插件,写 Scala 代码时 IDE 还能自动补全。

第一个 Hello World 压测脚本

工具装好了,咱们写个最简单的脚本,验证环境是否正常。目标:对 https://httpbin.org/get 发 10 个请求,看看响应时间。

JMeter 版本

  1. 打开 JMeter GUI,右键「测试计划」→「添加」→「线程(用户)」→「线程组」。
  2. 设置线程数 10,Ramp-Up 时间 1 秒,循环次数 1。
  3. 右键「线程组」→「添加」→「取样器」→「HTTP 请求」。
  4. 填写服务器名称 httpbin.org,路径 /get。
  5. 右键「线程组」→「添加」→「监听器」→「查看结果树」。
  6. 点击绿色「启动」按钮,跑完看结果。
# 命令行模式跑 JMeter 脚本
jmeter -n -t hello_world.jmx -l result.jtl

Locust 版本

写一个 Python 文件 locustfile.py:

from locust import HttpUser, task, between

class HelloUser(HttpUser):
    wait_time = between(1, 3)

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

然后运行:

locust -f locustfile.py --host=https://httpbin.org --headless -u 10 -r 1 --run-time 10s

参数说明:-u 10 是 10 个并发用户,-r 1 是每秒启动 1 个,--run-time 10s 跑 10 秒。

Gatling 版本

用 Scala 写一个仿真类 HelloWorldSimulation.scala:

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

class HelloWorldSimulation extends Simulation {
  val httpProtocol = http
    .baseUrl("https://httpbin.org")
    .acceptHeader("application/json")

  val scn = scenario("Hello World")
    .exec(http("get_request")
      .get("/get"))

  setUp(
    scn.inject(atOnceUsers(10))
  ).protocols(httpProtocol)
}

运行:

# 用 Maven 插件
mvn gatling:test -Dgatling.simulationClass=HelloWorldSimulation

注意:三个脚本都只发 GET 请求,没有断言。实际项目中一定要加响应状态码、响应时间断言,否则压测结果没有意义。

工具选型决策流程图

下面这张图帮你快速决策:

压测工具选型决策流程 开始选型 团队主要技术栈是什么? Java / 无代码偏好 Python 栈 JMeter Locust 需要 GUI 还是代码? 需要高性能报告? JMeter 合适 Gatling 合适 如果追求极致性能,直接选 Gatling 如果团队全是 Python,Locust 是唯一选择

环境验证与常见问题

跑完第一个脚本后,检查三件事:

  • 响应状态码:200 才算成功。如果出现 403、500,检查 URL 或请求头。
  • 响应时间:平均响应时间在几百毫秒内算正常。如果超过 5 秒,可能是网络或服务端问题。
  • 错误率:0% 最好。有错误先看日志,别急着调参数。

我曾经遇到的情况:第一次用 JMeter 压测公司内网服务,结果全是 Connection refused。查了半天才发现是防火墙没开端口。所以压测前一定要确认网络连通性,用 telnet 或 curl 先测一下。

好了,环境搭好、第一个脚本跑通,你已经迈出了压测的第一步。接下来就是深入理解各种场景的脚本编写和参数调优了。