非Web UI下运行Locust
可以通过使用指令--headless
、-u/--users
以及-r/--spawn-rate
的组合完成非Web UI下运行Locust:
locust -f locust_files/my_locust_file.py --headless -u 100 -r 5
[2022-11-30 10:41:10,947] .../INFO/locust.main: No run time limit set, use CTRL+C to interrupt.
[2022-11-30 10:41:10,947] .../INFO/locust.main: Starting Locust 2.13
[2022-11-30 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
(...)
[2022-11-30 10:44:42,484] .../INFO/locust.runners: All users spawned: {"HelloWorldUser": 100} (100 total users)
(...)
即使在headless
模式下,你也可以在测试运行时改变用户数。按w
增加1个用户,按W
增加10个用户。按s
移除1个用户,按S
移除10个用户。
设置测试运行限制时间
如果希望为测试指定一个运行时间,可以通过-t/--run-time
参数:
$locust -f --headless -u 100 --run-time 1h30m
$locust -f --headless -u 100 --run-time 60 # 默认单位是秒
时间一到Locust就会停止运行。时间的计算是从测试开始计算的(不是从用户数爬坡加载完成后才计算的)。
允许任务在关闭时完成任务的迭代
默认情况下,Locust会立即停止任务(甚至不会等待请求完成)。如果你希望运行所有正在运行的任务都完成他们的迭代,可以使用-s/--stop-timeout <seconds>
参数。
locust --headless --run-time 1h30m --stop-timeout 10 # 延迟10秒后在执行停止
在非Web UI下运行Locust分布式
如果希望在非Web UI下运行Locust分布式,当开始启动master节点时要指定--expect-workers
参数来指定worker节点的连接数量。然后在开始测试之前,master节点会等待所有worker节点连接完毕后才开始。
控制Locust进程的退出代码
默认情况下,如果Locust程序一旦有失败的示例,将会给出一个退出码1(使用-exit-code-on-error
可以改变这个行为)。
你可以通过设置Environment
实例的process_exit_code
值来手动控制测试用例脚本中的退出码。这在将Locust作为自动化/定期测试运行时特别有用,例如作为CI管道的一部分。
下面示例,如果满足以下任何条件,则将退出代码设置为非零:
- 超过1%的请求失败
- 平均响应时间大于200毫秒
- 95%的响应时间大于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中,也可以放在locustfile中导入的任何其他文件中。