六、Locust之TaskSets详解

​ TaskSets是一种结构化测试分层网站/系统的方法。你可以在这里阅读更多关于它的信息。

1.TaskSet class

​ 如果你正在对一个以分层方式构建的网站进行性能测试,有章节和子章节,以同样的方式构建你的负载测试可能是有用的。

​ 为了这个目的,Locust提供了TaskSet类。它是一个任务的集合,将被执行,就像直接在用户类上声明的那些任务。

注意:

任务集是一个高级功能,只是很少有用。大多数时候,你最好使用常规的 Python 循环和控制语句来实现同样的事情。也有一些问题,最常见的是忘记调用self.interrupt()

from locust import User, TaskSet, constant

class ForumSection(TaskSet):
    wait_time = constant(1)

    @task(10)
    def view_thread(self):
        pass

    @task
    def create_thread(self):
        pass

    @task
    def stop(self):
        self.interrupt()

class LoggedInUser(User):
    wait_time = constant(5)
    tasks = {ForumSection:2}

    @task
    def my_task(self):
        pass

一个任务集也可以使用@task装饰器直接内联到User/TaskSet类下。

class MyUser(User):
    @task
    class 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):
    @task
    class Forum(TaskSet):
        @task(5)
        def view_thread(self):
            pass

        @task(1)
        def stop(self):
            self.interrupt()

    @task
    def 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):
    @task
    def first_task(self):
        self.client.get("/1")
        self.client.get("/2")

    # 您仍然可以使用 tasks 属性来指定任务列表
    tasks = [function_task]

    @task
    def last_task(self):
        self.client.get("/4")

注意,你不需要SequentialTaskSets来按顺序做一些请求。
通常在一个任务中做整个用户流会更容易。

更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449

六、Locust之TaskSets详解_第1张图片

更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449

你可能感兴趣的:(python,开发语言)