当前位置: 首页 > news >正文

性能测试工具locust —— Python脚本参数化!

1.1.登录用户参数化  

在测试过程中,经常会涉及到需要用不同的用户登录操作,可以采用队列的方式,对登录的用户进行参数化。如果数据要保证不重复,则取完不再放回;如可以重复,则取出后再返回队列。

def login(self):              try:                  user = self.user.userqueue.get_nowait()         # 取不到数据时直接崩溃,走异常处理流程              except queue.Empty:                  print("没有数据了")                  exit(0)              url = '*****'              headers = {                  'Content-Type': 'application/x-www-form-urlencoded'              }              body = {                  'username': user['username'],                  'password': '******'              }              with self.client.post(url, data=body, headers=headers, name='登录', catch_response=True,) as response:                  self.user.userqueue.put_nowait(user)     #数据放回队列                  try:                      res = json.loads(response.text)                      if response.status_code == 200 and str(res) == user['userid']:                          response.success()                          return user['userid']                      else:                          response.failure("登录失败")                  except Exception as e:                      response.failure(e)         class WebUser(HttpUser):              tasks = [MyTask]              wait_time = between(0.1, 0.3)              host = 'http://*******'              userdata = xlrd.open_workbook(r'F:\pycharmproject\locusttest\i8.xls')              table = userdata.sheet_by_name('Sheet2')  # 表格中不同table页的名称              # 获取表格总行数              nrows = table.nrows              # 实例化队列,依次从表格中按行取出数据,放进队列              userqueue = queue.Queue()              for n in range(1, nrows):                  row_data = table.row_values(n)                  data = {                      'username': '%s' % row_data[0],                      'userid': '%s' % row_data[1]                  }                  userqueue.put_nowait(data)        

1.2.使用登录后返回的数据最为后续task的参数  

由于on_start 只执行一次,不会去执行函数里面的返回;因此将登录定义为一个函数,再通过on_start调用,保证只执行一次,同时能够获取到登录后返回的数据。

def on_start(self):              self.userid = self.login()                   def login(self):              """              登录接口              :return: 登录成功后返回userid,用于其他任务的参数              """              try:                  user = self.user.userqueue.get_nowait()         # 取不到数据时直接崩溃,走异常处理流程              except queue.Empty:                  print("没有数据了")                  exit(0)              url = '******'              headers = {                  'Content-Type': 'application/x-www-form-urlencoded'              }              body = {                  'username': user['username'],                  'password': '*****'              }              with self.client.post(url, data=body, headers=headers, name='登录', catch_response=True,) as response:                  self.user.userqueue.put_nowait(user)                  try:                      res = json.loads(response.text)                      if response.status_code == 200 and str(res) == user['userid']:                          response.success()                          return user['userid']                      else:                          response.failure("登录失败")                  except Exception as e:                      response.failure(e)                    @task(3)          def addbyi8(self):              url = '*********'              body = {                         'userid': self.userid              }              headers = {                  'Content-Type': 'application/x-www-form-urlencoded'              }              with self.client.post(url, data=body, headers=headers, catch_response=True,) as res:                  try:                      resjson = json.loads(res.text)                      if res.status_code == 200 and resjson == 1:                          res.success()                      else:                          res.failure('添加接口出错%s' % resjson)                  except Exception as e:                      res.failure(e) 

1.3.Post参数的value含有json和随机数  

采用random生成随机数,拼接到参数value中;json可以先定义json,然后再转换为字符串的形式,传入post参数。 

task(1)          def changeallbyi8(self):              random_number = random.randint(1, 1000)              url = '********'              contents = {                          "******": "locust发送的" + str(random_number),                  "******": "locust图纸的分析" + str(random_number)              }              body = {                       'contents': json.dumps(contents)                  }              with self.client.post(url, data=body,  catch_response=True) as res:                  try:                      resjson = json.loads(res.text)                      if res.status_code == 200 and resjson == 1:                          res.success()                      else:                          res.failure('保存接口出错')                  except Exception as e:                      res.failure(e)

1.4.Post参数中含有键值对随机取值配对  

Typedict字典中创建预设的键值对,使用random.choice从字典的键列表中随机选择一个键,然后使用这个键从字典中取得对应的值,并将其作为请求参数发送。

@task(3)          def addbyi8(self):              typedict = {                  'key1': 'value1',                  'key2': 'value2'    }              type = random.choice(list(typedict.keys()))              url = '****'              body = {                  'type': type,                  'operate': typedict[type]              }              headers = {                  'Content-Type': 'application/x-www-form-urlencoded'    }              with self.client.post(url, data=body, headers=headers,  catch_response=True,) as res:                  try:                      resjson = json.loads(res.text)                      if res.status_code == 200 and resjson == 1:                          res.success()                      else:                          res.failure('添加接口出错')                  except Exception as e:                      res.failure(e)

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

相关文章:

性能测试工具locust —— Python脚本参数化!

1.1.登录用户参数化 在测试过程中,经常会涉及到需要用不同的用户登录操作,可以采用队列的方式,对登录的用户进行参数化。如果数据要保证不重复,则取完不再放回;如可以重复,则取出后再返回队列。 def lo…...

Java中的拦截器、过滤器及监听器

过滤器(Filter)监听器(Listener)拦截器(Interceptor)关注点web请求系统级别参数、对象Action(部分web请求)如何实现函数回调事件Java反射机制(动态代理)应用场…...

Nginx 和 Lua 设计黑白名单

使用 Nginx 和 Lua 设计黑白名单机制,借助 Redis 存储 在现代网络应用中,安全性是一个不可忽视的关键因素。应用程序需要能够有效地管理访问权限,以保护其资源不被恶意用户攻击。黑白名单机制是实现访问控制的一种有效方式。本文将详细介绍如…...

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis? ‌Redis,英文全称是Remote Dictionary Server(远程字典服务),Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统,支持网络、可基于内存亦可持久化。‌ 它提…...

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…...

【text2sql】ReFSQL检索生成框架

论文标题为《ReFSQL: A Retrieval-Augmentation Framework for Text-to-SQL Generation》,发表在 EMNLP 2023 上。ReFSQL框架通过结构增强检索器来获取与当前问题语义和模式结构相似的样本,然后通过对比学习机制来引导模型学习到这些样本的特定知识&…...

美国市场跨平台应用程序本地化流程的特点

为美国市场本地化移动应用程序是为了创造一种自然、直观、与多元化和精通技术的受众文化相关的体验。美国是世界上最大、最具竞争力的应用程序市场之一,用户期望高质量的性能以及在个人层面引起共鸣的内容。这个市场的本地化需要对美国语言、文化和行为有细致入微的…...

STM32 实现 TCP 服务器与多个设备通信

目录 一、引言 二、硬件准备 三、软件准备 四、LWIP 协议栈的配置与初始化 五、创建 TCP 服务器 1.创建 TCP 控制块 2.绑定端口 3. 进入监听状态 4.设置接收回调函数 六、处理多个客户端连接 七、数据处理与通信管理 八、错误处理与资源管理 九、总结 一、引…...

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…...

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】,3.4k stars - WiFi 网络分析工具二、【penpot】,33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】,6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…...

力扣21~30题

21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…...

AGI|如何构建一个RAG应用?入门新手攻略!

目录 一、概述 二、过程概述 三、如何优化提问? 四、路由和高级查询 五、丰富索引结构 六、重排序上下文 七、总结 一、概述 Retrieval Augmented Generation RAG 检索增强的内容生成。 从字面上来看检索只是一种手段途径,在人工智能领域中存在多种…...

【.NET 8 实战--孢子记账--从单体到微服务】--角色(增加/删除/修改/查询)

本节我们将开始编写角色相关的接口 一、需求 本节的要做的需求如下: 编号需求标题需求内容1增加角色角色名称不能重复2删除角色角色逻辑删除3修改角色修改的名称不能和已有名称重复4查询角色不分页查询,根据角色名模糊匹配 二、Role类和Role表 这一…...

数据结构-栈与队列笔记

普通的双端队列 用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; import java.util.ArrayDeque; import java.util.Deque;class MyQueue {// 使用双端队列&#xff08;Deque&#xff09;来实现一个队列Deque<Integer> input; // 用于存放新加…...

DevExpress WPF中文教程:如何解决数据更新的常见问题?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 目录 一、xml配置文件二、注解定义bean1、使用AnnotationCon…...

JavaScript网页设计案例:构建动态交互的在线图书管理系统

JavaScript网页设计案例&#xff1a;构建动态交互的在线图书管理系统 在当今的数字化时代&#xff0c;网页设计不仅仅是关于美观和布局&#xff0c;更重要的是用户体验和互动性。JavaScript&#xff0c;作为一种强大的编程语言&#xff0c;在网页开发中扮演着至关重要的角色&a…...

嵌入式数据结构中线性表的具体实现

大家好,今天主要给大家分享一下,如何使用数据结构中的线性表以及具体的实现。 第一:线性表的定义和表示方法 线性表的定义 – 线性表就是零个或多个相同数据元素的有限序列。 • 线性表的表示方法 – 线性表记为: L=(a0,∙∙∙∙∙∙∙∙ai-1aiai+1 ∙∙∙∙∙∙an-1) •…...

Redis高级篇 —— 分布式缓存

Redis高级篇 —— 分布式缓存 文章目录 Redis高级篇 —— 分布式缓存1 Redis持久化1.1 RDB1.2 RDB的fork原理1.3 RDB总结1.4 AOF持久化1.5 RDB和AOF的对比 2 Redis主从2.1 搭建主从架构2.2 数据同步原理2.2.1 全量同步2.2.2 增量同步 3 Redis哨兵3.1 哨兵的作用和原理3.1.1 哨兵…...

彩族相机内存卡恢复多种攻略:告别数据丢失

在数字时代&#xff0c;相机内存卡作为我们存储珍贵照片和视频的重要媒介&#xff0c;其数据安全性显得尤为重要。然而&#xff0c;意外删除、错误格式化、存储卡损坏等情况时有发生&#xff0c;导致数据丢失&#xff0c;给用户带来不小的困扰。本文将详细介绍彩族相机内存卡数…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...