locust负载测试框架

author author     2022-08-21     406

关键词:

Locust是一个简单易用的分布式负载测试工具,主要用来对网站进行负载压力测试。

以下是github上的仓库地址

https://github.com/yileye/locust

官网地址:

http://locust.io/

Locust特性

  • 使用Python编写模拟用户行为的代码,无需繁琐的配置

  • 分布式可扩展,能够支持上百万用户

  • 自带Web界面

  • 不仅能测试web系统,也可以测试其它系统

Locust思想

在测试过程中,一群用户将访问你的网站。每个用户的行为由你编写的Python代码定义,同时可以从Web界面中实时观察到用户的行为。

Locust完全是事件驱动的,因此在单台机器上能够支持几千并发用户访问。与其它许多基于事件的应用相比,Locust并不使用回调,而是使用gevent,而gevent是基于协程的,可以用同步的方式来编写异步执行的代码。每个用户实际上运行在自己的greenlet中。

Locust安装

Locust可以通过pip或者easy_install安装:

pip install locustio
或者
easy_install locustio

安装完Locust后,shell命令locust就可以使用了,可以查看locust命令有哪些选项:

locust --help

如果打算以分布式模式运行Locust,建议同时安装pyzmq:

pip install pyzmq
或者
easy_install pyzmq

Locust初步使用

概念理解(翻译):

1. 超级类是 locust 类,它的每一个实例代表了一个用户, 守护程序会为每一个模拟用户生成一个实例

2. httplocust 继承了locust 类, 添加了可以发送http请求的功能

3. locust 有一个属性(成员变量)是 task_set , 它可以定义用户的行为, 就是访问哪些URL, post还是get, 每个连接占总访问量比是多少

这个task_set 是类TaskSet(或其子类)的一个实例, 上边说的各种行为就是在这个类里边定义的

4. locsut类:

属性: min_wait/max_wait  模拟用户有在上边说的类中定义了好多任务/行为, 每个任务/行为间隔多久执行一次, 单位是毫秒, 默认1000, 也即隔一秒种后执行下一个任务

属性: weight 权重: 模拟时, 同一段时间, 手机用户的访问量要比PC的访问量大, 那么对应的locust(或其子类)的weight值就大小不一

属性: host 就是需要被压测的网站的域名(或域名前缀), 如果启动服务时没有通过参数-host来指定域名, 那么就用使用该host属性指定的值

TaskSet类:

1. 推荐的是, 在taskset类(或子类)中通过在行为(回调函数)前加@task(weight)描述符来指定某一个行为被执行的频率

2. 或者先定义行为(回调函数), 然后通过属性tasks来指定每一个行为被执行的频率 tasks=[fun1, fun2....] 或者 tasks={fun1:weight1, fun2:weight2......}

3. 不管怎样定义, 里边的行为或函数是被随机调用/执行的, 只是根据weight的不通, 随机到的频率不通而已

4. 而且, 行为/任务可以嵌套执行, 先执行task1(也就是 fun1 下同), 然后执行task2 ..... 这样会更真实的模拟,

其写法就是, 将这些有关联任务定义/封装到一个taskset子类中, 然后通过上边介绍的 tasks属性tasks={classname:weight}, 在另一个TaskSet子类中去关联该类以达到嵌套的目的

5. 在执行子任务时, 通过 self.interrupt() 来终止子任务的执行, 来回到父任务类中执行, 否则子任务会一直执行

6. 成员函数, on_start(), 如果定义的话, 就会在开始的时候执行

HttpLocust类

1. 他可以发送http请求, 他有一个属性叫client(实例化的时候自动生成), 存储HttpSession类的实例(HttpSession类在实例化Locust的时候自动创建), 用来保存请求session

2. TaskSet类里也有属性client: self.client.get()或者self.client.post(), 这个client内部就是httplocust里的client

3. 请求返回一个对象, 他有两个成员, response.status_code 和 response.content

4. 如果因连接失败, 超时等等原因造成请求失败, 不会发出异常, 而是将上边的content置为空, status_code 置为0

5. 可以对返回content内容自定义处理, 因为有的时候返回404是你希望得到的

1 with client.get("/does_not_exist/", catch_response=True) as response: 2     if response.status_code == 404: 3         response.success()

6.对网站来说, 一个URL的参数是固定的, 但是参数值是不定的, 也可以处理

1 # Statistics for these requests will be grouped under: /blog/?id=[id]2 for i in range(10): 3     client.get("/blog?id=%i" % i, name="/blog?id=[id]")

 

其他, locust还有很多事件hook可以扩展开发, 有需要的可以去看官方文档, 内容没多少

locustfile.py例子

下面是一个简单的locustfile.py文件。

from locust import HttpLocust, TaskSetdef login(l):
    l.client.post("/login", {"username":"ellen_key", "password":"education"})def index(l):
    l.client.get("/")def profile(l):
    l.client.get("/profile")class UserBehavior(TaskSet):
    tasks = {index:2, profile:1}

    def on_start(self):
        login(self)class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait=5000
    max_wait=9000

在上面的代码中,定义了一些locust任务,这些任务是用Python函数定义的。这些函数传入一个参数,也就是Locust类的实例。这些任务然后被聚集在TaskSet类的tasks属性中,用来表示一个用户访问网站的行为。接着,HttpLocust类表示一个用户,这个用户具有哪些行为,以及该用户在执行下一个任务之前应该等待多长时间。

HttpLocust类继承于Locust类,它增加了一个client属性,这个client实际上是HttpSession实例,可以用来发起HTTP请求。

上面的代码示例了一种定义任务的方式,下面是一种更方便的方式,该方式使用了task装饰器。

from locust import HttpLocust, TaskSet, taskclass UserBehavior(TaskSet):
    def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
        self.login()

    def login(self):
        self.client.post("/login", {"username":"ellen_key", "password":"education"})

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

    @task(1)
    def profile(self):
        self.client.get("/profile")class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait=5000
    max_wait=9000

启动Locust

在shell中执行locust命令即可启动Locust。如果locustfile.py文件在当前目录,那么直接执行locust命令即可。如果locustfile.py文件在别的地方,可以执行

locust -f /path/to/locustfile.py

至于如何在分布式模式下运行Locust,请参考Running Locust distributed

打开Web界面

在shell中执行locust命令,如果没有问题的话,命令输出会提示可以在浏览器中打开Locust的Web界面,访问地址默认是http://127.0.0.1:8089。在浏览器中打开该地址,就可以看到像下面这样的Web界面:对于喜欢使用轻量级性能工具的同学,可以考虑学习一下。而且也可以导出类似Jmeter一样的聚合报告

技术分享



在本地机器上进行分布式 locust 负载测试

】在本地机器上进行分布式locust负载测试【英文标题】:Distributedlocustloadtestingonlocalmachine【发布时间】:2020-05-2809:55:05【问题描述】:我想知道是否可以在本地机器上运行locust?我的意思是在本地创建奴隶和主人。接下来我尝试... 查看详情

如何在 Locust 负载测试工具中获得详细的错误报告?

】如何在Locust负载测试工具中获得详细的错误报告?【英文标题】:HowcanigeterrorreportindetailedmannerinLocustLoadtestingtool?【发布时间】:2014-12-1500:00:10【问题描述】:如果我在Locust负载测试工具中点击任何网页,它会引发一些错误。... 查看详情

使用 xlsx 文件对 Locust 进行负载测试

】使用xlsx文件对Locust进行负载测试【英文标题】:UsingxlsxfiletodoloadtestingwithLocust【发布时间】:2021-04-2906:51:16【问题描述】:我想在locust中使用xlsx文件而不是单个数据进行发布请求。我如何在“self.client.post”中做到这一点?【... 查看详情

性能测试工具locust和jmeter比较-及相关书籍下载

ApacheJMeter™和Locust都是是最受欢迎的性能测试工具。JMeter和Locust-简介JMeter是久经考验的性能框架之一,其第一个版本大约在20年前发布。它是用纯Java语言编写的。最初,JMeter开发用于执行Web和FTP应用程序的负载测试。但是,现... 查看详情

Locust 负载测试:如何在所有其他 API 中为一个特定 API 分配单个用户

】Locust负载测试:如何在所有其他API中为一个特定API分配单个用户【英文标题】:Locustloadtesting:HowtoallocatesingleuserforoneparticularAPIamongallotherAPIs【发布时间】:2021-09-1515:16:30【问题描述】:我需要使用locust测试具有以下场景的API集... 查看详情

如何使用带有 locust 的 pythons 请求模块来加载测试一堆 api

】如何使用带有locust的pythons请求模块来加载测试一堆api【英文标题】:HowcanIusepythonsrequestmodulewithlocusttoloadtestbunchofapis【发布时间】:2020-06-2209:39:02【问题描述】:我有一个现有的api测试框架,它使用python3的requests模块。我决定... 查看详情

阿里云环境locust环境搭建

环境准备:阿里云服务器一台、python2.7、pipLocust介绍Locust是一个开源负载测试工具。使用Python代码定义用户行为,也可以仿真百万个用户。Locust简单易用,分布式,用户负载测试工具。Locust主要为网站或者其他系统进行负载测试... 查看详情

如何在 Locust 负载测试工具中计算每秒的实际请求

】如何在Locust负载测试工具中计算每秒的实际请求【英文标题】:HowtocalculateactualrequestpersecondinLocustloadtesttool【发布时间】:2021-04-2012:50:12【问题描述】:据我所知,UI屏幕上显示的蝗虫RPS是平均值。我如何计算每秒的时间【问... 查看详情

locust性能测试1-环境准备与基本使用(代码片段)

Locust简介Locust是一款易于使用的分布式用户负载测试工具。它用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少并发用户。这个想法是,在测试期间,一群蝗虫(Locust)会攻击你的网站。您定义了每个蝗虫Locust... 查看详情

张同乐-从零开始,打造高效可靠的locust性能测试

一、前言欢迎来到Locust负载测试的世界!Locust是一款开源的负载测试工具,它可以模拟成千上万的用户同时访问你的应用程序,以测试其性能和稳定性。这个工具具有易于使用、可扩展和高度可定制化等特点,因此被广泛应用于... 查看详情

locust安装

Locust介绍  Locust是一个易于使用、分布式的负载测试工具,它可以对网站或其他系统进行负载测试,并计算出一个系统能够承受多少的并发用户。Locust完全基于事件,因此可以在一台机器上支持数千名并发用户,与其他基于事... 查看详情

性能测试利器-locust框架解析

...自动化软件测试码同学抖音号:小码哥聊软件测试1认识Locust说起性能测试工具,大家肯定想到的都是Jmeter,是的,由于其简单易用、功能强大,已经变成主流的压测工具之一。当需要实现一些高级功能的时候,可以使用Java语言... 查看详情

性能测试利器-locust框架解析

01认识Locust说起性能测试工具,大家肯定想到的都是Jmeter,是的,由于其简单易用、功能强大,已经变成主流的压测工具之一。当需要实现一些高级功能的时候,可以使用Java语言对Jmeter进行扩展。但是很多小... 查看详情

不会吧,都2020年了,还有人不知道jmeter和locust的区别?(代码片段)

...。目前业界压测工具种类繁多,比如Loadrunner、Jmeter、Locust、Ngrinder、Apacheab、Wrk、Webbench等,其中开源的要以java的jmeter和pythonlocust首当其冲,那么今天就来说说他们之前的区别。ApacheJMeter和Locust都是是最受欢迎的性能... 查看详情

不会吧,都2020年了,还有人不知道jmeter和locust的区别?(代码片段)

...。目前业界压测工具种类繁多,比如Loadrunner、Jmeter、Locust、Ngrinder、Apacheab、Wrk、Webbench等,其中开源的要以java的jmeter和pythonlocust首当其冲,那么今天就来说说他们之前的区别。ApacheJMeter和Locust都是是最受欢迎的性能... 查看详情

使用 Locust 加载测试视频流

】使用Locust加载测试视频流【英文标题】:LoadTestVideoStreamingwithLocust【发布时间】:2020-09-2015:54:52【问题描述】:我正在研究如何使用Locust对视频流播放器进行负载测试,但无法使其正常工作。基本上,我有一个加载播放器的播... 查看详情

locust性能测试安装(代码片段)

Locust简介Locust是一款易于使用的分布式用户负载测试工具。它用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少并发用户。这个想法是,在测试期间,一群蝗虫(Locust)会攻击你的网站。您定义了每个蝗虫Locust... 查看详情

locust框架(初步安装使用)

首先安装locust(利用pip安装)安装前先将pip更新到最新版:python-mpipinstall--upgradepip 更新完成后开始安装locust:python-mpipinstalllocust 再安装request:python-mpipinstallrequests 安装完成后切换到《测试脚本》所在目录,启动性能... 查看详情