Locust性能-零基础入门系列(8)

本文继续深入讲解TaskSet在Locust场景模拟中的应用。

第一部分:

首先讲解多个TaskSet类在测试中实现以及配置问题,先上例子来讲解。

from locust import User, TaskSet, between,task

class ForumSection(TaskSet):

    @task
    def read_thread(self):
        print("This is task readThread")

    @task
    def create_thread(self):
        print("This is task create thread")

    @task
    def reply_thread(self):
        print("This is a reply thread")

    @task
    def view_next_page(self):
        print("This is function- view next page!")

class BrowserCategory(TaskSet):
    @task
    def watch_movie(self):
        print("this is function- watch movies")

    @task
    def filter_movie(self):
        print("this is function- filter movies")

class LoggedInUser(User):
    wait_time = between(5,10)
    tasks = {ForumSection:2,BrowserCategory:3}

    @task
    def index_page(self):
        print("this is index page.")

    @task
    def about_page(self):
        print("this is about page.")

上面脚本中有ForumSection和BrowserCategory两个TaskSet子类,在这种多个TaskSet都存在情况,在实际中比较常见。

首先如上篇文章,在各个TaskSet内部都是可以自己设定相关任务的权重的;其次在User类中,如例中的LoggedInUser类中,也不影响其权重的配置,不过这种权重的配置是更高一级的配置,是对总体压力流量的管控,如例子中的:

tasks = {ForumSection:2,BrowserCategory:3}

你可以理解为40%的压力流量会执行任务集合ForumSection;同理60%的压力流量会执行任务集合BrowserCategory。

第二部分:
TaskSet类可以嵌入到User类,作为其子类存在,请参考一下脚本示例:

from locust import User,task,TaskSet,between

class RegisteredUser(User):
    wait_time = between(1,1.5)
    @task
    class Forum(TaskSet):
        @task(5)
        def view_thread(self):
            print("This is view thread method.")

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

    @task
    def frontpage(self):
        print("This is front page functions.")

这里我们理一下脚本的大体结构,其中最外层,有TaskSet任务集合类Forum和任务方法frontpage. 这两个对象是平行(或者说对等的)。而Forum任务集合内有view_thread和stop方法,而它们又各自有5和1的权重。所以其运行的逻辑特点如下:

1>场景开始运行时,Forum任务集合和frontpage任务方法有相同的权重被执行。

2>一旦Forum任务集合被执行,那么其有83.3%的概率会执行常规任务view_thread,剩下的概率会执行stop

3>而只有执行了stop方法之后,frontpage任务才有再次被执行的可能。而此时会和第1点,刚开始那样测试任务的执行循环。

4>如果TaskSet任务集合类中没有设置stop方法,那么该任务集合一旦被执行,那么不会结束,除非整个场景运行结束。而如果有其他任务或者任务集合存在的话,没有stop方法的配置是不合理的。

猜你喜欢

转载自blog.51cto.com/13734261/2551720