一:tasks属性另外一种写法:
首先上脚本示例代码
from locust import User, constant def task_1(l): print("This is task 1") def task_2(l): print("this is task_2") class MyUser(User): tasks = {task_1: 1 , task_2: 2} wait_time = constant(1)
代码解读:
第1-7行,之前有介绍过,这里略过。
第9行,是定义了一个用户类。
第10行,是定义了tasks属性值,这里的属性值和文章 Locust性能-零基础入门(4) -tasks属性值的用法 中介绍tasks属性不太一样,这里运用的是字典形式,除了定义任务的范围之外,还设置了每个任务的权重,比如task_1的权重为1,task_2的权重为2,那么也即是三分之一的流量会执行task_1,剩下的流量会执行task_2。这种模式更简单,也更容易理解。其实通过笔者的实验,tasks属性附带权重的写法,其实还有一种更容易理解的方式。具体如下:
tasks = [task_1,task_2,task_2]
tasks属性还是以列表的方式来赋值,只是在其列表中,大家会发现task_2有两次出现,其实也间接实现了权重设置的目的。只是这种方式稍显笨拙,其实更易理解。
二:User实例化展示
我们知道Locust模拟虚拟用户必须要继承User类,或者其子类,比如HttpUser类。那么在复杂的场景模拟中,当有不同的用户类出现时,怎么去定位或者识别当前虚拟用户的身份呢?Locust提供了获取虚拟用户身份的方式,具体如下代码:
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)
如上图代码中的第7行,其中 %r 占位符,就可以获取User instance的上下文信息,注意必须是 %r。脚本运行之后,我们会得到的用户上下问信息如下,我们可以清晰地看到有2个虚拟用户,而这2个虚拟用户都是继承了MyUser用户类。
All users hatched: MyUser: 2 (0 already running) User instance (<file6.MyUser object at 0x10a61b2e8>) executing my_task User instance (<file6.MyUser object at 0x10a688748>) executing my_task User instance (<file6.MyUser object at 0x10a61b2e8>) executing my_task User instance (<file6.MyUser object at 0x10a688748>) executing my_task User instance (<file6.MyUser object at 0x10a61b2e8>) executing my_task User instance (<file6.MyUser object at 0x10a688748>) executing my_task User instance (<file6.MyUser object at 0x10a61b2e8>) executing my_task ...