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

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

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)

今天的内容,就是这么多,

总的来说,还算不难,虽然小鱼把这篇划分到进阶篇,

但是难度:★★★☆,

毕竟,老话说的话:


会了不难,难了不会!


目录
相关文章
|
10月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
621 1
|
测试技术 持续交付 开发者
探索自动化测试的无限可能:从入门到精通
在软件开发领域,确保产品质量是至关重要的。自动化测试作为一种高效、可靠的测试方法,正逐渐成为行业标准。本文将带你深入了解自动化测试的世界,从基础概念到实践技巧,帮助你掌握这一强大的工具。无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识和启发。
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
517 2
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
647 3
|
12月前
|
Web App开发 JavaScript 测试技术
Playwright 极速入门:1 小时搞定环境搭建与首个测试脚本
本文带你1小时快速入门Playwright,完成环境搭建并编写首个测试脚本。Playwright是微软推出的现代化Web自动化测试工具,支持Chromium、Firefox和WebKit三大浏览器引擎,具备跨平台、多语言(Python/JS/Java/C#)特性。其核心优势包括:智能自动等待机制减少失败率、内置录制工具实时生成脚本、多语言灵活选择,以及真移动端设备模拟能力,显著提升测试效率和可靠性。
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
1385 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
7295 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
机器学习/深度学习 JSON 算法
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
4984 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
2478 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇

热门文章

最新文章