性能测试工具 Locust 任务嵌套

FisherMan · 2020年05月18日 · 1827 次阅读

在上一章的简介及使用中,介绍了一个 locust 用例的组成及配置。本章在上一个用例的基础上会增加任务嵌套的情况
我们知道,locust 的第一个特点是,可以用普通的 python 进行脚本的编写 (拿上一章的例子),这就可以有多种实现方式,随之任务嵌套也会有多种形式
一、脚本任务的多样性
demo_1.py

from locust import Locust, TaskSet, task, between
from time import time
#使用@task来声明任务,执行的时候,my_task_3不执行
class MyTaskSet(TaskSet):

    # TaskSet相当于下面所有task的大脑
    @task(1)  # 声明任务
    def task1(self):
        print("执行task1")

    @task(5)
    def task2(self):
        print("执行task2")

    def my_task_3(self):
        print("执行task3")


class WebUser(Locust):
    task_set = MyTaskSet

    weight = 5
    wait_time = between(5, 15)
    host = ""  # 域名host

demo_2.py

from locust import Locust, TaskSet, between


class MyTask(TaskSet):
    def task1(self):
        print('task1')

    def task2(self):
        print('task2')
    # 下面tasks三种选择一种
    tasks = [task1, task2]  # 以列表形式,默认权重为1:1
    tasks = {task1: 1, task2: 5}  # 以字典形式,带权重
    tasks = [(task1,1),(task2,5)]    #以列表形式,元组格式(callable,int)
    # 以列表和字典的形式进行执行时,随机选择每个任务执行


class User(Locust):
    task_set = MyTask
    wait_time = between(1, 4)

demo3.py

from locust import Locust, TaskSet, between


# 将 任务也可以放在外面,统一以列表的形式传入
def task1(obj):
    print('task1')


def task2(obj):
    print('task2')



class MyTask(TaskSet):
    #以下三种选择一种
    tasks = [task1, task2]  # 以列表形式,默认权重为1:1
    tasks = {task1: 1, task2: 5}  # 以字典形式,带权重
    tasks = [(task1,1),(task2,5)]
    # 以列表和字典的形式进行执行时,随机选择每个任务执行


class User(Locust):
    task_set = MyTask
    wait_time = between(1, 4)

可以看出,上面三个 demo.py 基本等同,我们的 locust 脚本可以用 python 的类和函数随意定义任务,减轻了我们进行脚本编写的时间,为我们进行性能测试工作提供了很大的便利。
二、脚本任务的嵌套
嵌套发生在什么情况下呢?
举个例子,打开淘宝 app,有的用户会停留在首页,购物车,个人中心,而用户在首页,购物车,个人中心又会进行不同的动作。
为了模仿用户的行为,按照分层的逻辑就产生了下面的结构:

  • 用户行为
    • 首页
      • 浏览
      • 点击到活动页
    • 购物车
      • 结算页
      • 修改商品
    • 个人中心
      • 订单列表页
      • 个人资料

嵌套一

from locust import Locust, TaskSet, constant, task


class UserBehavior(TaskSet):
    @task(30)
    class FrontPage(TaskSet):
        @task(20)
        def view_page(self):
            pass

        @task(80)
        def click_activity(self):
            pass

    @task(40)
    class CartPage(TaskSet):
        @task(20)
        def order_page(self):
            pass

        @task(80)
        def edit_product(self):
            pass

    @task(30)
    class MinePage(TaskSet):
        @task(80)
        def order_list(self):
            pass

        @task(20)
        def mine_information(self):
            pass

嵌套二(Tips:子任务的类要放在父任务类的上面,才能被父类引用)

from locust import Locust, TaskSet, constant, task


class FrontPage(TaskSet):
    @task(20)
    def view_page(self):
        pass

    @task(80)
    def click_activity(self):
        pass


class CartPage(TaskSet):
    @task(20)
    def order_page(self):
        pass

    @task(80)
    def edit_product(self):
        pass


class MinePage(TaskSet):
    @task(80)
    def order_list(self):
        pass

    @task(20)
    def mine_information(self):
        pass


class UserBehavior2(TaskSet):
    tasks = {FrontPage: 30, CartPage: 40, MinePage: 30}

总结:这两种嵌套方法可以二选一,但是推荐使用第二种嵌套,方便后面更深层次的任务嵌套。

  • 注意事项:
    • 1.def 函数 task 下,不要嵌套 class(在嵌套的类中写 def 函数时,self 无效)
class ErrorTask(TaskSet):
    def run(self):
        class TaskSub(TaskSet):
            pass
  • 2.继承 taskset 的 class 类,不建议使用init,可以在 class 中增加非任务的函数,或者调用非继承 taskset 的非任务类
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 0 条回复 时间 点赞
FisherMan Locust 任务脚本初探 中提及了此贴 05月19日 14:27
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册