五、Locust之HTTP用户类

news2024/9/23 11:18:41

HttpUser是最常用的用户。它增加了一个客户端属性,用来进行HTTP请求。

from locust import HttpUser, task, between

class MyUser(HttpUser):
    wait_time = between(5, 15)

    @task(4)
    def index(self):
        self.client.get("/")

    @task(1)
    def about(self):
        self.client.get("/about/")

1. 客户端属性/HttpSession

client是一个HttpSession的实例。HttpSession是request.Session的一个子类/封装器,
所以它的功能有很好的文档记录,对很多人来说应该是熟悉的。

HttpSession增加的内容主要是将请求结果报告给Locust(成功/失败,响应时间,响应长度,名称
它包含了所有HTTP方法的方法:get, post, put, …

就像request.Session一样,它在请求之间保留了cookies,所以它可以很容易地用于登录网站。
提出一个POST请求,看一下响应,并隐含地重复使用我们得到的任何会话cookie,用于第二个请求

pythoresponse = self.client.post("/login", {"username":"testuser", "password":"secret"})
print("Response status code:", response.status_code)
print("Response text:", response.text)
response = self.client.get("/my-profile")

HttpSession捕获任何由Session抛出的request.RequestException(由连接错误、超时或类似情况引起),而返回一个status_code设置为0、内容设置为None的假Response对象。

2. 验证响应

如果HTTP响应代码是OK(<400),则认为请求是成功的,但对响应做一些额外的验证往往是有用的。你可以通过使用catch_response参数、with-statement和对response.failure()的调用将一个请求标记为失败。

catch_response: 捕获response 数据,根据 响应数据,对响应的更进一步验证:

with self.client.get("/", catch_response=True) as response:
    if response.text != "Success":
        response.failure("Got wrong response")
    elif response.elapsed.total_seconds() > 0.5:
        response.failure("Request took too long")

你也可以把一个请求标记为成功,即使响应代码是坏的。

with self.client.get("/does_not_exist/", catch_response=True) as response:
    if response.status_code == 404:
        response.success()

你甚至可以通过抛出一个异常,然后在with-block之外捕获它来避免记录一个请求。或者你可以抛出一个locust异常,就像下面的例子,让Locust来捕捉它。

from locust.exception import RescheduleTask
...
with self.client.get("/does_not_exist/", catch_response=True) as response:
    if response.status_code == 404:
        raise RescheduleTask()

3. REST/JSON APIs

FastHttpUser提供了一个现成的休息方法,但你也可以自己做。

from json import JSONDecodeError
...
with self.client.post("/", json={"foo": 42, "bar": None}, catch_response=True) as response:
    try:
        if response.json()["greeting"] != "hello":
            response.failure("Did not get expected value in greeting")
    except JSONDecodeError:
        response.failure("Response could not be decoded as JSON")
    except KeyError:
        response.failure("Response did not contain expected key 'greeting'")

4. 分组请求

对于网站来说,URLs包含某种动态参数的页面是非常常见的。通常情况下,在用户的统计中把这些URL分组是有意义的。这可以通过向HttpSession的不同请求方法传递一个名称参数来实现。

# 这些请求的统计信息将分组为: /blog/?id=[id]
for i in range(10):
    self.client.get("/blog?id=%i" % i, name="/blog?id=[id]")

在某些情况下,将参数传入请求函数是不可能的,例如在与包裹着Request会话的库/SDK交互时。

通过设置client.request_name属性,提供了另一种分组请求的方法。

#这些请求的统计信息将分组为: /blog/?id=[id]
self.client.request_name="/blog?id=[id]"
for i in range(10):
    self.client.get("/blog?id=%i" % i)
self.client.request_name=None

如果你想用最少的模板来连锁多个分组,你可以使用**client.rename_request()**上下文管理器。

@task
def multiple_groupings_example(self):
    # 这些请求的统计信息将分组为: /blog/?id=[id]
    with self.client.rename_request("/blog?id=[id]"):
        for i in range(10):
            self.client.get("/blog?id=%i" % i)

    # 这些请求的统计信息将分组为r: /article/?id=[id]
    with self.client.rename_request("/article?id=[id]"):
        for i in range(10):
            self.client.get("/article?id=%i" % i)

使用catch_response并直接访问request_meta,你甚至可以根据响应中的内容重命名请求

with self.client.get("/", catch_response=True) as resp:
    resp.request_meta["name"] = resp.json()["name"]

5. HTTP 代理设置

为了提高性能,我们通过将 requests.Session 的 trust_env 属性设置为 False
将 requests 配置为不在环境中寻找 HTTP 代理设置。如果你不希望这样,你可以手动设置locust_instance.client.trust_env为True。更多细节,请参考requests.Session的文档。

6. 连接池

由于每个HttpUser都会创建新的HttpSession每个用户实例都有自己的连接池
这类似于真正的用户与网络服务器的交互方式。

然而,如果你想在所有用户之间共享连接,你可以使用一个单一的池管理器。
要做到这一点,将 pool_manager 类属性设置为 urllib3.PoolManager 的一个实例。

from locust import HttpUser
from urllib3 import PoolManager

class MyUser(HttpUser):
    # 所有用户最多只能同时连接10个。
    pool_manager = PoolManager(maxsize=10, block=True)

关于更多的配置选项,请参考 urllib3 文档。


更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449
在这里插入图片描述

更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449

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

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

相关文章

Python标准库 --- json库

目录 一、简介 二、属性 三、数据格式 一、简介 Json&#xff0c;全称JavaScript Object Notation&#xff0c;也就是JavaScript对象标记&#xff0c;通过对象和数组的组合表示数据&#xff0c;虽然构造简洁但是结构化程度非常高&#xff0c;是一种轻量级的数据交换格式。J…

ftp-vsftpd(Centos)

一.关闭selinux跟防火墙 setenforce 0 systemctl stop firewalld 二.安装vsftpd yum install vsftpd -y 三.创建虚拟用户与目录并申请证书 mkdir /webdata 根目录 chmod 777 /webdata/ useradd webadmin 上传的文件映射为webadmin vim user webuser虚拟用户 通过d…

Android---内存泄漏检测核心原理

目录 LeakCanary 核心原理 LeakCanary 检测对象的类型 ReferenceQueue 与 WeakReference LeakCanary 里的监控列表与保留列表 常见内存泄漏案例 1. 单例导致内存泄漏 2. 静态变量导致内存泄漏 3. 非静态内部类导致内存泄漏 4. 未取消注册或回调导致内存泄漏 5. Timer…

paddleocr 实操笔记 (前向后梳理)

要点&#xff1a; 参考&#xff1a; 基于PaddleOCR的数字显示器字符识别 工业仪表数值识别 前言 问题分析 要处理电表中的数据&#xff0c;可以分为步骤&#xff0c;拆解为以下问题&#xff1a; 感兴趣区域定位问题OCR读数问题 针对问题1,经过实验与探索&#xff0c;也找到…

黑马---Redis入门到实战【基础篇】

一、初识Redis 认识NoSql redis是键值数据库&#xff0c;没有表、没有约束&#xff0c;存的都是键值对&#xff0c;称为NoSql数据 NoSQL VS SQL 认识Redis Redis诞生于2009年&#xff0c;全称Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存…

开篇:为什么学习 Go 语言

简介 Go 语言又称 Golang&#xff0c;由 Google 公司于 2009 年发布&#xff0c;近几年伴随着云计算、微服务、分布式的发展而迅速崛起&#xff0c;跻身主流编程语言之列&#xff0c;和 Java 类似&#xff0c;它是一门静态的、强类型的、编译型编程语言&#xff0c;为并发而生…

高等数学笔记(上下)

目录 不定积分定积分微分方程线性微分方程解的结构常系数齐次线性微分方程常系数齐次线性微分方程特解的求法 计算机解法 不定积分 第一类换元积分法&#xff1a;灵感来自于复合函数的求导&#xff0c;利用中间变量替换得到复合函数的积分法&#xff1a;设 f ( u ) f(u) f(u)具…

【Redis7】Redis7 事务管道发布订阅

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 事务、管道和发布订阅。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【Redis7】Redis7 持…

Qt扫盲-QXYSeries理论总结

QXYSeries理论总结 一、概述二、常用函数介绍1. 维护点2. 绘图相关3. 绘制标签 三、信号说明1. Point 增删相关2. Point 鼠标相关3. 图变化相关 一、概述 QXYSeries 类是折线图、曲线图、散点图的基类。这个类其实就是维护的是图线的相关信息&#xff0c;就比如是这个线条的颜…

5、cmake的简单认识及CMakeLists.txt的编写语法

文章目录 1、cmake是什么&#xff08;1&#xff09;cmake的两大功能 2、CMakeLists.txt常用命令&#xff08;即如何编写CMakeLists.txt文件&#xff09;&#xff08;1&#xff09;cmake常见预定义1&#xff09;常见的预定义变量2&#xff09;系统信息预定义变量3&#xff09;开…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号&#xff1a;AI-era Meta的LLaMA模型开源&#xff0c;让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到&#xff0c;一次意外的LLaMA泄漏&#xff0c;竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

Linux系统网络传输之端口详解

Linux系统网络传输之端口详解 1、端口的概念2、安装namp3、查看端口占用情况4、安装net-tools5、查看指定端口占用情况 1、端口的概念 计算机程序之间的通讯&#xff0c;通过IP只能锁定计算机&#xff0c;但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xf…

《花雕学AI》深度测试ChatGPT国内镜像站:超简单提示词的猫娘角色扮演,真的好神奇啊!

偶然看过一篇讲解如何使用ChatGPT调教猫娘的文章&#xff0c;有六个步骤&#xff0c;许许多多的调教提示语&#xff0c;让我感觉这是一件非常复杂与专业的事情。今天有空&#xff0c;于是就想先从简单的开始尝试一下。我使用了最简单的提示词&#xff1a;”ChatGPT角色扮演猫娘…

分布式事务Seata实践入门

1 前言 现在应用基本上都是分布式部署&#xff0c;那么针对分布式事务问题&#xff0c;也有对应的解决方案。经过简单的调研&#xff0c;最后选择了阿里的 Seata 组件&#xff0c;来实现分布式事务。 Seata是2019年1月份&#xff0c;蚂蚁金服和阿里巴巴共同开源的分布式事务解…

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念

&#xff08;TinkSystem SR650&#xff09;安装服务器操作系统&#xff08;Windows Server 2022&#xff09;步骤和相关概念 服务器操作系统安装步骤 记录一下服务器操作系统安装过程&#xff0c;虽然简单但还是有一些坑需要注意&#xff0c;本次使用的是联想服务器ThinkSyst…

VS2019中Ctrl+左键不起作用和控制台不驻留(cmd窗口闪退)

1、关于Ctrl左键不起作用 解决&#xff1a;在线装个插件就行。 工具>>扩展和更新 联机>>VS库>>所搜插件“GO TO Definition” 安装&#xff0c;重启VS即可。 2、关于控制台不驻留 当然这个问题解决方案有很多&#xff0c;这个是首选吧

[Java·算法·中等]LeetCode105. 从前序与中序遍历序列构造二叉树

每天一题&#xff0c;防止痴呆 前言题目示例分析思路1题解1分析思路2题解2 &#x1f449;️ 力扣原文 前言 二叉树前序遍历的顺序为&#xff1a; 先遍历根节点&#xff1b; 随后递归地遍历左子树&#xff1b; 最后递归地遍历右子树。 二叉树中序遍历的顺序为&#xff1a; 先递…

HCIP-6.9BGP路由反射器原理与配置

路由反射器原理与配置 1、路由反射器概念1.1、路由反射器原理&#xff1a;1.2、多集群路由反射器1.3、备份路由反射器2、路由反射器配置3、路由反射器防环机制 1、路由反射器概念 IBGP的水平分割&#xff0c;IBGP 1只能update一跳&#xff0c;就是说在IBGP 2 设备收到IBGP 1设…

【RocketMQ】事务的实现原理

事务的使用 RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中&#xff0c;假如某个场景下需要对数据库的多张表进行操作&#xff0c;为了保证数据的一致性&#xff0c;一般会使用事务&#xff0c;将所有的操作全部提交或者在出错的时候全部回滚。以创建订单…

12-RabbitMQ

一 RabbitMQ概念 1 MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通过第三方转述对…