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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 深聊性能测试,从入门到放弃之: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)

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

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

但是难度:★★★☆,

毕竟,老话说的话:


会了不难,难了不会!


相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
14天前
|
测试技术 持续交付 开发者
探索自动化测试的无限可能:从入门到精通
在软件开发领域,确保产品质量是至关重要的。自动化测试作为一种高效、可靠的测试方法,正逐渐成为行业标准。本文将带你深入了解自动化测试的世界,从基础概念到实践技巧,帮助你掌握这一强大的工具。无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识和启发。
|
21天前
|
测试技术
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
本文是关于自动化测试项目实战笔记,主要介绍了如何测试用户注册功能,包括验证码错误、注册成功以及弹框处理的测试步骤和代码实现。
70 2
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
|
21天前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
100 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
4天前
|
监控 jenkins 测试技术
探索软件测试的新篇章:自动化与持续集成
【10月更文挑战第25天】在数字化时代的浪潮中,软件已成为驱动世界的核心力量。然而,随着软件复杂性的增加,传统的测试方法已无法满足快速迭代和高质量交付的需求。本文将探讨如何通过自动化测试和持续集成(CI)来提升软件开发的效率和质量,同时确保产品的稳定性和可靠性。我们将从自动化测试的基础出发,逐步深入到持续集成的实践,并展示如何通过实际案例实现这一转变。
|
2天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
12 2
|
3天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
18 2
|
4天前
|
jenkins 测试技术 持续交付
探索软件测试中的自动化与持续集成
【10月更文挑战第25天】在软件开发的海洋中,自动化测试和持续集成(CI)是引领航船穿越波涛的灯塔。本文将带你了解如何通过搭建自动化测试框架和实施持续集成策略来提高软件质量和开发效率。我们将以一个实际的代码示例为起点,逐步深入讲解如何整合自动化测试到你的CI/CD流程中。
|
4天前
|
jenkins 测试技术 持续交付
探索软件测试的新篇章:自动化与持续集成的融合
【10月更文挑战第25天】在软件开发的世界里,质量是王道。本文将带你领略如何通过自动化测试和持续集成(CI)的结合,提升软件交付的速度与质量,确保每一次代码提交都是一次胜利的宣言。
|
6天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
8天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【10月更文挑战第21天】在现代IT基础设施的管理中,自动化运维已成为提升效率、降低错误率的关键。Ansible,作为一种简单而强大的自动化工具,正被广泛应用于配置管理、应用部署和任务自动化等领域。本文将引导你了解Ansible的基本概念,通过实际案例展示如何利用Ansible简化日常运维工作,并探讨其在现代IT运维中的应用价值。无论你是新手还是有经验的系统管理员,这篇文章都将为你开启Ansible的高效之旅提供指导。