• 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博客专家


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


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 当今软件开发中,接口测试已成为必不可少的一环。该如何选择接口测试工具?选择合适的接口测试工具对于程序员来说非常重要,因为这可以帮助他们更快、更高效地评估接口的质量和可靠性。为了提高测试效率和测试质量,自动化接口测试已经逐渐普及。然而,由于市场上有许多不同的接口测试工具,程序员们很难选择合适的工具。如何选择适合自己的工具呢?选择接口测试工具的考虑因素首先,得知道在选择接口测试工具时应该考虑哪些重要因素:一、易用性易用性是选择接口测试工具时首要考虑的因素。工具必须具有清晰的界面,能够让程序员快速、方便地操作。同时,工具也应该具有详细的帮助文档,方便程序员使用。功能性功能性是选择接口测试工具时第二重...
            0 0 880
            分享
          •   从昨晚开始,华为连续 5 天开启新品介绍会直播,是否包含 P70 搅动着市场的情绪。  此前有消息称,华为 P70 系列或将效仿 2023 年的华为 Mate60 系列推出“先锋计划”,不再开发布会而直接开售。  多家北京华为门店向新浪科技表示,华为 P70 系列是否会推出“先锋计划”,以及具体何时发布,目前还没接到通知。但华为 P70 系列已经可以开始盲订,暂时还不需要定金,用户可以选择提前登记信息,具体配置和颜色出来后会进行通知。  此前,华为 Mate60 系列的推出,直接改变了国内手机行业的市场格局,华为终端业务也在 2023 年重回增长,结束了连续两年的收入下滑态势。  而此次的...
            0 0 749
            分享
          • 源自于一本讲性能测试书的思考?书中内容:性能测试是一门富有挑战的、有深度的、综合性的学科。那我想怎能只局限于说性能测试,我倒认为所有的测试类型都是一门富有挑战、有深度的、综合性的学科,只要你想做到顶尖都没有那么容易,而我们正在做的的UI自动化测试也是如此。很多性能测试初学者总觉得性能测试就是写个脚本,弄几台机器测一测,出个报告就行了。通常关注"并发多少""响应时间多少""能跑通吗"这些问题。认为并发越大,响应时间越快,那性能一定就越好。性能测试不仅仅是录制脚本或编写程序,基本的性能理论、性能执行的原则还是要了解的。同样的脚本,不同的人...
            0 0 1031
            分享
          •   爱达荷国家实验室(INL)证实,在他们遭受了网络攻击后,"SiegedSec"黑客将窃取的人力资源数据泄露到网上。INL 是美国能源部管理的一个核研究中心,拥有原子能、综合能源和国家安全方面的 5700 名专家。  INL 建筑群占地 890 平方英里(2,310 平方公里),拥有 50 座实验性核反应堆,其中包括历史上第一座能够生产可用电力的反应堆和第一座为核潜艇设计的发电厂。  目前,INL 正在进行下一代核电站、轻水反应堆、控制系统网络安全、先进车辆测试、生物能源、机器人、核废料处理等方面的研究。  本周一,SiegedSec 宣布已获得 INL 数据,包括&qu...
            0 0 966
            分享
          •   前言  无论做什么自动化,测试报告一定要有的,它可以清楚的展示出来我们执行用例的情况。便于查看自动化测试结果内容。安静这边了解目前通过python生成的测试报告分别有:HTMLTestRunner、BeautifulReport 、 pytest-html 和Allure,这几种报告内容都是属于不同的模板,本篇文章主要介绍下这如何生成以上四份报告的过程以及对比情况。  HTMLTestRunner  HTMLTestRunner是Python标准库的unittest模块的扩展。它生成易于使用的HTML测试报告。使用时需要下载,然后放到项目目录中  下载地址:http://tungwaiyi...
            12 12 1841
            分享
      • 51testing软件测试圈微信