首页 > 数据库 >抛砖引玉:Redis 与 接口自动化测试框架的结合

抛砖引玉:Redis 与 接口自动化测试框架的结合

时间:2023-06-20 17:24:29浏览次数:71  
标签:info Redis redis 抛砖引玉 接口 user key id

接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库,具备快速读写、多种数据结构等特点,为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis,并将其应用于接口自动化测试框架中,以提升测试效率和数据管理能力。

Redis 基本操作

  1. Redis的安装和配置
    在开始之前,首先需要安装Redis并进行相应的配置,
    redis官网:https://redis.io/
    redis中文网:https://www.redis.net.cn/
    安装完成后,确保Redis服务已成功启动,并正确配置了连接信息(如主机地址、端口号、密码等),这块信息就不过多介绍了哟!

  2. Redis与接口自动化测试框架的集成
    使用Python操作Redis需要导入相应的客户端库,例如:

pip install redis
import redis
  1. 初始化Redis连接
    在接口自动化测试框架的初始化过程中,可以添加连接Redis的代码,确保测试过程中能够与Redis建立连接。
class TestFramework:
    def __init__(self):
        self.redis = redis.Redis(host='localhost', port=6379, password='your_password')

操作 Redis 常用命令

  1. 字符串操作
# 设置键为"key1"的字符串值为"Hello, Redis!"
r.set('key1', 'Hello, Redis!')

# 获取键为"key1"的字符串值
value = r.get('key1')
print(value)  # 输出: b'Hello, Redis!'

  1. 列表操作
# 向名为"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']

  1. 哈希表操作
# 设置名为"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'

  1. 集合操作
# 向名为"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 在接口自动化中的应用

  1. 封装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}

  1. 处理接口依赖数据

一般步骤如下:

  1. 先明确接口的依赖关系: 谁调用谁之前要先调用谁或者谁

  2. 设置数据到redis:也就是接口B执行成功后,将关键数据存redis,可以使用我们封装的set,健一般是一个标识符,值就是接口的返回值

  3. 从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()

  1. 缓存管理

遇到需要频繁访问的接口,怎么半?
为了减少接口调用的开销和提高测试效率,可以使用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参数,可以为缓存数据设置过期时间,避免过期数据的使用。

  1. 并发测试

在自动化测试中,针对并发场景的测试很重要,我们可以并发模拟一些实际场景,比如:利用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.text
            print(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,对于的信息,通过并发执行多任务,可以同一时间内获取多个用户信息,提高测试效率。

总结

以上就是勇哥今天为各位小伙伴准备的内容,如果你想了解更多关于Python自动化测试的知识和技巧,欢迎关注我:公众号\博客\CSDN\B站:测试玩家勇哥;我会不定期地分享更多的精彩内容。感谢你的阅读和支持!


题外话,勇哥打算把新建的技术交流群,打造成一个活跃的高质量技术群。工作中遇到的技术问题,都可以在里面咨询大家,还有工作内推的机会。有兴趣的小伙伴,欢迎加我(记得备注是进群还是报名学习)

标签:info,Redis,redis,抛砖引玉,接口,user,key,id
From: https://www.cnblogs.com/Nephalem-262667641/p/17491856.html

相关文章

  • fastadmin 的Http类 请求外部接口携带 Authorization:Bearer token 参数问题
    背景:最近在对接某个系统的支付接口时,接口请求时要求携带token,在请求头header中添加Authorization:Bearer。我使用的框架tp5搭建的fastadmin,里面封装了Http类 出现问题:写法出错,虽然带了参数,但是对方接受不到参数,接口请求验证失败  解决方法:正确的写法代码如下:$info=Ht......
  • redis迁移
    redis的几种数据导入导出方式【转】 环境说明:202.102.221.11redis源实例202.102.221.12redis目标实例202.102.221.13任意linux系统一、redis-dump方式1.安装redis-dump工具[[email protected]~]#yuminstallrubyrubygemsruby-devel-y#更改gem源[root......
  • redis学习十一:数据类型命令及落地运用 (GEO)
    redis之地理空间GEO1.geoaddkeylongitudelatitude名称;zrangekey0-1查看如果出现乱码问题登录时候加上--raw 2.geoposkey名称获取对应经纬度 3.用geohash表示 4.geodist距离多少km/m 5.georadius这个尚硅谷的杨哥写的这个比较详细,直接截图照搬了。 6......
  • MongoDB批量导入Redis优化迭代笔记
    背景统计最近五天所有content信息的正文字节数(正文字段占用较多),然后根据这个大小,推送存在redis要配置多少的内存。统计方法1.在mongodb中查询db.content_.aggregate([{$match:{updatetime:{$gte:1686134400000,//对应日期"2023-06-07T00:00:00Z"的......
  • 产品经理做接口对接要做哪些工作
    随着互联网的发展,各种应用和系统之间的数据交换变得越来越频繁和重要。而在进行数据交换时,接口对接是一个非常关键的环节。作为产品经理,接口对接是必不可少的工作之一,而在进行接口对接时,需要完成以下工作。1.明确需求在进行接口对接前,首先需要明确业务需求。要了解需要对接哪些......
  • 【快应用】nativeAd.onStatusChanged和nativeAd.onDownloadProgress接口正确监听广告
    【关键词】原生广告、下载监听、状态返回【问题背景】快应用接入原生广告后,通过nativeAd.onStatusChanged和nativeAd.onDownloadProgress接口来监听广告下载状态和进度,但是在广告触发下载后,没有回调返回。该如何解决?代码:showNativeAd(){nativeAd=ad.createNativeAd({a......
  • 接口自动化测试项目 | IHRM登录接口自动化测试
    项目内容如下:###需求-地址:http://ihrm-java.itheima.net/#/login-测试接口:-登录接口:针对登录的13个cases###技术-V1:python+unittest+数据驱动方式1+HTMLTestRunner生成测试报告-V2:python+pytest+allure+loguru+pytest方式数据驱动###说明-iHRM接口文档、测试cases见d......
  • 使用docker-compose同时启动MySQL和Redis
    环境查看安装docker和docker-composeapt-yinstalldocker.iodocker-compose设置docker-compose配置文件root@iZ2zebcd9hncu1371fetliZ:/data/docker-compose#pwd/data/docker-composeroot@iZ2zebcd9hncu1371fetliZ:/data/docker-compose#catdocker-compose.ymlvers......
  • 缓存方案之Redis
    Redis简介  Redis是RemoteDictionaryServer(Redis)的缩写,或许光听名字你就能猜出它大概是做什么的。不错,它是一个由SalvatoreSanfilippo编写的key-value存储系统,是一个使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型的Key-Value数据库,并提供多种......
  • 1.redis常见数据类型-字符串String、列表List、集合Set、Hash哈希、Zset有序集合
    背景:这里说的数据类型是value的数据类型,key的类型都是字符串。命令不区分大小写,而key的值是区分大小写的 help@+数据类型会出现命令提示比如help@string,help@list常见命令:keys*查看当前库所有key(匹配:keys*1)existskey判断某个key是否存在typekey查看你的......