无 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
中,或者放在任何其他被导入的文件中。