在上一章的简介及使用中,介绍了一个 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}
总结:这两种嵌套方法可以二选一,但是推荐使用第二种嵌套,方便后面更深层次的任务嵌套。
class ErrorTask(TaskSet):
def run(self):
class TaskSub(TaskSet):
pass