locust学习教程(9)- event 事件

news2024/12/23 6:53:21

目录

1、对请求的测试前置、后置处理

2、在web界面添加新内容

3、监听测试的失败率或阀值

4、汇总总结

​🎁更多干货


1、对请求的测试前置、后置处理

  请求有一个上下文参数,通过数据有关的请求(之类的用户名,标签等)。它可以通过覆盖 User.context() 方法直接在对请求方法的调用中或在用户级别设置。

class MyUser(HttpUser):
    def context(self):
        return {"username": self.username}

    @task
    def t(self):
        self.username = "foo"
        self.client.post("/login", json={"username": self.username})

    @events.request.add_listener
    def on_request(context, **kwargs):
        print(context["username"])

2、在web界面添加新内容

  Locust 使用 Flask 为 Web UI 提供服务,因此很容易将 Web 端点添加到 Web UI。通过侦听init事件,我们可以检索对 Flask 应用程序实例的引用,并使用它来设置新路由:

from locust import events

@events.init.add_listener
def on_locust_init(environment, **kw):
    @environment.web_ui.app.route("/added_page")
    def my_added_page():
        return "Another page"

访问网址:http://localhost:8089/ added_pa​​ge

3、监听测试的失败率或阀值

from locust import events
from locust.runners import STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP, WorkerRunner

def checker(environment):
    while not environment.runner.state in [STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP]:
        time.sleep(1)
        if environment.runner.stats.total.fail_ratio > 0.2:
            print(f"fail ratio was {environment.runner.stats.total.fail_ratio}, quitting")
            environment.runner.quit()
            return


@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    # only run this on master & standalone
    if not isinstance(environment.runner, WorkerRunner):
        gevent.spawn(checker, environment)

4、汇总总结

import datetime
import json
import logging
import time
import gevent
import requests
from locust import task, HttpUser, between
from locust import events
from locust.runners import MasterRunner
from locust.runners import STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP, WorkerRunner


# 这里主要是 event hooks 的示例,用于各种测试监听,测试前置、后置、每个任务请求后的处理等等。


def timestring():
    """
    解析locustfile,比其他任何事情都要早
    :return:
    """
    now = datetime.datetime.now()
    return datetime.datetime.strftime(now, "%m:%S.%f")[:-5]


global_test_data = requests.post("https://postman-echo.com/post",
                                 data="global_test_data_" + timestring(),).json()["data"]
test_run_specific_data = None


def checker(environment):
    """
    定义了失败率判断的函数,主要用于 @events.init.add_listener 进行监听
    :param environment:
    :return:
    """
    while not environment.runner.state in [STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP]:
        time.sleep(1)
        if environment.runner.stats.total.fail_ratio > 0.2:
            print(f"fail ratio was {environment.runner.stats.total.fail_ratio}, quitting")
            environment.runner.quit()
            return


@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    """
    监控测试的失败率并在超过某个阈值时(0.2)停止运行
    :param environment:
    :param _kwargs:
    :return:
    """
    # only run this on master & standalone
    if not isinstance(environment.runner, WorkerRunner):
        gevent.spawn(checker, environment)


@events.init.add_listener
def on_locust_init(environment, **kw):
    """
    添加web界面,可以直接访问:http://localhost:8089/added_page,用于自定义拓展web界面
    源码有拓展的示例
    """
    @environment.web_ui.app.route("/added_page")
    def my_added_page():
        return "Another page"


@events.init.add_listener
def _(environment, **_kwargs):
    """
    初始化蝗虫,发生在解析蝗虫文件之后但测试开始之前,比如增加额外的web界面
    """
    print("2. Initializing locust, happens after parsing the locustfile but before test start")


@events.quitting.add_listener
def _(environment, **_kwargs):
    print("locust is shutting down")


@events.quitting.add_listener
def _(environment, **kw):
    """
    如果满足以下任何条件,则将退出代码设置为非零:
    超过 1% 的请求失败
    平均响应时间大于 200 ms
    响应时间的第 95 个百分位数大于 800 毫秒
    """
    if environment.stats.total.fail_ratio > 0.01:
        logging.error("Test failed due to failure ratio > 1%")
        environment.process_exit_code = 1
    elif environment.stats.total.avg_response_time > 200:
        logging.error("Test failed due to average response time ratio > 200 ms")
        environment.process_exit_code = 1
    elif environment.stats.total.get_response_time_percentile(0.95) > 800:
        logging.error("Test failed due to 95th percentile response time > 800 ms")
        environment.process_exit_code = 1
    else:
        environment.process_exit_code = 0


@events.test_start.add_listener
def _(environment, **_kwargs):
    """
    在headless运行中仅发生一次,但在web ui运行中可能发生多次
    在分布式运行中,主机通常不需要任何测试数据
    :param environment:
    :param _kwargs:
    :return:
    """
    global test_run_specific_data
    print("3. Starting test run")
    if not isinstance(environment.runner, MasterRunner):
        test_run_specific_data = requests.post(
            "https://postman-echo.com/post",
            data="test-run-specific_" + timestring(),
        ).json()["data"]


@events.test_start.add_listener
def on_test_start(environment, **kwargs):
    """
    在分布式模式下运行 locust 时,在运行测试之前在工作节点上进行一些设置可能会很有用。
    可以通过检查节点的类型来检查以确保您没有在主节点上运行runner
    :param environment:
    :param kwargs:
    :return:
    """
    if not isinstance(environment.runner, MasterRunner):
        print("Beginning test setup")
    else:
        print("Started test from Master node")


@events.test_stop.add_listener
def _(environment, **_kwargs):
    print("stopping test run")


@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):
    """
    监听测试执行,执行结束后,自动清楚数据
    :param environment:
    :param kwargs:
    :return:
    """
    if not isinstance(environment.runner, MasterRunner):
        print("Cleaning up test data")
    else:
        print("Stopped test from Master node")


@events.request.add_listener
def my_request_handler(request_type, name, response_time, response_length, response,
                       context, exception, start_time, url, **kwargs):
    """
    对所有的类添加监听器:每个类的任务执行完成后,定义了输出响应的相关内容,这个可以放到locufile文件里面
    """
    if exception:
        print(f"Request to {name} failed with exception {exception}")
    else:
        print(f"request_type : {request_type}")
        print(f"response_time : {response_time}")
        print(f"response_length : {response_length}")
        print(f"context : {context}")
        print(f"start_time : {start_time}")
        print(f"url : {url}")
        print(f"Successfully made a request to: {name}")
        print(f"The response : {response.text}")


class UserBehavior1(HttpUser):
    """
    登录
    """
    host = "https://yyy.com"
    wait_time = between(2, 5)  # 每个任务执行后等待2-5秒

    @task  # Locust 创建一个 greenlet(微线程),一个微线程可以跑很多协程
    def test_login(self):
        data = json.dumps({
            "user1": "tfjiao",
        })
        self.username = "xxx"
        headers = {"Content-Type": "application/json"}
        r = self.client.post("/api/login", data=data, headers=headers)

    def context(self):
        """
        :return: context 用于请求的监听,自定义输出内容
        """
        return {"username": self.username}

    # request context
    # 给userbehaver1类设置了请求的监听,触发什么时候,执行什么操作,这里执行打印操作
    @events.request.add_listener
    def on_request(context, **kwargs):
        if context:
            print(context["username"])

​🎁更多干货


 完整版文档下载方式:

这些资料,对于从事【软件测试】等相关工作的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享。

在评论区和我互动交流或者私❤我【软件测试学习】领取即可,拿走不谢。


如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞” “✍️评论” “💙收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双路高速 DA 实验

目录 双路高速 DA 实验 1、简介 2、实验任务 3、程序设计 3.1、hs_dual_da顶层模块代码 3.2、ROM 波形存储模块(rom_1024x10b) 创建单端口 ROM IP核 3.2、DA 数据发送模块(da_wave_send)代码 4、硬件设计 4.1、添加.xdc…

MongoDB数据库安装

MongoDB数据库 MongoDB数据的特点: 面相文档存储的分布式数据库 具有很强的扩展性 支持丰富的查询表达式,很接近于关系性数据库 使用类似于json的结构保存数据,可以轻易的查询到文档中内嵌的对象及数组 下载安装包 首先去官网下载安装…

用JAVA写一个下载器第2集

文章目录 一、开发环境及工具二、包名概览三、项目结构四、使用步骤1.编写代码Constant.java:Downloader.javaDownloaderTask.javaDownloadInfoThread.javaFileUtils.javaHttpUtils.javaLogUtils.javaMain.java 2.运行程序 总结 一、开发环境及工具 开发环境及工具…

如果开发说这不是Bug,你会怎么处理?

在项目过程中,如果开发说这个不是Bug,你的第一反应是什么? 不同的人有不同的处理方式,也许是如下几点:相信开发说的,开发说什么就是什么,问题关闭;自己不能决定,啥都上升…

GP232RNL——USB到UART桥接控制器

GP232RNL是一款高度集成的USB到UART桥接控制器,提供了一种简单的解决方案,可以使用最少的元器件和PCB空间,将RS232接口转换为USB接口。GP232RNL包括一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整的调制解调器控制信号的异…

日撸java三百行day69-70

文章目录 说明day69-70 矩阵分界1.基于矩阵分解的推荐系统(Funk-SVD算法)2.随机梯度下降(SGD)2.1 导数2.2 偏导数2.3 方向导数2.4 梯度2.5 随机梯度下降,与损失函数之间的关系 3.代码理解3.1 train() 方法3.2 mae方法&…

神经网络原理(2)

斯坦福大学的印度学生、机器学习爱好者 PararthShah 在2012年12月22日的使用买芒果的例子解释了神经网络,简单来说就是:如果你需要选芒果,但不知道什么样的芒果最好吃,一个简单粗暴的方法是尝遍所有的芒果,然后总结出个…

窗口函数之-前后函数(lag/lead)

窗口函数之-前后函数 应用:求同比增长、环比增长 lead(expression,n):返回当前行的后n行 > shift(-n) 数据超前n阶,与之对齐的就是后n行的数据lag(expression,n):返回当前行的前n行> shift(n)数据滞后n阶,与之对齐的就是前n行的数据 …

人工智能轨道交通行业周刊-第49期(2023.6.12-6.25)

本期关键词:设备智能维修、故障诊断、无人机巡查、车站联锁、LangChain、腾讯大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMe…

高效进行接口测试,简单易懂!

目录 前言 正文 1.Api文档导入 2.后端接口测试 3.mock数据 4.测试集接口自动化 总结 前言 日常测试过程中,常常需要多种工具来接力完成自己的接口测试任务。 比如说, 使用swagger查看接口文档, 使用mock编造接口数据对前端页面做测试…

面对高速PCB设计,你是否也有这些疑问?

在现代电子产品设计中,高速PCB设计是很重要的组成部分,然而由于高速信号的特殊性和复杂性,很多电子工程师在进行高速PCB设计时难免面临各种挑战及问题,那么面对这些挑战及问题,该如何解决? 1、添加测试点是…

管线业务模块实现

文章目录 1 .配电线路轨迹图2 )单线图存储功能3. 设备接线图1 )剖面绘制 电力管线业务模块是系统的电力业务功能,主要维护电气设备的电力连接关系以及电 缆在GIS 地图和工井内部的位置和走向。管线业务模块由配电线路的轨迹图、单线图、接 线…

介绍智能照明系统在绿色建筑中的应用与产品选型

【摘要】:智能照明系统应用在智能建筑中不仅能营造出舒适的生活、工作环境以及现代化的管理方式而且要具有一定的节能效果。给出了智能照明和传统照明系统的比较并分析了智能照明系统的节能。 【关键字】:智能建筑;智能照明;节能…

蓝库云:企业绩效管理对公司成长的重要性,被很多企业主所忽略

什么是绩效管理 绩效管理是一种管理方法,通过衡量和评估员工的工作绩效,来提高企业的效率和效益。它涉及一个系统性的过程,包括设定、评估和反馈员工目标,制定和实施成长计划和发展计划,以及与员工进行持续的沟通和反…

MacOS 中 ARM64 汇编 ldr =address 伪指令导致运行时崩溃的原因及解决

0. 概览 我们知道在 MacOS 的 as 汇编器中有一条 ldr 伪指令,使用它我们可以非常方便的将立即数加载到寄存器中。 不过,当 ldr 的源操作数是一个标签(Label)时,就会导致在运行时发生崩溃: 如上图所示&…

179_自动生成 千万级 Power BI 示例数据

179_自动生成 千万级 Power BI 示例数据 在早一些是时候,我曾写过一个示例数据《赠送300家门店260亿销售额的零售企业Power BI实战示例数据》,本次我们对该示例数据做了一些调整。 一、更新内容 针对有一些朋友不会使用 vba 模块,我们增加了…

RHEL CentOS Debian Ubuntu 如何刷新 DNS 缓存

RHEL CentOS Debian Ubuntu 如何刷新 DNS 缓存 全文:如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接:https://sysin.org/blog/how-to-fl…

【YOLO】目标识别模型的导出和opencv部署

文章目录 0 前期教程1 什么是模型部署2 怎么部署 0 前期教程 【YOLO】朴实无华的yolov5环境配置 【YOLO】yolov5训练自己的数据集 1 什么是模型部署 前期教程当中,介绍了yolov5环境的搭建以及如何利用yolov5进行模型训练和测试,虽然能够实现图片或视频…

语法篇·JSP基础

一、初识JSP 1.1简介 JSP(Java Server Pages),其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签。JSP是一种动态网页技术标准,也是JavaEE的标准。JSP和Servlet一样,是在服务器端执行的。JSP是在Servlet技术发展之后为了让开发者…

苹果公司开发者账号申请流程

目录 一、注册 Apple ID 账号二、Apple Developer 登录三、申请公司邓白氏编码四、下载 Apple Developer app五、审核六、缴费七、发票 一、注册 Apple ID 账号 注册网址:https://appleid.apple.com/account 二、Apple Developer 登录 登录网址:http…