Python 编写locust性能测试代码

 

 

前言

在Locust测试脚本中,所有业务测试场景都是在HttpLocust和TaskSet两个类的继承子类中进行描述;

复制代码
from locust import HttpLocust, TaskSet, task

# 定义用户行为
class UserBehavior(TaskSet):

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


class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 3000
    max_wait = 6000
复制代码

通过命令行启动

locust -f .\load_test.py --host=https://www.baidu.com
  • f 指定性能测试脚本文件。
  • --host 指定被测试应用的URL的地址,注意访问百度使用的HTTPS协议。

然后通过浏览器访问,并设置测试参数:http://localhost:8089(Locust启动网络监控器,默认为端口号为: 8089)

TaskSet类

一个TaskSet类定义了一个用户操作行为的任务集合,测试任务开始后,任务可以顺序执行(schedule_task)、挑选下一个任务(execute_next_task)、执行任务(execute_task)、休眠等待(wait)、中断控制(interrupt)等待。

这样就可以模拟用户的业务测试场景,对虚拟用户的所有行为进行组织和描述,并可以对不同任务的权重进行配置,一个TaskSet类重要的属性有哪些?

wait_time属性
用户wait_time方法是一种可选功能,用于使模拟用户在任务执行之间等待指定的时间。
内置了三个等待时间功能:

  • constant 在固定的时间内;
  • between 在最大值和最小值之间的随机时间;
  • constant_pacing 自适应时间,以确保任务每X秒(最多)运行一次。

例如,使每个用户在每次任务执行之间等待0.5到10秒:

from locust import TaskSet, task, between

class MyUser(TaskSet):
    @task
    def my_task(TaskSet):
        print("executing my_task")

    wait_time = between(0.5, 10)

也可以在类上直接声明自己的wait_time方法。例如,下面的TaskSet类将休眠一秒钟,然后休眠两秒,然后休眠三秒,依此类推。

class MyUser(TaskSet):
    last_wait_time = 0

    def wait_time(self):
        self.last_wait_time += 1
        return self.last_wait_time

    ...

用户任务属性

有两种方式定义任务(用户行为)
@task装饰器
使用task装饰器为用户添加任务
且@task采用可选的weight参数,该参数可用于指定任务的执行率。在以下示例中,task2被选择为task1的机会是两倍:

复制代码
from locust import TaskSet, task

class UserBehavior(TaskSet):
    @task(1)
    def test_job1(self):
        self.client.get('/test1')

    @task(3)
    def test_job2(self):
        self.client.get('/test2')
复制代码

采用task属性

复制代码
from locust import TaskSet

def test_job1(obj):
    obj.client.get('/test1')

def test_job2(obj):
    obj.client.get('/test2')

class UserBehavior(TaskSet):
    tasks = {test_job1: 1, test_job2: 2}
    # tasks = [(test_job1,1), (test_job1,3)] # 两种方式等价
复制代码

上面两种定义任务信息方式中,均设置了权重属性,即执行test_job2的频率是test_job1的两倍。若不指定,默认比例为1:1。

不同用户权重属性
如果测试文件中存在多个用户类,也就是有多个用户在操作,可以让一个用户有更多操作的机会,比如以这里为例来说,网络用户的可能性是移动用户的三倍:

class WebUser(TaskSet):
weight = 3
...

class MobileUser(TaskSet):
weight = 1
...

任务标签

通过使用@tag装饰器标记任务,您可以对使用在命令行中使用--tagsand--exclude-tags参数指定任务执行,而其他任务跳过考虑以下示例:

复制代码
from locust import TaskSet, constant, task, tag

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

    @tag('tag1')
    @task
    def task1(self):
        pass

    @tag('tag1', 'tag2')
    @task
    def task2(self):
        pass

    @tag('tag3')
    @task
    def task3(self):
        pass

    @task
    def task4(self):
        pass
复制代码

如果--tags tag1,那么只有task1任务和task2执行;

如果--tags tag2 tag3,那么只有task2任务和task3执行。

注意:可以为一个任务打上多个tag。

 

编写接口压测脚本文件locustfile.py

复制代码
from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def setup(self):
        print('task setup')

    def teardown(self):
        print('task teardown')

    def on_start(self):
        # 虚拟用户启动Task时运行
        print('start')

    def on_stop(self):
        # 虚拟用户结束Task时运行
        print('end')

    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def profile(self):
        self.client.get("/profile")

class WebsiteUser(HttpLocust):
    def setup(self):
        print('locust setup')

    def teardown(self):
        print('locust teardown')

    host = http: // XXXXX.com
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000

if __name__ == '__main__':
    pass
复制代码

说明:

Locust类有setup和teardown,TaskSet类有setup、teardown、on_start、on_stop。

每次启动locust时运行setup方法,退出时运行teardown方法,locust执行TaskSet时运行TaskSet的setup方法,退出时运行teardown方法,每个虚拟用户执行操作时运行on_start方法,退出时执行on_stop方法,运行上面的脚本,执行顺序如下:

执行顺序:Locust setup → TaskSet setup → TaskSet on_start → TaskSet tasks → TaskSet on_stop → TaskSet teardown → Locust teardown

创建ScriptTasks()类继承TaskSet类: 用户行为类,用于定义测试业务场景。
创建index()、about()、demo()方法分别表示一个行为,访问http://example.com。用@task() 装饰该方法为一个任务。1、2表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在当前ScriptTasks()行为下的三个方法得执行比例为2:1:1
WebsiteUser()类: 用于定义模拟用户。
task_set : 指向一个定义了的用户行为类。
host: 指定被测试应用的URL的地址
min_wait : 用户执行任务之间等待时间的下界,单位:毫秒。
max_wait : 用户执行任务之间等待时间的上界,单位:毫秒。

参考:

https://docs.locust.io/en/stable/writing-a-locustfile.html

https://www.cnblogs.com/monogem/p/10715637.html

posted @   -零  阅读(604)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-12-28 【经典算法】冒泡排序
2019-12-28 wxpython笔记:Wxpython事件处理机制
点击右上角即可分享
微信分享提示