六、Locust之TaskSets详解
TaskSets是一种结构化测试分层网站/系统的方法。你可以在这里关于它的信息。
1.TaskSet class
如果你正在对一个以分层方式构建的网站进行性能测试,有章节和子章节,以同样的方式构建你的负载测试可能是有用的。
为了这个目的,Locust提供了TaskSet类。它是一个任务的集合,将被执行,就像直接在用户类上声明的那些任务。
注意:
任务集是一个高级功能,只是很少有用。大多数时候,你最好使用常规的 Python 循环和控制语句来实现同样的事情。也有一些问题,最常见的是忘记调用self.interrupt()
from locust import User, TaskSet, constantclass ForumSection(TaskSet):wait_time = constant(1)@task(10)def view_thread(self):pass@taskdef create_thread(self):pass@taskdef stop(self):self.interrupt()class LoggedInUser(User):wait_time = constant(5)tasks = {ForumSection:2}@taskdef my_task(self):pass
一个任务集也可以使用@task装饰器直接内联到User/TaskSet类下。
class MyUser(User):@taskclass MyTaskSet(TaskSet):...
一个任务集类的任务可以是其他的任务集类,允许它们嵌套任何数量的级别。这使得我们可以定义一种行为,以一种更真实的方式模拟用户。
例如,我们可以定义具有以下结构的TaskSets。
- Main user behaviour- Index page- Forum page- Read thread- Reply- New thread- View next page- Browse categories- Watch movie- Filter movies- About page
当一个正在运行的用户线程选择一个TaskSet类来执行时,这个类的实例将被创建,然后执行将进入这个TaskSet。
然后发生的事情是,TaskSet的一个任务将被选中并执行,然后线程将睡眠一个由User的wait_time函数指定的持续时间(除非在TaskSet类上直接声明了一个wait_time函数,在这种情况下,它将使用该函数),然后从TaskSet的任务中挑选一个新任务,再次等待,如此循环。
TaskSet实例包含一个对用户的引用 - self.user。它也有一个指向其用户的客户端属性的快捷方式。所以你可以使用self.client.request()进行请求,就像你的任务直接定义在一个HttpUser上一样。
2. 终断 TaskSet
关于TaskSets的一个重要的事情是,它们永远不会停止执行它们的任务,并把执行权交还给它们的父用户/TaskSet,自己。这必须由开发者通过调用TaskSet.interrupt()方法来完成。
interrupt(self, reschedule=True)
# 中断任务集并将执行控制权交还给父任务集。
# 如果reschedule为True(默认),父用户将立即重新安排,并执行一个新任务。
在下面的例子中,如果我们没有调用self.interrupt()的停止任务,模拟用户一旦进入论坛的任务集,就永远不会停止运行任务。
class RegisteredUser(User):@taskclass Forum(TaskSet):@task(5)def view_thread(self):pass@task(1)def stop(self):self.interrupt()@taskdef frontpage(self):pass
使用中断函数,我们可以-与任务加权一起–定义一个模拟用户离开论坛的可能性有多大。
3. TaskSet和User中的任务之间的区别
与直接驻留在用户下的任务相比,驻留在 TaskSet 下的任务的一个区别是,它们在执行时被传递的参数(对于用 @task decorator 声明为方法的任务来说,是对 TaskSet 实例的引用,而不是对用户实例的引用。用户实例可以通过 TaskSet.user 从 TaskSet 实例中被访问。TaskSets 还包含一个方便的客户属性,它指的是 User 实例上的客户属性。
4. 引用用户实例,或父任务集实例
一个TaskSet实例的属性user将指向它的User实例,而属性parent则指向它的父任务集实例。
5. 标签和TaskSet
你可以使用@tag装饰器来标记TaskSets,方法与普通任务类似,但有一些细微差别值得一提。给一个TaskSet打上标签,将自动把标签应用到该任务集的所有任务中。
此外,如果你在一个嵌套的TaskSet中标记一个任务,即使这个TaskSet没有被标记,Locust也会执行这个任务。
6. SequentialTaskSet 类
SequentialTaskSet是一个任务集,其任务将按照它们被声明的顺序执行。可以在一个任务集中嵌套SequentialTaskSets,反之亦然。
例如,下面的代码将按顺序请求URLs /1-/4,然后再重复。
def function_task(taskset):taskset.client.get("/3")class SequenceOfTasks(SequentialTaskSet):@taskdef first_task(self):self.client.get("/1")self.client.get("/2")# 您仍然可以使用 tasks 属性来指定任务列表tasks = [function_task]@taskdef last_task(self):self.client.get("/4")
注意,你不需要SequentialTaskSets来按顺序做一些请求。
通常在一个任务中做整个用户流会更容易。
更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449
更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449