通篇讲解如何基于 Locust 进行性能测试

时间:2025-04-10 20:38:25

1. Locust是什么?

Locust这是一款开源的、基于 Python 的性能测试工具。它允许你编写并执行负载测试,模拟大量用户访问你的系统。

关键点总结:

  1. 常规编程结构:在 Locust 中,你可以使用 Python 的标准编程结构(如循环、条件语句等)来定义用户行为。这使得编写测试脚本就像编写常规的 Python 代码一样简单。
  2. 每个用户独立运行:Locust 为每个用户分配一个独立的 greenlet(轻量级进程/协程),这样可以让你的测试脚本像正常的阻塞代码一样工作,而不需要使用回调函数或其他异步机制。
  3. 可在 IDE 中编写和管理:由于测试脚本是纯 Python 代码,你可以在熟悉的 IDE 中编写、调试、管理和版本控制这些测试脚本,而不是使用一些工具的 XML 或二进制格式。

优势:

  • 简洁明了:因为 Locust 脚本就是 Python 代码,所以没有额外的学习成本,特别是对于熟悉 Python 的开发者。
  • 协作友好:可以使用版本控制系统(如 Git)管理你的测试脚本,这使得团队协作和代码回溯更加容易。

通过这些特性,Locust 提供了一种强大且灵活的方式来编写负载测试脚本,让开发者能够更自然地表达用户行为和测试逻辑。


2. 亮点的功能Greenlet

  • 本质就是使用高并发去模拟, 而且不会产生回调地狱问题。

在 Locust 中,每个用户独立运行在自己的 greenlet 中,这带来了以下几个重要的好处:

1. 编写代码更加直观和简单

当每个用户都运行在自己的 greenlet 中时,你可以像写同步代码那样编写测试脚本,而不需要担心回调函数或异步操作。这样使得代码逻辑更加直观,容易理解和维护。你可以使用 Python 的标准流程控制语句(如 iffor 循环等)来描述用户行为,而不需要在异步调用之间切换上下文。

2. 代码更加模块化和可读

由于不需要使用复杂的异步模式(如回调或 promise),你的测试代码可以保持简洁、模块化和可读。你可以在代码中直接顺序编写逻辑,而不需要将代码拆分成多个部分。这不仅减少了代码复杂性,还提高了测试脚本的可维护性。

3. 减少了调试难度

异步代码通常会引入更多的调试难度,因为问题可能出现在异步调用的任意一个步骤中。而在 Locust 中,用户行为被编写成同步的逻辑块,因此当出现错误时,定位问题更加简单直接。你可以使用常见的 Python 调试工具来逐步排查问题,而不需要处理异步调用堆栈。

4. 更好的性能

greenlet 是一种轻量级的协程,它在性能和资源占用上非常高效。相比于创建一个线程或进程,greenlet 消耗的系统资源要少得多,这意味着你可以模拟更多的用户行为而不会显著增加系统的负载。这对于高并发测试尤其有利,因为你可以在同一台机器上模拟更多用户。

5. 提高并发处理能力

由于每个用户在自己的 greenlet 中独立运行,你可以利用并发编程的优势来模拟成千上万的用户,而不会遇到传统多线程编程中的常见问题(如线程锁、死锁等)。这使得 Locust 能够更高效地模拟大规模用户行为,适用于高并发场景的性能测试。


3. Locust 参数命令形式的详解:

  • 下面是官网的一段命令, 里面包含了我们需要首先了解的两个概念: locust --headless --users 10 --spawn-rate 1 -H <>

    在使用 Locust 进行负载测试时,--headless--spawn-rate 是两个重要的参数,它们决定了测试的运行方式和用户生成的速度。下面是这两个参数的解释:

    1. -headless

    • 解释
      • -headless 参数表示以无头模式运行 Locust,这意味着测试将在命令行中执行,而不是通过 Locust 的 Web 界面进行控制和监控。
    • 应用场景
      • 这种模式通常用于自动化测试、持续集成(CI)管道或在没有 GUI 的环境中运行测试(如远程服务器)。
    • 作用
      • 直接从命令行启动测试,适用于希望在后台或脚本中自动化执行负载测试的场景。

    2. -spawn-rate

    • 解释

      • -spawn-rate 参数指定生成用户的速率,也就是每秒钟生成多少个用户。
    • 应用场景

      • 这个参数允许你控制负载测试的增长速度,而不是立即生成所有用户,便于逐步增加压力,观察系统的反应。
    • 例子

      • 在命令 locust --headless --users 10 --spawn-rate 1 中,-spawn-rate 1 表示每秒生成 1 个用户,因此生成 10 个用户总共需要 10 秒。
    • 作用

      • 控制生成用户的速率可以帮助测试系统在不同的负载下的表现。例如,缓慢增加用户数量可以模拟逐渐增加的真实流量,而快速生成所有用户则适用于压力测试。

      3. -users 参数

      • 解释
        • -users 参数指定在测试中要生成的总用户数量,即模拟的并发用户的数量。
      • 应用场景
        • 这个参数用来定义负载测试的规模。例如,如果你希望模拟 1000 个并发用户访问系统,你可以将 -users 设置为 1000。
      • 例子
        • 在命令 locust --headless --users 10 --spawn-rate 1 中,-users 10 表示测试将总共生成 10 个并发用户。
      • 作用
        • 通过设置 -users,你可以控制测试中的并发用户数,进而模拟不同规模的用户流量。这有助于评估系统在不同并发负载下的性能表现。

    总结

    • -headless:在无头模式下运行 Locust,避免使用 Web 界面,适合自动化和无 GUI 的环境。
    • -spawn-rate:指定用户生成的速率,控制负载的增长速度,以便逐步增加压力并监控系统表现。
    • -users 参数用于指定负载测试中要模拟的总用户数量,帮助你控制并发用户数以测试系统的负载能力。

    这3个参数结合使用,可以灵活控制负载测试的执行方式和压力的增加速度。


4. 实现一下 Locust

  • 做这个测试的前提是, 你实现了一个 hello的接口
  1. from locust import HttpUser, task
  2. class HelloWorldUser(HttpUser):
  3. @task
  4. def hello_world(self):
  5. self.("/hello")

运行 locust命令后:

  1. locust
  2. [2021-07-24 09:58:46,215] .../INFO/: Starting web interface at <http://0.0.0.0:8089>
  3. [2021-07-24 09:58:46,285] .../INFO/: Starting Locust 0.0.1.dev239

Open http://localhost:8089

需要修改这个 host改成本机地址: 比如 hello的接口的地址: localhost:8080


入门到此结束:

????

如何进行提高负载, 如何进行分布式, 如何优化这部分代码, 如何联系官方作者优化这负载测试,从而进行提高理论和实践水平?

关注我,后续给你们出