Locust:用 Python 写压测脚本,27.8K Star

Locust 在 GitHub 上拿到了 27,851 Star,是目前最流行的 Python 性能测试工具之一。

压力测试工具很多,但 Locust 走了一条不同的路:用纯 Python 代码来定义测试场景。不用学 DSL,不用在 GUI 里点点点,写测试就跟写普通 Python 脚本一样。你的测试脚本可以放进 Git,在 PyCharm 里写,CI 里跑。

正文顶部截图

1、这玩意儿是干嘛的

Locust 是一个开源的性能测试工具,主要用来压 HTTP 服务,也能扩展去测任意协议。

你写一段 Python 定义用户行为,Locust 就帮你模拟成千上万个并发用户去打目标服务,然后实时展示吞吐量、响应时间、错误率。结果可以导出做离线分析,也能直接接 Grafana 等可视化工具。

2、为什么要用它

市面上的压测工具大概分两派。GUI 派,比如 JMeter,点点鼠标配场景,上手还行,但场景稍微复杂就绑手绑脚。DSL 派,比如 Gatling,用自己的一套脚本语言描述测试逻辑,得额外学一门方言。

Locust 选了第三条路:直接用 Python。你会 Python 就会写 Locust 测试。想加个条件分支,写 if。想循环,写 for。想调个第三方库算签名,import 进来直接用。

技术层面,每个虚拟用户跑在自己的 greenlet 轻量协程里,代码写起来是同步阻塞式的,不用回调,不用 async/await。省心。

from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 2)

    def on_start(self):
        self.client.post("/login", json={"username":"foo", "password":"bar"})

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

    @task(3)
    def view_item(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")

3、分布式执行和 Web UI

Locust 基于 gevent 事件循环,单进程能扛几千并发用户。要测更大规模,开多个 worker 节点,master 统一调度就行,架构很直接。

它自带一个 Web 管理界面,测试跑起来后实时展示指标曲线。吞吐量、响应时间分位数、失败率,跑着跑着就能看到趋势。过程中还能动态调整并发数,不用停测。不需要 UI 的时候用命令行模式,适合塞进 CI/CD 流水线。

README区域截图

4、不止测 HTTP

虽然最常见的用法是压 HTTP API,但 Locust 的架构是协议无关的。写一个客户端封装,就能测数据库、消息队列、gRPC、WebSocket。社区已经贡献了不少现成的协议插件,开箱即用。

Locust 的代码库刻意保持精简,不把能力全塞进核心里,而是留好扩展点。想对接 TimescaleDB 持久化测试数据,想在 Grafana 搭看板,想自定义负载曲线,都有对应方案。微软也基于它做了 VS Code 扩展和 Azure Load Testing 托管服务。

5、适合哪些人用

  • 后端或测试工程师,日常要压 HTTP 接口,习惯用 Python 写脚本
  • 团队技术栈以 Python 为主,不想为压测额外引入一套工具和语言
  • 需要大规模并发压测,对分布式执行有硬需求
  • 想把性能测试集成到 CI/CD,每次发布前自动跑一轮回归

套工具和语言

  • 需要大规模并发压测,对分布式执行有硬需求
  • 想把性能测试集成到 CI/CD,每次发布前自动跑一轮回归
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐