深聊性能测试,从入门到放弃之:Locust性能自动化(六)自定义生成负载图形形状

2023-11-09

1、引言

今天分享的这部分内容,应该算是Locust的进阶篇,
毕竟针对一般的性能自动化测试人员来说,
掌握小鱼写的前5章节的知识,就能足够应对大部分情况。
但是,针对有些需要进阶自己的技术,
那么,可以持续关注小鱼的博客
让我们一起探索Locust,探索性能自动化

那么,话不多说,我们开始今天的进阶篇,
自定义负载测试图形

2、定义

有些时候,默认的形状已经无法满足我们的特定要求,
那么这个时候,我们就需要完全自定义负载测试的图形形状。
而这并不难,就是通过设置 用户或者更更改用户数产生率来实现的。

2.1 列举实例

例如:我们想自定义时间生成负载峰值或上下倾斜。如何实现呢??

直接使用 LoadTestshape类,它可以完全的控制用户数产生率
是不是很Nice。

2.2 如何继承

在Locustfile文件中自定义一个继承LoadTestShape类的类,

如果有,则自动使用,
如果没有,则无法使用。

2.3 方法使用

1、在 此类中, 定义tick()方法

该方法返回具有所有用户数产生率的元组(无,则停止执行)。

Locust 大约每秒都会调用一次 tick()方法。

2、在该类用,访问 get_run_time()方法

来检查测试运行的时间。

3、代码实战

3.1 时间峰值

1、背景
在此形状类别,将100为单位,增加用户数,然后运行10分钟后停止。

2、代码

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-10-22

"""

from locust import LoadTestShape

class CustomShape(LoadTestShape):
	#设置时限
	time_limit = 600
	
	#设置产生率
	spawn_rate = 20

	def tick(self):
	'''
	设置 tick()函数
	并在tick()里面调用 get_run_time()方法
	'''
		#调用get_run_time()方法
		run_time = self.get_run_time()
		
		#做比较,运行时间在 10分钟之内,则继续执行
		if run_time < self.time_limit:
			
			#将用户数四舍五入到最接近的百分值
			uesr_count =round(run_time,-2)
			
			#返回user_count,spawn_rate这两个参数
			return (user_count,spawn_rate)
			
		return None

嗯,看着这个代码,是不是觉得没什么难度。
就短短的几行代码,这就实现了??
嗯,是的。确实,
不仅定义这一个图形,还有好几个呢。
跟着小鱼,接着往下看。

3.2 双波形

代码

老规矩,直接上代码,在代码中解析:

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-10-22

"""

import math
from locust import LoadTestShape
from locust import HttpUser,TaskSet,task,constant

class UserTasks(TaskSet):
	#设置task
    @task
    def get_root(self):
        self.client.get('/')


class WebsiteUser(HttpUser):
    wait_time = constant(0.5)
    tasks = [UserTasks]


class DoubleWave(LoadTestShape):
    '''
    自定义一个双波形图形,
    模拟在某两个时间点的最高值


    参数解析:
        min_users : 最小用户数
        peak_one_users : 用户在第一个峰值
        peak_two_users : 用户在第二个峰值
        time_limit : 测试执行总时间


    '''
    # 最小用户数
    min_users = 20

    #第一个峰值的用户数
    peak_one_users = 60

    #第二个峰值的用户数
    peak_two_users = 40

    #测试执行时间
    time_limit = 600

    def tick(self):

        #将get_run_time 四舍五入
        run_time = round(self.get_run_time)

        if run_time < self.time_limit:

            user_count = (
            (self.peak_one_users - self.min_users)
            # *math.e **  - (((run_time / (self.time_limit / 10 *2 / 3)) - 5) ** 2)
             * math.e ** -(((run_time / (self.time_limit / 10 * 2 / 3)) - 5) ** 2)
            + (self.peak_two_users - self.min_users)
            * math.e ** -(((run_time / (self.time_limit / 10 * 2 / 3)) - 10) ** 2)
            + self.min_users

            )
            return (round(user_count),round(user_count))
        else:
            return None

3.3 基于时间阶段

代码
同样,上代码,在代码中解析:

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-10-22

"""

from locust import LoadTestShape
from locust import HttpUser,TaskSet,task,constant

class UserTasks(TaskSet):


    @task
    def get_root(self):
        self.client.get('/')


class WebsiteUser(HttpUser):
    wait_time = constant(0.5)
    tasks = [UserTasks]



class StagesShape(LoadTestShape):
    '''
    在不同的阶段 具有不同的用户数和 产生率的 图形形状


    参数解析:
        stages :字典列表,每个字典都具有下列这些键值的阶段:
            duration -- 持续时间,  经过多少秒后,进入到下个阶段
            users -- 总用户数
            spawn_rate -- 产生率,即每秒启动/停止的用户数
            stop -- 可以在特定阶段停止测试的值
        stop_at_end -- 可以在所有阶段设置运行后停止

    '''


    stages = [
        {"duration": 60, "users": 10, "spawn_rate": 10},
        {"duration": 100, "users": 50, "spawn_rate": 10},
        {"duration": 180, "users": 100, "spawn_rate": 10},
        {"duration": 220, "users": 30, "spawn_rate": 10},
        {"duration": 230, "users": 10, "spawn_rate": 10},
        {"duration": 240, "users": 1, "spawn_rate": 1}

    ]

    def tick(self):

        run_time = self.get_run_time()

        for stage in self.stages:
            if run_time < stages['duration']:
                tick_data = (stage['users'],stage['spawn_rate'])
                return tick_data

        return None


3.4 逐步加载

代码
同样,上代码,在代码中解析:

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-10-22

"""

from locust import LoadTestShape
from locust import HttpUser,TaskSet,task,constant

class UserTasks(TaskSet):


    @task
    def get_root(self):
        self.client.get('/')


class WebsiteUser(HttpUser):
    wait_time = constant(0.5)
    tasks = [UserTasks]




class StepLoadShaper(LoadTestShape):
    '''
    逐步加载实例

    参数解析:
        step_time -- 逐步加载时间
        step_load -- 用户每一步增加的量
        spawn_rate -- 用户在每一步的停止/启动 
        time_limit -- 时间限制

    '''
    setp_time = 30
    setp_load = 10
    spawn_rate = 10
    time_limit =  600

    def tick(self):
        run_time = self.get_run_time()

        if run_time > self.time_limit:
            return None

        current_step = math.floor(run_time /self.setp_time) +1

        return(current_step * self.setp_load,self.spawn_rate)


今天的内容,就是这么多,
总的来说,还算不难,虽然小鱼把这篇划分到进阶篇,
但是难度:★★★☆,
毕竟,老话说的话:

会了不难,难了不会!

这每次写到这里,小鱼都会唠叨一次,

关于更多的Locust的系列博文,点击即可跳转。

如果想学习更多的知识,那就直接点击下面的链接

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

性能自动化:点击 性能学习与进阶

WebUI自动化:点击Web UI自动化学习与进阶

移动APP自动化:点击 移动APP自动化学习与进阶

Pyhton开发:点击 Python学习与进阶

MySQL:点击 MySQL学习与进阶

接口自动化:点击 接口自动化学习与进阶

并发(接口&性能):点击 并发学习与进阶

Python爬虫:点击 Python爬虫学习

Python数据分析:点击 Python数据分析实战

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

喜欢的可以持续关注,小鱼也是定期的更新博文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深聊性能测试,从入门到放弃之:Locust性能自动化(六)自定义生成负载图形形状 的相关文章

随机推荐

  • 爬虫逆向实战(20)-某99网站登录(魔改md5、图片验证码)

    一 数据接口分析 主页地址 某99网站 1 抓包 通过抓包可以发现登录接口是AC userlogin 2 判断是否有加密参数 请求参数是否加密 通过查看 载荷 可以发现txtPassword和aws是加密参数 请求头是否加密 无 响应是否加
  • Adobe系列软件安装不上怎么办,别着急看这里

    最近有许多用户反映安装Adobe系列软件安装不上 如PS 安装提示 发生了未知错误 错误代码 1 这是因为你的电脑之前安装过PS 卸载不干净导致 可以参考本教程清理PS的残留文件 注意 此教程会清理所有Adobe相关文件 如果你只想清理PS
  • [转帖]阿里的JDK预热warmup过程

    预热warmup过程 https blog csdn net wabiaozia article details 82056520 Jwarmup 原理是记录上一次运行时已经变成native code 的class function 以及加
  • 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net m0 37564426 article details 85563170
  • linux--主机规划和磁盘分区

    linux与硬件的搭配 桌面计算机 Desktop 的用户 应该会用到 X Window 系统 此时 显示适配器的优劣与内存的大小可就占有很重大的影响 如果是想要做成文件服务器 那么硬盘或者是其他的储存设备 应该就是您最想要增购的组件 认识
  • 一个用于灰度标定的matlab函数

    处理图像时 导致像素值跨越由负数到正数的较宽范围的计算是很常见的 我们在计算的时候一般都是用的double类型哈 尽管在中间计算过程中不会导致问题 但当我们想要利用8位 uint8 或16位 uint16 格式保存或观看一幅图像时 就会出现
  • leetcode 数组

    知识点 二分 模板 有等号 704 34 35 69 367 双指针 两边向中间 快慢 中间向两边 26 27 283 844 977 1 移除元素 这里固定慢指针 遍历快指针 当然还是两头出发的写法更好懂 2 滑动窗口 209 904 7
  • CSS核心知识点

    目录 1 什么是CSS 1 1 快速入门 1 2 CSS 导入三种方式 2 选择器 2 1 基本选择器 2 2 层次选择器 2 3 结构伪类选择器 2 4 属性选择器 常用 3 美化网页元素 3 1 为什么要美化网页 3 2 字体样式 3
  • VMware16安装CentOS7.6虚拟机

    Centos7 6系统镜像下载 直接网页下载非常慢 建议下载torrent种子后用迅雷等下载工具下载 Centos7 6系统镜像 镜像实测可用 现在好多Centos7 6的镜像都挂掉了 上面的依然坚挺 创建虚拟机 gt 典型 稍后安装 选择
  • python使用matplotlib绘制折线图

    python使用matplotlib绘制折线图 Python绘图需要下载安装matplotlib模块 它是一个数学绘图库 我们将使用它来制作简单的图表 一 绘制单条折线图 import matplotlib pyplot as plt pl
  • 如何看论文(一)

    论文初步 开个头 即将进入研究生的大门 开始研究生的学习生活 将要面对成堆的论文 组会 以及等等 才发现最基础的看论文 也只是在大四毕设的时候粗略地尝试过几篇 离真正的看论文还差得很远 并且 在研究生阶段 按我的理解 看懂一篇文章没什么 讲
  • Ubuntu忘记密码(五个小步骤)

    Ubuntu忘记密码 五个小步骤 可能用到的操作 按键 鼠标操作 作用 进入虚拟机屏幕 点击 鼠标焦点在虚拟机中 接下来的操作都在虚拟机中响应 退出虚拟机屏幕 ctrl alt 将鼠标焦点从虚拟机中移除 回到主屏幕 步骤一 重启虚拟机 注意
  • 图形学实验四线段裁剪算法

    实验四 线段裁剪算法 实验类型 设计型 实验学时 2实验要求 必修 一 实验目的 了解二维图形裁剪的原理 点的裁剪 直线的裁剪 多边形的裁剪 利用VC OpenGL实现直线的裁剪算法 二 实验内容 1 理解直线裁剪的原理 编码裁剪算法 梁友
  • 采用python编写微信自动回复程序(基于图灵机器人)

    采用python编写微信自动回复程序 基于图灵机器人 写在开头 注册CSDN这么久 第一次发博客 难免有写得不明白的地方 请读者们谅解 一 要实现微信自动回复 需要如下准备 1 注册一个图灵机器人 现在是要收费的 不过一个月的费用也不是很贵
  • git中关于用户信息的命令

    一 前言 工作中需要查看git的一些用户信息 现将其记录如下 二 相关命令 查看当前项目的用户信息 该信息保存在项目下面隐藏文件夹 git config文件中 查看用户名称 git config user name 查看用户邮箱 git c
  • 通过Valgrind的Massif工具进行C++内存使用分析

    关于Valgrind的简介可以参考 https blog csdn net fengbingchun article details 50196189 Valgrind在Ubuntu上的安装可以参考 https blog csdn net
  • 【ARM】使用Ubuntu-base构建根文件系统

    使用Buildroot构建根文件系统 介绍 资源下载 配置根文件系统 设置软件源 安装必要软件 添加新用户 设置主机名称和本机IP 设置终端串口 网络DHCP FTP服务器搭建 串口无法登录 开机启动信息显示 Failed to inser
  • 硕士毕业生找工作经验体会(怎样才能说服你面前的HR)

    下个月就要离开交大了 这个我呆了将近7年的地方 最后想留下一点关于找工作方面的经验体会 从05年考研结束的时候开始找工作 之后知道研究生录取之后找实习 一直到07年正式找工作 期间我接触过很多行业 很多人 很多职位 从一开始 我就听无数人在
  • JavaEE 笔记01: 基于Tomcat, Servlet, JSP的简单作业管理系统

    基于Tomcat Servlet JSP的简单作业管理系统 目录 基于Tomcat Servlet JSP的简单作业管理系统 前言 2020年3月25日更新 2020年3月26日更新 2020年4月8日更新 2020年4月16日更新 202
  • 深聊性能测试,从入门到放弃之:Locust性能自动化(六)自定义生成负载图形形状

    自定义峰值形状 1 引言 2 定义 2 1 列举实例 2 2 如何继承 2 3 方法使用 3 代码实战 3 1 时间峰值 3 2 双波形 3 3 基于时间阶段 3 4 逐步加载 1 引言 今天分享的这部分内容 应该算是Locust的进阶篇