Tasks
当负载测试启动时,将为每个模拟用户创建一个User类的实例,它们将开始在自己的green thread中运行。当这些用户运行时,他们选择他们执行的任务,休眠一段时间,然后选择一个新任务,等等。
这些任务是普通的python可调用对象,如果我们对一个拍卖网站进行负载测试,它们可以做诸如“加载起始页面”、“搜索某些产品”、“出价”等事情。
@task 装饰器
为用户添加任务最简单的方法是使用任务装饰器。
from locust import User, task, constant
class MyUser(User):
wait_time = constant(1)
@task
def my_task(self):
print("User instance (%r) executing my_task" % self)
@task有一个可选的权重参数,可以用来指定任务的执行比例。在下面的例子中,task2被选为task1的概率是task1的两倍:
from locust import User, task, between
class MyUser(User):
wait_time = between(5, 15)
@task(3)
def task1(self):
pass
@task(6)
def task2(self):
pass
tasks 属性
定义User任务的另一种方法是设置tasks属性。
tasks属性要么是Task的列表,要么是<Task: int> dict,其中Task要么是一个python可调用对象,要么是一个TaskSet类。如果任务是一个普通的python函数,它们会收到一个参数,即正在执行任务的User实例。
下面是一个User任务声明为普通python函数的示例:
from locust import User, constant
def my_task(user):
pass
class MyUser(User):
tasks = [my_task]
wait_time = constant(1)
如果tasks属性指定为一个列表,那么每次执行任务时,它将从tasks属性中随机选择。但是,如果tasks是一个字典-将可调用对象作为键,将int作为值-将随机选择要执行的任务,但以int作为比例。所以有这样一个任务:
{my_task: 3, another_task: 1}
My_task被执行的可能性是另一个task的3倍。
在内部,上面的字典实际上会被扩展成一个列表(task属性也会被更新),如下所示:
[my_task, my_task, my_task, another_task]
然后使用Python的random.choice()从列表中挑选任务。
@tag 装饰器
通过使用@tag装饰器来标记任务,您可以使用–tags和–exclude-tags参数来挑选测试期间执行的任务。考虑下面的例子:
from locust import User, constant, task, tag
class MyUser(User):
wait_time = constant(1)
@tag('tag1')
@task
def task1(self):
pass
@tag('tag1', 'tag2')
@task
def task2(self):
pass
@tag('tag3')
@task
def task3(self):
pass
@task
def task4(self):
pass
如果您使用–tags tag1开始这个测试,那么在测试期间只会执行task1和task2。如果您以–tags tag2 tag3开始,那么只有task2和task3会被执行。
–exclude-tags将以完全相反的方式运行。因此,如果使用–exclude-tags tag3开始测试,那么只会执行task1、task2和task4。排除总是胜过包含,所以如果一个任务有一个你包含的标签和一个你排除的标签,它将不会被执行。