locust性能测试和分布式压测

news2024/11/23 18:34:03

一、工具介绍

Locust是一个开源的Python性能测试工具,用于模拟大量并发用户访问网站、API等,以测试系统的性能和稳定性。它的主要特点包括:

1.简单易用:Locust基于Python编写,使用方便,学习曲线较低。

2.分布式支持:Locust支持分布式部署,可以在多台机器上运行,以模拟更大的并发用户。

3.实时监控:Locust提供实时监控和报告,可以查看测试性能指标、请求响应时间、错误率等数据。

4.脚本编写:Locust使用Python编写测试脚本,支持自定义请求和用户行为。

5.可扩展性:Locust支持自定义插件和扩展,可以满足不同测试需求。

在使用Locust进行性能测试时,需要编写Python脚本来定义用户行为和请求,然后使用Locust运行测试脚本,并设置并发用户数、请求频率等参数。Locust会模拟用户行为和请求,并记录性能数据,最后生成测试报告。

二、在项目中的应用

2.1 说明

本次测试的目的在于探查公司自研系统测试环境的系统业务处理性能,以及在高负载情况下的系统表现,通过对于项目架构和业务场景分析,设计从小程序 登录->首页刷新->设备数据监测/控制记录->设备采集数据查询->设备阈值保存(含web端接口)业务链路模型进行模拟和测试,实现多接口顺时并发压测,设计操作接口、并发比例等详情如下:

在这里插入图片描述
在这里插入图片描述

2.2示例代码脚本

import os, random
from locust import HttpUser, events, task, between


class UserBehavior(HttpUser):  # 定义一个TaskSet类,用于定义用户行为  TaskSet,HttpUser
    # @task  # 若添加@task装饰器,则该方法会在每个用户执行任务时执行,此处注销
    def on_start(self):  # 在测试开始执行的方法,用于进行登录操作获取token,用于后续接口的带入调用
    	# 定义Content-Type请求头类型和请求体
        self.client.headers = {'Content-Type': 'application/json'}
        payload = {'username': 'xxx',
                   'password': 'xxxxx'}
        rs_login = self.client.post('url',
                                    headers=self.client.headers,
                                    json=payload)
        # 从登录接口返回值中获取token,添加至Content-Type请求头中
        self.client.headers['Authorization'] = 'Bearer ' + rs_login.json()['data']['access_token']
        print(self.client.headers)
        pass

    # @task
    def on_stop(self):
        pass


    # 在@task后添加(weight=权重值),若不填写(weight=权重值),只有task则默认的任务权重为1。注:(weight=权重值)要带上weight=,否则只有数值时,则这个数字将被解释为一个位置参数,而不是权重。
    @task
    def test_login(self):  # 登录接口
        self.client.headers = {'Content-Type': 'application/json'}
        payload = {'username': 'xxx',
                   'password': 'xxx'}
        rs_login = self.client.post('url',
                                    headers=self.client.headers,
                                    json=payload)
        self.client.headers['Authorization'] = 'Bearer ' + rs_login.json()['data']['access_token']


    @task(weight=3)
    def test_refresh(self):
        rs_rf0 = self.client.post('url',
                                    headers=self.client.headers)
        print(rs_rf0.json()['code'], '刷新操作')

        rs_rf1 = self.client.post('url',
                                    headers=self.client.headers,
                                  json={'测试数据': ["xxx"]})
        print(rs_rf1.json()['code'], '刷新操作2')


    @task(weight=2)
    def test_query(self):
        data1 = {'28C5363480B514FFA': '测试数据1',
                 '6440FBF646F0010FA': '测试数据2',
                 '642B972C2350035FA': '测试数据3',
                 '6444A4A83250001FA': '测试数据4',
                 '28C46609643A3EDFA': '测试数据5'}

        try:
            for id, msg in data1.items():
                rs_refresh1 = self.client.post('url',
                                            headers=self.client.headers,
                                               json={"测试数据"})
                print(rs_refresh1.json()['code'], msg, rs_refresh1.json()['msg'])
        except Exception as e:
            print(e)
            
class WebsiteUser(UserBehavior):  # 定义一个HttpUser类,继承以上的UserBehavior任务类。
    wait_time = between(0.1, 1.0)  # 定义用户执行任务之间的等待时间,使用between函数指定等待时间范围为0.1秒到1秒之间。
    host = "url"  # 指定要测试的主机地址。
    min_wait = 1000  # 指定用户在执行任务之间的最小和最大等待时间,单位为毫秒。
    max_wait = 3000

if __name__ == '__main__':
    os.system(r'locust -f 脚本路径 --host=测试地址 --web-host=web监控地址,一般为自己的主机ip,若不设置则默认为localhost --web-port=8089')

先做个基准测试,在小并发条件下,探测系统各性能指标表现,作为后续比对基础。

场景一:设置50并发,每秒增长用户数量为5

点击启动按钮后开始压测,在本页面即可查看监控各项性能数据和图标信息
在这里插入图片描述
在这里插入图片描述
download data - download report中可下载HTML格式的测试报告
在这里插入图片描述

三、分布式压测

3.1 说明

分布式压测是指使用多个节点或机器同时模拟大量并发用户进行性能测试的方法。每个节点负责模拟一部分用户,发送请求并记录性能数据,然后将数据汇总到一个中心节点进行分析和报告生成。

使用分布式压测的场景包括:

1、高并发负载测试:当系统需要处理大量并发用户时,使用分布式压测可以模拟真实的用户行为和流量模式,评估系统的性能和响应能力。这对于在线购物、社交媒体、电子支付等高流量应用特别重要。

2、弹性和扩展性测试:分布式压测可以模拟系统在不同负载下的性能表现,帮助确定系统的弹性和扩展性。通过增加节点,可以模拟更大规模的用户并发,测试系统在高负载下的稳定性和可扩展性。

3、负载均衡测试:在分布式系统中,负载均衡是重要的组成部分。使用分布式压测可以模拟多个节点同时向负载均衡器发送请求,评估负载均衡的性能和效果,确保系统能够平衡负载并提供高可用性。

4、容量规划和优化:通过分布式压测,可以确定系统的容量和性能瓶颈,帮助进行容量规划和优化。通过模拟大规模的并发用户,可以找到系统的瓶颈点,并采取相应的优化措施,提高系统的性能和稳定性。

3.2 实现方式

创建主节点(1个)和从节点脚本(可多个),主节点脚本主要要来监控,从节点脚本代码可主节点脚本代码一致,可根据实际需求修改压测接口,若要测试多个不同接口可在从节点脚本代码中修改或增加任务。

3.3示例代码

3.3.1主节点

import os
from locust import HttpUser, TaskSet, task


# 定义任务类
class UserTask001(HttpUser):
    @task  # 申明需要执行的任务
    def get_index(self):
        self.client.get('/22')  # client是requests的对象

    @task
    def get_image(self):
        self.client.get('/s?ie=utf-8&wd=locust视频')


# 执行任务类
class WebSiteUser(UserTask001):
    # tasks = [UserTask001]  # 定义需要执行的任务集
    min_wait = 1000  # 最小等待时间(思考时间)
    max_wait = 2000  # 最大等待时间(思考时间)
    host = 'http://www.baidu.com'  # 设定请求的域名

if __name__=="__main__":
    #开启master模式
    os.system('locust -f D:\py_code\stress\master_node.py --master')

注:主节点的执行方式命令必须要加上参数–master

3.3.2从节点

import os
from locust import HttpUser, task


# 定义任务类
class UserTask001(HttpUser):
    @task  # 申明需要执行的任务
    def get_index(self):
        self.client.get('/22')  # client是requests的对象

    @task
    def get_image(self):
        self.client.get('/s?ie=utf-8&wd=locust视频')


# 执行任务类
class WebSiteUser(UserTask001):
    # tasks = [UserTask001]  # 定义需要执行的任务集
    min_wait = 1000  # 最小等待时间(思考时间)
    max_wait = 2000  # 最大等待时间(思考时间)
    host = 'http://www.baidu.com'  # 设定请求的域名

if __name__=="__main__":
    #开启master模式
    os.system('locust -f D:\py_code\stress\secondary.py --worker')

注:主节点的执行方式命令必须要加上参数–worker,运行后可在主节点控制台查看详情,执行多个从节点脚本则会显示多个worker
在这里插入图片描述
web-ui监控页面详情
在这里插入图片描述
主节点主要用于监控从节点的执行情况,若主节点和从节点脚本分别在不同的测试机上,在执行脚本时需要加上定义的–web-host=IP,ip需对应才可连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库基本操作--------MySQL 索引

目录 一、MySQL 索引 1.索引的概念 2.索引的作用 3.创建索引的原则依据 4.索引的分类和创建 (1)普通索引 ●直接创建索引 (2)唯一索引 (3)主键索引 ●创…

禁止浏览器自动填充密码功能,设置自动填充背景色。

禁止浏览器自动填充密码功能,设置自动填充背景色 1、禁止浏览器自动填充密码功能2、设置自动填充背景色(阴影效果) 1、禁止浏览器自动填充密码功能 text设置autocomplete“off” password设置 autocomplete“new-password” 两个一起设置&am…

雪花算法生成分布式ID源码分析及低频场景下全是偶数的解决办法

目录 雪花算法原理介绍 雪花算法源码分析 低频场景下都是偶数的原因 解决雪花算法的偶数问题 1、切换毫秒时使用随机数 2、抖动上限值加抖动序列号 雪花算法原理介绍 雪花算法(snowflake)最早是twitter内部使用的分布式下的唯一id生成算法,在2014年开源&…

【iOS】消息传递与消息转发

Objective-C是一门非常动态的语言,以至于确定调用哪个方法被推迟到了运行时,而非编译时。与之相反,C语言使用静态绑定,也就是说在编译期就能决定程序运行时所应该调用的函数,所以在C语言中, 如果某个函数没…

MySQL优化 | 如何正确使用索引

文章目录 一、简介1、索引的作用和优势2、索引的基本原理和数据结构 二、常见索引类型和适用场景1、B-Tree索引及其适用场景2、哈希索引及其适用场景 三、选择合适的索引策略1、 选择合适的列作为索引2、使用复合索引和最左前缀原则3、 覆盖索引的使用技巧 四、索引的创建和维护…

IDEA项目报错随笔记录

文章目录 1. 无效的源发行版: 172. java: 无法访问org.springframework.boot.SpringApplication3. java: 程序包org.junit.jupiter.api不存在4. SpringbootTest注解爆红5. maven命令安装本地jar包报错:[拒绝访问]5. maven命令安装本地jar包报错:Unknown …

华为OD机试真题 Java 实现【矩阵元素的边界值】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、再输入5、再输出6、再说明 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多&#xff…

IOS与Android APP开发的差异性

iPhone和 Android是全球最流行的两种移动平台,有许多不同的开发者开发了应用程序,并将它们发布到市场上。虽然大多数开发者都使用了这两个平台,但您仍然需要了解它们的差异。 虽然 iOS和 Android两个平台都是基于 Linux,但它们却…

流程提效80%!从3个维度搭建高效的数字化采购体系...

采购是企业经营的一个核心环节,也是企业获取利润和市场资源的重要部门,对于企业订单交付尤为关键。特别是在装备制造行业,项目多、零件品类多、定制化高、订单交付周期短,边设计边采购边生产,企业采购负荷重&#xff0…

读书笔记怎么写?心理学名著《乌合之众》读书笔记!

世界上这么多人,看似每个人是一个独立的个体,但其实众生如蚁,彼此相互影响,形成了复杂而神秘的群体心态。 当我们融入群体时,个人的特质会被群体弱化,变得盲从、愚昧甚至暴力,这就是《乌合之众》…

IP地址:超网监控

随着组织的 IT 基础架构的扩展,新设备会不断添加以满足不断增长的网络需求。这就需要跨多个子网管理数百个 IP 地址,以确保每个新添加的设备都配置了唯一的 IP 以连接到网络。为了简化此过程,网络管理员依赖于网络超网的概念,也称…

事务隔离级别是如何实现的

事务隔离级别是如何实现的 数据库系统提供了以下 4 种事务隔离级别 读未提交:解决了回滚覆盖类型的更新丢失,但可能发生脏读现象(一个事务读取到了另一个事务修改但未提交的数据),也就是可能读取到其他会话中未提交事务修改的数据。 已提交…

解决报错:FUNC glfwErrorCallback GLX: Failed to create context: GLXBadFBConfig

解决报错:FUNC glfwErrorCallback GLX: Failed to create context: GLXBadFBConfig 执行glxinfo | grep OpenGL命令查看系统中的OpenGL信息时,显示以下信息: 根据得到的信息可以看到 OpenGL core profile version string 为 4.5 说明显卡驱…

基于web的考研信息交流平台/考研信息分享平台的设计与实现

摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,考研信息交流平台也不例外,但目前国内的有些平台仍然都使用人工管理,浏览网站人数越来越多,同时信息量也越来越庞大,人工管理显然已无法应对时…

【复杂系统】拥抱复杂性(第 2 部分数据)

如何通过三个简单(ish)步骤将您的组织网络化……从数据开始 您的信息不想被困在一个盒子里 在本文的第一部分中,我们确定了工业时代将复杂性组织成漂亮、整洁的线性盒子,尽管这是一种高效的机器制造方式,但这种方法已不…

cucumber基于BBD的自动化测试

1.1 BDD介绍 行为驱动开发(Behavior Driven Development,BDD)简历在测试驱动开发的基础上,并且优化了很多TDD实践者的良好习惯。BDD可以通过自然语言来描写自动化测试,增加自动化的可阅读性. 1.2 cucumber原理 reshen目前有很多BDD的框架&a…

达观曹植大模型正式对外公测!专注于长文本、多语言、垂直化发展

大模型时代到来,国内出现“百模大战”的局面。达观数据自23年3月宣布研发大语言模型以来,一直积极探索大语言模型的专业化、特长化和产品化。通过多年的高质量数据积累,不断精进算法创新,结合多年的文本处理工程实践经验&#xff…

【C】自定义类型详解

自定义类型 结构体结构体类型声明特殊的声明 结构的自引用结构体的定义和初始化结构体的内存对齐为什么存在内存对齐呢?修改默认的对齐参数 结构体传参位段位段的内存分配位段的跨平台问题 枚举枚举类型的定义枚举的优点枚举的使用 联合(共用体&#xff…

刷题记录03

题目一. 具体思路: 这里就是,一个简单的解方程的一个思路,首先我们要理清楚,这道题,这里面的思路 A-Ba B-Cb ABc BCd 由上面的关系得出下面的解 A(a c)/2 B1(bd)/2 B2(c-a)/2 C(b-d)/2 具体代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信…

maven-依赖管理-上

依赖管理 依赖配置 一句话: 依赖指当前项目运行需要的jar&#xff0c;一个项目可以设置多个依赖 依赖的举例 <!-- 解读: 1. 这里就是引入项目需要的jar 包, 类似传统的import jar 的作用 2. 在dependencies 标签内&#xff0c;可以指定多个需要依赖的jar/导入的jar 3. 引…