• 1
  • 0
分享

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_奕然
@ time : 2022-07-12
"""
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_奕然
@ time : 2022-07-12
"""
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_奕然
@ time : 2022-07-12
"""
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_奕然
@ time : 2022-07-12
"""
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)

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

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

但是难度:★★★☆


我是Carl_奕然


51Testing认证讲师

CSDN博客专家


关注我,带你学习更多更专业的测试开发知识。


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   据台湾《经济日报》,特斯拉正在增加 Dojo D1 超级计算机芯片的订单。Dojo D1 是特斯拉专门为 Dojo 超级计算机设计的定制芯片,由台积电代工。  知情人士透露,特斯拉计划明年将 Dojo D1 芯片的产量增加一倍,达到 1 万片。预计到 2025 年,台积电代工的 Dojo D1 芯片订单量将持续增加,考虑到 Dojo 超级计算机的可扩展性。  特斯拉使用 Dojo 超级计算机训练高级驾驶辅助系统和完全自动驾驶系统的人工智能模型。随着 FSD、自动驾驶出租车和 Optimus 机器人等项目的推出,Dojo 超级计算机对公司运营的贡献可能会更大。  特斯拉增加 Dojo D1 ...
            0 0 638
            分享
          •   正常情况下,有了四年的测试工程师经历,应该可以达到中级测试工程师的水平了。作为一个初中级测试工程师下一步是转开发还是继续做测试,个人建议是做测试开发!  本篇文章将由以下四个部分来展开:  ·可以继续做测试吗?  ·转行做开发可以吗?  ·为何说建议转行测试开发?  ·如何走向测试开发,有什么靠谱的办法?  一、可以继续做测试吗?答案是行不通  这里所说的测试是指普通的“手工测试”,如果只是做普通的手工测试,只是每天机械的进行“点点点”,想拿高薪是不太现实的。即使工作的时间长了,但是大部分人员还是停留在初级测试工程师的阶段。并且随着年龄的增长你会发现你越来越没有了竞争力,比你年轻、有活力、...
            0 0 1669
            分享
          • 近些年,随着对于客户体验、管理水平、业务发展要求的提升,业务越来越复杂,迭代周期越来越快,如何做好提高功能测试质量?是很多技术负责人或者测试人员面对的问题。下面针对自己经验,分享一下功能测试精髓。一、功能测试面临的问题1、测试关联度复杂IT系统规模越来越大、集中度高、架构复杂、耦合度增强,使得业务和技术复杂度越来越高,测试设计和测试实施难度大,IT系统质量保障压力持续加大。2、测试周期越来越短业务需求提出到 IT 实现的周期越来越短,预留给测试的时间越来越短。面对复杂系统测试,如何压缩测试周期,提升测试效率,对测试部门管理能力和实施效率要求越来越高。3、测试组织与协同难测试规模越来越大、关联性...
            0 0 5276
            分享
          •   前言  软件测试行业3年多经验,学历大专+自考本科,主要测试方向web,PC端,wap站,小程序公众号都测试过,app也测过一些,C端B端都有,除功能外,接口性能也有涉猎,但是不能算精通,脚本也能写一些,但是工作中用不到(基本工具开发的脚本已经够工作中使用),不知道是互联网行业今年如此艰难,还是我自己真的太菜了?坐标区域,北京,这是我的一位朋友目前遇到的状况!接下来我们就帮他分析分析他可能存在的问题?有那些方面可以优化的,甚至学习补强的,我们一一细说!  海投简历迟迟没有得到公司邀约面试?可能存在的问题  企业一般看3点: 学历 能力 履历  学历不行的情况下把自身技术提升起来。 技术硬了...
            0 0 1502
            分享
          •   Google的人工智能聊天机器人巴德(Bard)在经历了乏善可陈的发布之后,已经逐渐变得越来越有用。现在,该机器人的 YouTube 整合功能得到了方便的升级,这样它就可以分析单个视频,为观众提供特定的信息--比如关键点或食谱成分--而无需按下播放键。这可能是一个非常有用的工具,但也可能让创作者更加担心人工智能的生成影响了他们的观众观看时长。  尽管早在 9 月份推出 YouTube 扩展功能时,Bard 就已经具备了分析 YouTube 视频的能力,但现在聊天机器人可以为你具体解答与视频内容相关的问题。  公司在 Bard 的更新页面上写道:"我们正在为 Bard 理解 You...
            0 0 506
            分享
      • 51testing软件测试圈微信