一:TaskSet任务执行逻辑:
当一个任务集合(TaskSet)开始执行时,会随机选取一个task进行执行(带有task的装饰器的方法);执行完毕后;停顿一段时间(时间长短在wait_time属性中定义,如果TaskSet集合没有定义wait_time,那么会获取User类中定义的wait_time值),然后继续执行TaskSet集合中的任务。
二:TaskSet嵌套任务执行:
通常情况下,在进行脚本编写时,需要用到TaskSet的嵌套写法。这样做的目的主要是逻辑的可读性和完整性,比如在一个页面上可能有不同种类的任务操作等,那么不同种类,可以在写在不同的嵌套类中进行管理,这样条理更清晰。如下示例:
from locust import task,between,TaskSet, User
class TaskSetP(TaskSet):
@task(2)
class TaskSetC1(TaskSet):
@task(2)
def TaskC_1(self):
print("This is TaskC_1")
@task(1)
def TaskC_2(self):
print("This is TaskC_2")
@task(1)
def logout(self):
print("This is logout task")
class MyUser(User):
wait_time = between(2,3)
tasks = [TaskSetP]
复制
脚本执行结果如下,说明当任务执行到嵌套子类TaskSetC1中,就会一直在此子类中执行。
[2021-02-16 22:54:54,634] jasondeMacBook-Pro.local/INFO/locust.runners: All users hatched: MyUser: 1 (0 already running)
This is TaskC_1
This is TaskC_1
This is TaskC_2
This is TaskC_2
This is TaskC_1
This is TaskC_1
This is TaskC_1
This is TaskC_1
This is TaskC_2
This is TaskC_1
This is TaskC_2
This is TaskC_1
复制
继续以上的问题,脚本中缺少了中断机制,我们可以在一些需要的方法中设置中断函数去实现这样的目的"当触发到这样的函数,将脚本执行的权力交还给父类"。示例代码如下,可以发现在第14行,在任务函数TaskC_2中添加了中断函数 self.interrupt()。
from locust import task,between,TaskSet, User
class TaskSetP(TaskSet):
@task(2)
class TaskSetC1(TaskSet):
@task(2)
def TaskC_1(self):
print("This is TaskC_1")
@task(1)
def TaskC_2(self):
print("This is TaskC_2")
self.interrupt()
@task(1)
def logout(self):
print("This is logout task")
class MyUser(User):
wait_time = between(2,3)
tasks = [TaskSetP]
复制
场景运行结果输出如下,可以发现,除了执行子类中的方法外,也会执行父类中的方法"logout"。
[2021-02-16 22:59:31,473] jasondeMacBook-Pro.local/INFO/locust.runners: All users hatched: MyUser: 1 (0 already running)
This is TaskC_2
This is TaskC_1
This is TaskC_1
This is TaskC_2
This is logout task
This is logout task
This is TaskC_1
This is TaskC_2
复制
文章转载自TimTest,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。