环境与工具准备: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,稳定且兼容性好。
- 下载 JDK:去 Oracle 或 Adoptium 下载,安装后配好
JAVA_HOME环境变量。 - 下载 JMeter:从 Apache 官网下载二进制包,解压到
C:\tools\apache-jmeter-5.6.3(Windows)或/opt/jmeter(Linux)。 - 启动: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 插件,但最省事的是用捆绑包。
- 下载捆绑包:从 Gatling 官网下载
gatling-charts-highcharts-bundle-3.11.5.zip。 - 解压:放到
/opt/gatling或C:\tools\gatling。 - 运行示例:执行
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 版本
- 打开 JMeter GUI,右键「测试计划」→「添加」→「线程(用户)」→「线程组」。
- 设置线程数 10,Ramp-Up 时间 1 秒,循环次数 1。
- 右键「线程组」→「添加」→「取样器」→「HTTP 请求」。
- 填写服务器名称
httpbin.org,路径/get。 - 右键「线程组」→「添加」→「监听器」→「查看结果树」。
- 点击绿色「启动」按钮,跑完看结果。
# 命令行模式跑 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 请求,没有断言。实际项目中一定要加响应状态码、响应时间断言,否则压测结果没有意义。
工具选型决策流程图
下面这张图帮你快速决策:
环境验证与常见问题
跑完第一个脚本后,检查三件事:
- 响应状态码:200 才算成功。如果出现 403、500,检查 URL 或请求头。
- 响应时间:平均响应时间在几百毫秒内算正常。如果超过 5 秒,可能是网络或服务端问题。
- 错误率:0% 最好。有错误先看日志,别急着调参数。
我曾经遇到的情况:第一次用 JMeter 压测公司内网服务,结果全是 Connection refused。查了半天才发现是防火墙没开端口。所以压测前一定要确认网络连通性,用 telnet 或 curl 先测一下。
好了,环境搭好、第一个脚本跑通,你已经迈出了压测的第一步。接下来就是深入理解各种场景的脚本编写和参数调优了。