User class
一个用户类代表一个用户(或者一个成群的蝗虫)。Locust将为每个被模拟的用户生成一个User类的实例。User类可以定义一些常见的属性。
wait_time属性
User的wait_time方法可以很容易地在每个任务执行后引入延迟。如果没有指定wait_time,下一个任务将在一个任务完成后立即执行。
四种传参方式:
1.固定的时间(constant)
2.介于最小值和最大值之间的随机时间(between)
例如,让每个用户在每次任务执行之间等待0.5 - 10秒:
from locust import User, task, between
class MyUser(User):
@task
def my_task(self):
print("executing my_task")
wait_time = between(0.5, 10)
3.constant_throughput设置一个自适应时间,确保任务每秒运行(最多)X次。
4.constant_pacing为一个自适应时间,确保任务(最多)每X秒运行一次(它是constant_throughput的数学倒数)
PS.
例如,如果希望Locust在峰值负载下每秒运行500次任务迭代,可以使用wait_time = constant_throughput(0.1)和5000个用户数。
等待时间只能限制吞吐量,不能启动新的用户到达目标。因此,在我们的示例中,如果任务迭代的时间超过10秒,吞吐量将小于500。
等待时间是在任务执行后应用的,所以如果你有一个高孵化率/上升,你可能会在上升期间超过你的目标。
等待时间适用于任务,而不是请求。例如,如果指定wait_time = constant_throughput(2)并在任务中执行两个请求,那么请求率/RPS将为每个用户4。
也可以直接在类上声明自己的wait_time方法。例如,下面的User类会休眠一秒,然后是两秒,然后是三秒,等等。
class MyUser(User):
last_wait_time = 0
def wait_time(self):
self.last_wait_time += 1
return self.last_wait_time
...
weight和fixed_count属性
如果文件中存在多个用户类,并且没有在命令行中指定用户类,那么Locust将生成数量相等的每个用户类。你也可以通过将它们作为命令行参数传递来指定在同一个locustfile中使用哪些用户类:
locust -f locust_file.py WebUser MobileUser
如果希望模拟某种类型的更多用户,可以在这些类上设置权重属性。举个例子来说,WebUser比MobileUser有三倍的可能性:
class WebUser(User):
weight = 3
...
class MobileUser(User):
weight = 1
...
您还可以设置fixed_count属性。在这种情况下,权重属性将被忽略,并生成准确的用户计数。这些用户是先生成的。在下面的示例中,将生成AdminUser的唯一实例,以更精确地控制请求计数,而不依赖于用户总数。
class AdminUser(User):
wait_time = constant(600)
fixed_count = 1
@task
def restart_app(self):
...
class WebUser(User):
...
host attribute
host属性是要加载的主机的URL前缀(即“http://google.com”)。通常,当Locust启动时,这是在Locust的web UI中或在命令行中使用——host选项指定的。
如果在用户类中声明了一个host属性,当命令行或web请求中没有指定——host时,就会使用它。
tasks attribute
User类可以使用@task装饰器将任务声明为方法,但也可以使用tasks属性指定任务,下面将详细描述。
environment attribute
对运行用户的环境的引用。使用它与环境或它所包含的运行器交互。例如,从一个任务方法中阻止runner:
self.environment.runner.quit()
如果在一个独立的蝗虫实例上运行,这将停止整个运行。如果在worker节点上运行,它将停止该特定节点。
on_start and on_stop 方法
Users (和TaskSets)可以声明一个on_start方法和/或on_stop方法。User在开始运行时调用它的on_start方法,在停止运行时调用它的on_stop方法。对于TaskSet, on_start方法在模拟用户开始执行TaskSet时调用,on_stop方法在模拟用户停止执行TaskSet时调用(当调用interrupt()或用户被杀死时)。