抛砖引玉:Redis 与 接口自动化测试框架的结合
接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库,具备快速读写、多种数据结构等特点,为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis,并将其应用于接口自动化测试框架中,以提升测试效率和数据管理能力。
Redis 基本操作
(1)Redis的安装和配置
在开始之前,首先需要安装Redis并进行相应的配置,
redis官网:Redis
redis中文网:Redis中文网
安装完成后,确保Redis服务已成功启动,并正确配置了连接信息(如主机地址、端口号、密码等),这块信息就不过多介绍了哟!
(2)Redis与接口自动化测试框架的集成
使用Python操作Redis需要导入相应的客户端库,例如:
pip install redis
import redis
(3)初始化Redis连接
在接口自动化测试框架的初始化过程中,可以添加连接Redis的代码,确保测试过程中能够与Redis建立连接。
class TestFramework:def __init__(self):self.redis = redis.Redis(host='localhost', port=6379, password='your_password')
操作 Redis 常用命令
(4)字符串操作
# 设置键为"key1"的字符串值为"Hello, Redis!"
r.set('key1', 'Hello, Redis!')# 获取键为"key1"的字符串值
value = r.get('key1')
print(value) # 输出: b'Hello, Redis!'
(5)列表操作
# 向名为"list1"的列表左侧插入元素
r.lpush('list1', 'item1')
r.lpush('list1', 'item2')
r.lpush('list1', 'item3')# 获取名为"list1"的列表所有元素
items = r.lrange('list1', 0, -1)
print(items) # 输出: [b'item3', b'item2', b'item1']
(6)哈希表操作
# 设置名为"hash1"的哈希表字段和值
r.hset('hash1', 'field1', 'value1')
r.hset('hash1', 'field2', 'value2')# 获取名为"hash1"的哈希表字段和值
value1 = r.hget('hash1', 'field1')
value2 = r.hget('hash1', 'field2')
print(value1, value2) # 输出: b'value1' b'value2'
(7)集合操作
# 向名为"set1"的集合添加元素
r.sadd('set1', 'item1')
r.sadd('set1', 'item2')
r.sadd('set1', 'item3')# 获取名为"set1"的集合所有元素
items = r.smembers('set1')
print(items) # 输出: {b'item1', b'item2', b'item3'}
以上就是 redis 的常见操作,是不是比写 `sql` 语句简单,是不是 `so easy!!`
Redis 在接口自动化中的应用
封装Redis操作方法
为了方便接口自动化测试框架使用,又要开始封装了,简单封装代码如下:
class RedisClient:def __init__(self):self.redis = redis.Redis(host='localhost', port=6379, password='your_password')def set_data(self, key, value, expire_time=None):self.redis.set(key, value)if expire_time is not None:self.redis.expire(key, expire_time)def get_data(self, key):return self.redis.get(key)def delete_data(self, key):self.redis.delete(key)def hash_set_field(self, key, field, value):self.redis.hset(key, field, value)def hash_get_field(self, key, field):return self.redis.hget(key, field)def hash_delete_field(self, key, field):self.redis.hdel(key, field)
接口自动化中比较常用的是字符串了,为了满足更多场景的需求,我们价格哈希数据结构的封装操作方法。
接口自动化测试中的常见应用场景
(1)测试数据管理
接口自动化测试中,将测试数据存储在Redis中,如用户信息、配置参数等。通过使用封装的Redis操作方法,可以方便地进行数据的增、删、改、查。
redis_client= RedisClient()
redis_client.set_data('user:1', '{"name": "kira", "age": 18}')
user = redis_client.get_data('user:1')
print(user.decode()) # 输出:{"name": "kira", "age": 18}
(2)处理接口依赖数据
一般步骤如下:
- 先明确接口的依赖关系: 谁调用谁之前要先调用谁或者谁
- 设置数据到redis:也就是接口B执行成功后,将关键数据存redis,可以使用我们封装的set,健一般是一个标识符,值就是接口的返回值
- 从redis获取数据:比如接口A执行前,先获取B数据存Redis,然后调用redis获取数据给A或者B、C 等等。
上代码:
redis_client = RedisClient()
# 第一个接口,设置依赖数据
def first_api():response = requests.get('https://api.example.com/first')data = response.json()redis_client.set_data('key', data['value'])
def second_api():# 获取依赖数据dependency_data = redis_client.get_data('key')response = requests.post('https://api.example.com/second', data={'data': dependency_data})result = response.json()# 处理接口响应结果
if __name__ == '__main__':first_api()second_api()
(3)缓存管理
遇到需要频繁访问的接口,怎么半?
为了减少接口调用的开销和提高测试效率,可以使用Redis作为缓存工具,将接口的响应结果缓存起来,以便后续的测试用例重复使用。
redis_client= RedisClient()
def get_user_info(user_id):cache_key = f'user:{user_id}'user_info = redis_client.get_data(cache_key)if not user_info:# 调用接口获取用户信息user_info = api.get_user_info(user_id)redis_client.set_data(cache_key, user_info, expire_time=3600)return user_info
咱们首先检查Redis缓存中是否已存在对应的用户信息,如果不存在,则调用接口获取用户信息并将其存储到Redis缓存中,以备后续使用。同时,通过设置expire_time参数,可以为缓存数据设置过期时间,避免过期数据的使用。
(4)并发测试
在自动化测试中,针对并发场景的测试很重要,我们可以并发模拟一些实际场景,比如:利用redis的原子性和分布式锁,为每个用户创建一个唯一的标识,存到redis中,这样不同用户请求就可以通过检查和比对redis的结果来模拟并发访问了,例如:
# 创建 Redis 客户端
redis_client = RedisClient()def get_user_info(user_id):cache_key = f'user:{user_id}'user_info = redis_client.get_data(cache_key)if not user_info:# 调用接口获取用户信息response = requests.get(f'http://127.0.0.1:5000/?user_id={user_id}')if response.status_code == 200:user_info = response.textprint(user_info)redis_client.set_data(cache_key, user_info, expire_time=3600)else:print(f"Failed to retrieve user info for user_id: {user_id}. Status code: {response.status_code}")return user_info# 并发测试函数
def run_concurrent_test(user_ids):with concurrent.futures.ThreadPoolExecutor() as executor:# 提交任务到线程池future_to_user_id = {executor.submit(get_user_info, user_id): user_id for user_id in user_ids}# 处理返回结果for future in concurrent.futures.as_completed(future_to_user_id):user_id = future_to_user_id[future]try:user_info = future.result()print(f"user_id: {user_id}; user_info: {user_info}")except Exception as e:print(f"Error occurred for user_id: {user_id}, Error: {str(e)}")if __name__ == '__main__':u_ids = [i for i in range(10, 99)]run_concurrent_test(u_ids)
我们创建线程池,使用submit 将任务(get_user_info)提交到线程池,每个任务一个 user_id,这里简单打印每个用户id,对于的信息,通过并发执行多任务,可以同一时间内获取多个用户信息,提高测试效率。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取
相关文章:
抛砖引玉:Redis 与 接口自动化测试框架的结合
接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库,具备快速读写、多种数据结构等特点,为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis,并将其应用于接口自动化测试框架…...
网站如何才能不被黑,如何做好网络安全
当企业网站受到攻击时,首页文件可能被篡改,百度快照也可能被劫持并重定向到其他网站。首要任务是加强网站的安全防护。然而,许多企业缺乏建立完善的网站安全防护体系的知识。因此,需要专业的网站安全公司来提供相应的保护措施。今…...
人脸写真FaceChain风格写真的试玩(二)
接着上一篇【人脸写真FaceChain的简单部署记录(一)】来试玩一下。 1 无限风格写真 参考:让你拥有专属且万能的AI摄影师AI修图师——FaceChain迎来最大版本更新 1.1 人物形象训练 这里的步骤比较简单,就是选择照片,然…...
PHP 变量
变量 变量的声明、使用、释放 变量定义 形式 $ 变量名;严格区分大小写 $name; $Name; $NAME //三个变量不是同一个变量字母、数字、下划线组成,不能以数字开头,不能包含其他字符(空白字符、特殊字符) 驼峰式命名法、下划线式命名法 $first_name; $fi…...
牛客小白月赛79
给定一个数字n,你可以对它进行接下来的操作—— 选择数字中任意一个数位删除 例如对1024选择操作百位,数字则变成了124;对1024选择操作千位,数字则变成了024 我们称一个数字是干净的,当且仅当数字满足以下任意一种…...
面试算法31:最近最少使用缓存
题目 请设计实现一个最近最少使用(Least Recently Used,LRU)缓存,要求如下两个操作的时间复杂度都是O(1)。 get(key):如果缓存中存在键key,则返回它对应的值…...
如何处理前端SEO(搜索引擎优化)?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
Leetcode—2529.正整数和负整数的最大计数【简单】
2023每日刷题(四) Leetcode—2529.正整数和负整数的最大计数 遍历法实现代码 int maximumCount(int* nums, int numsSize){int i;int neg 0, pos 0;for(i 0; i < numsSize; i) {if(nums[i] < 0) {neg;}if(nums[i] > 0) {pos;}}return (neg…...
数据结构-- 并查集
0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…...
优维产品最佳实践第12期:IT资源管理首页丰富
背 景 当我们进入平台后,默认跳转至IT资源管理首页,因此该页面的优化与丰富将极大的提高平台使用者的体验和效率。优化后的首页可以更好地展示常用模型、小产品、外部系统、以及保存的所有关系查询和快速查询条件,使用户能够更快捷、方便…...
【Nginx34】Nginx学习:安全链接、范围分片以及请求分流模块
Nginx学习:安全链接、范围分片以及请求分流模块 又迎来新的模块了,今天的内容不多,但我们都进行了详细的测试,所以可能看起来会多一点哦。这三个模块之前也从来都没用过,但是通过学习之后发现,貌似还都挺有…...
PO模式在selenium自动化测试框架的优势
大家都知道po模式可以提高代码的可读性和减少了代码的重复,但是相对的缺点还有,今天通过本文一起学习下PO模式在selenium自动化测试框架的优势,需要的朋友可以参考下 PO模式简介 1.什么是PO模式 PO模型是:Page Object Model的简写 页面对象…...
Java操作Elasticsearch(新增数据)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
Android中级——MVVM
MVVM MVVM是什么?MVVM实现前提ModelViewModelView MVVM是什么? Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode:封装数据存储及相关操作逻辑,与MV…...
AIGC:引领人工智能和游戏产业融合的里程碑
目录 引言: 一、AIGC简介 二、AIGC的意义和作用 三、AIGC的未来展望 四、AIGC的影响和成果 五、结论 引言: 人工智能技术的快速发展在过去几年中引起了全球范围内的广泛关注和热议。其中,AIGC(Artificial Intelligence and G…...
ubuntu安装rust教程
参考【Rust】Linux上安装Rust开发环境 sudo apt-get install curl# 注意,不开代理很可能下不到,一直报403 export RUSTUP_DIST_SERVERhttps://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOThttps://mirrors.ustc.edu.cn/rust-static/rustu…...
iOS UIWebView与WKWebView 那些事
一、前言介绍 UIWebView 是 iOS 2 中推出的网页容器,UIWebView是最占内存的控件;直到 iOS 8 以后,苹果推出了 WebKit 框架,其中 WKWebView 正式被推出来接替 UIWebView 的位置;iOS 12 中,苹果正式弃用 UIWebView,要求开发者用 WKWebView 全面替换 UIWebView,apple 官方…...
wps/word 之 word中的两个表格 如何合并成为一个表格(已解决)
第一步:新建两个表格: 如何实现上面的两个表格合并呢? 分别选定每个表格,然后鼠标右键---》表格属性 在表格属性中的 表格---》选择 无文字环绕。 第二个表格按照同样的方法 设置 无文字环绕。 然后将中的文本行删去即可以了。选…...
02HTML功能元素
1.功能元素 1.1.列表标签 列表标签的作用: 给一堆数据添加列表语义, 也就是告诉搜索引擎告诉浏览器这一堆数据是一个整体 - HTML中列表标签的分类 无序列表(最多)(unordered list) 有序列表(最少)(ordered list) 定义列表(其次)(definition list) 1.1.1.无序列…...
并发编程-延时队列DelayQueue
数据结构学习网站: Data Structure Visualization 思维导图 DelayQueue (延时队列) DelayQueue 是一个支持延时获取元素的阻塞队列 , 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed 接口&#x…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
