无 Web UI 运行 Locust

你可以使用 --headless 标志在没有 Web UI 的情况下运行 Locust,同时使用 -u/--users-r/--spawn-rate 来指定用户数和启动速率:

locust -f locust_files/my_locust_file.py --headless -u 100 -r 5

[2021-07-24 10:41:10,947] .../INFO/locust.main: No run time limit set, use CTRL+C to interrupt.
[2021-07-24 10:41:10,947] .../INFO/locust.main: Starting Locust 2.32.5
[2021-07-24 10:41:10,949] .../INFO/locust.runners: Ramping to 100 users using a 5.00 spawn rate
Name              # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
----------------------------------------------------------------------------------------------
GET /hello             1     0(0.00%)  |     115     115     115     115  |    0.00    0.00
GET /world             1     0(0.00%)  |     119     119     119     119  |    0.00    0.00
----------------------------------------------------------------------------------------------
Aggregated             2     0(0.00%)  |     117     115     119     117  |    0.00    0.00

[2021-07-24 10:44:42,484] .../INFO/locust.runners: All users spawned: {"HelloWorldUser": 100} (100 total users)

即使在无 Web UI 模式下,你也可以在测试运行时更改用户数。按 w 添加 1 个用户,按 W 添加 10 个用户;按 s 删除 1 个用户,按 S 删除 10 个用户。

设置测试的运行时间

要指定测试的运行时间,可以使用 -t/--run-time

locust --headless -u 100 --run-time 1h30m
locust --headless -u 100 --run-time 60  # 默认单位是秒

Locust 在时间到达时会自动停止,计算时间从测试开始时开始(而不是从 ramp-up 完成时开始)。

允许任务在关闭时完成其迭代

默认情况下,Locust 会立即停止你的任务(即使请求尚未完成)。如果希望给正在运行的任务一些时间来完成其迭代,可以使用 -s/--stop-timeout

locust --headless --run-time 1h30m --stop-timeout 10s

无 Web UI 模式下分布式运行 Locust

如果你希望在没有 Web UI 的情况下运行 Locust 分布式测试,可以在启动 master 节点时指定 --expect-workers 选项,用于指定期望连接的 worker 节点数量。然后它会等待指定数量的 worker 节点连接后才会开始测试。

控制 Locust 进程的退出代码

默认情况下,如果有任何失败的样本,Locust 进程会返回退出代码 1(可以使用 --exit-code-on-error 改变这个行为)。你也可以在测试脚本中手动控制退出代码,通过设置 Environment 实例的 process_exit_code。这在将 Locust 作为自动化/定期测试时非常有用,例如作为 CI 流水线的一部分。

下面是一个示例代码,当满足以下任意条件时,设置退出代码为非零:

  • 请求失败超过 1%

  • 平均响应时间超过 200 毫秒

  • 95th 百分位的响应时间超过 800 毫秒

import logging
from locust import events

@events.quitting.add_listener
def _(environment, **kw):
    if environment.stats.total.fail_ratio > 0.01:
        logging.error("Test failed due to failure ratio > 1%")
        environment.process_exit_code = 1
    elif environment.stats.total.avg_response_time > 200:
        logging.error("Test failed due to average response time ratio > 200 ms")
        environment.process_exit_code = 1
    elif environment.stats.total.get_response_time_percentile(0.95) > 800:
        logging.error("Test failed due to 95th percentile response time > 800 ms")
        environment.process_exit_code = 1
    else:
        environment.process_exit_code = 0

请注意,这段代码可以放在 locustfile.py 中,或者放在任何其他被导入的文件中。