抛砖引玉: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,对于的信息,通过并发执行多任务,可以同一时间内获取多个用户信息,提高测试效率。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt实现一个电子相册

一、要实现的功能 在窗口中可以显示图片,并且能够通过两个按钮进行图片的前进和后退的顺序切换。有一个按钮,通过这个按钮可以从所存图片资源中随机选取一个图片进行展示通过按钮可以控制图片自动轮播顺序切换的开始与停止,显示当前系统的时…

使用 LF Edge eKuiper 将物联网流处理数据写入 Databend

作者:韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac LF Edge eKuiper LF Edge eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源软件,可以运行在各类资源受限的边缘设备上。eKuiper 的主要目标是在边缘端提供一个流媒体软件…

大模型必备算力:CPUGPU天梯图(2023年最新版)

在当今计算机世界,CPU、GPU和显卡的性能成为了衡量计算机性能的重要指标。今天深入了解CPU、GPU和显卡天梯图。 首先,CPU作为计算机的大脑,负责处理各种任务。它的性能主要由核心数、主频和缓存大小决定。其中,核心数和主频决定了…

kubeadm初始化搭建cri-dockerd记录 containerd.io

07.尚硅谷_搭建K8s集群(kubeadm方式)-部署master节点_哔哩哔哩_bilibili 视频里的版本只有1.17而现在(2023.10.20)kubernetes最新版本是1.28,需要搭载cri-dockerd, 先去网站下载了对应的rpm包cri-dockerd…

计算机网络篇之TCP滑动窗口

文章目录 前言概述 前言 在网络数据传输时,若传输的原始数据包比较大,会将数据包分解成多个数据包进行发送。需要对数据包确认后,才能发送下一个数据包。在等待确认包的这个过程浪费了大量的时间,不过还好TCP引入了滑动窗口的概念…

2022最新版-李宏毅机器学习深度学习课程-P26 Recurrent Neural Network

RNN 应用场景:填满信息 把每个单词表示成一个向量的方法:独热向量 还有其他方法,比如:Word hashing 单词哈希 输入:单词输出:该单词属于哪一类的概率分布 由于输入是文字序列,这就产生了一个问…

【算法|动态规划No.27】leetcode516. 最长回文子序列

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

快速自动化处理JavaScript渲染页面的方法

目录 一、使用无头浏览器 二、使用JavaScript渲染引擎 三、使用前端框架工具 随着互联网技术的不断发展,JavaScript已经成为Web开发中不可或缺的一部分。然而,在自动化处理JavaScript渲染页面方面,却常常让开发者感到头疼。本文将介绍一些快…

02 开闭原则

官方定义: 开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修 改是封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保 软件系统开发和维护过程的可靠性。 通俗解释: 对扩展开放…

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …

运营商大数据精准营销,击碎你的固化营销思维

大数据精准营销服务是大数据应用的典型场景之一,也是依托大数据和互联网提升企业效率的一种有效手段。但是,在选择大数据服务的很多时候,企业往往要考虑法律与合规的问题,其中比较重要的是数据获取渠道与数据是否脱敏。在所有大数…

Labview2023安装教程 (最新最详细保姆级教程)

目录 一 .简介 二.安装步骤 软件:Labview版本:2023语言:简体中文大小:2.73G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.6GHz 内存8G(或更高)下载通道①百度网盘丨下载链接: htt…

英语——分享篇——每日200词——2401-2600

2401——moisture——[mɔɪstʃə(r)]——n.潮气,湿气,水分——moisture——moist潮湿的(熟词)ur你的(编码your)e鹅(编码)——潮湿的地方你的鹅一身潮气——Moisture in the atmosphere condensed into dew during the night.——大气中的水分在夜间凝结…

微信小程序设计之主体文件app-json-pages

一、新建一个项目 首先,下载微信小程序开发工具,具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后,注册小程序账号,具体注册方法,可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

【论文解读】Prefix-Tuning: Optimizing Continuous Prompts for Generation

一.介绍 1.1 前置知识 1.1.1 in-context learning At the limit, GPT-3 (Brown et al, 2020) can be deployed using in-context learning, which is a form of prompting, without modifying any LM parameters. "部署" 指的是将 GPT-3 模型用于实际应用或特定任务…

遗传算法求解旅行商问题(含python源代码)

目录 前言 编码初始化种群 计算适应度 选择 交叉 变异 完整代码 总结 前言 这次的算法有一点不能确定是否正确,希望有大佬能够批评指正。 遗传算法的一般步骤 编码初始化种群 种群(population)指同一时间生活在一定自然区域内&…

C++ 继承

前言 本文将会为你带来关于继承的相关知识(概念、定义、基类的成员变量访问形式、隐藏、父子类之间的赋值、派生类的默认成员函数、菱形继承与虚继承) 继承的概念以及定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&…

ANR系列之八:疑难ANR问题处理记录

前言: 本文仅是记录作者自身处理过的ANR问题,以及帮助他人解决过的ANR问题。本文中所介绍的ANR处理记录仅供参考,并不适用所有场景。并且最终结论和分析并不一定就是绝对正确的。 案例1.页面切换时前台应用焦点未获得 案例编号:…

无代码的未来

随着无代码技术越来越成熟,很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台,并梳理了无代码行业今后可能的发展方向。原文: The future of NoCode 所有无代码编辑器都需要回答的问题 当需要选择无代码解决方案时&#xff0…

Vue基础语法核心指令过滤器计算属性监听属性

目录 1. 模板语法 1.1 插值 1.1.1 文本 1.1.2 html 1.1.3 属性 1.1.4 表达式 1.2 指令 1.2.1 核心指令 1.2.1.1 v-if |v-else-if|v-else 1.2.1.2 v-show 1.2.1.3 v-for 1.2.1.4 v-on|v-model|v-for 1.2.1.5 参数 v-bind:href,v-on:click 1.2.1.6 简写 2. 过滤器…