一、TaskSet类简介
用户自定义场景和操作需继承TaskSet类,Locust中task_set属性需指向用户自定义的TaskSet类。当locust执行时,每个locust都会执行task_set指向的TaskSet类中定义的场景和操作。
二、使用task装饰器指定tasks
@task后面的weight指定task的执行概率,值越大执行概率越高,以下代码中task1的执行概率是task2的两倍。
from locust import Locust, TaskSet, task
class MyTask(TaskSet):
def longin(self):
print('这不是task')
@task(6)
def task1(self):
print('我是task1,我执行的概率高')
@task(3)
def task2(self):
print('我是task2,我执行的概率低')
class MyLocust(Locust):
max_wait = 9000
min_wait = 3000
task_set = MyTask
host = 'https://www.baidu.com'
三、 TaskSet 属性
1、tasks
tasks可以是一个callable的list或者一个classable: int 的dict,如果是list,list的中task将会随机执行,如果是dict,task将会随机的按照int指定的数值概率去执行。如下代码:
from locust import Locust, TaskSet
def my_task1(l):
pass
def my_task2(l):
pass
class MyTaskSet(TaskSet):
# tasks = [my_task1, my_task2] # 随机执行list中的task
tasks = {my_task1: 3, my_task2: 1} # 按照3:1的概率随机执行dict中的task
pass
class MyLocust(Locust):
task_set = MyTaskSet
2、max_wait和min_wait
类似于Locust,覆盖Locust中的等待时间。
3、parent
task嵌套时使用。
4、locust
实例化的时候指向Locust实例。
四、task嵌套
因为网站大部分设计都是分级式,所以task之间的嵌套显得很有必要,如下网站架构:
from locust import Locust, TaskSet, task
class MainUserBehaviour(TaskSet):
@task(2)
def index(self):
pass
@task(1)
def about(self):
pass
@task(3)
class ForumPage(TaskSet):
@task(10)
class ReadThread(TaskSet):
@task(2)
def reply(self):
pass
@task(1)
def stop(self):
self.interrupt()
@task(5)
def new_thread(self):
pass
@task(2)
def view_next_page(self):
pass
@task(1)
def stop(self):
self.interrupt()
@task(4)
class BrowserCategories(TaskSet):
@task(1)
def stop(self):
self.interrupt()
@task(5)
def watch_movie(self):
pass
@task(5)
def filter_movie(self):
pass
class MyWebsite(Locust):
task_set = MainUserBehaviour
注意:interrupt(),在task class中必须定义,否则进来之后就不出去了