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


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

    Redis 基本操作

    (1)Redis的安装和配置
    在开始之前,首先需要安装Redis并进行相应的配置,

    redis官网:Redis
    redis中文网:Redis中文网
    安装完成后,确保Redis服务已成功启动,并正确配置了连接信息(如主机地址、端口号、密码等),这块信息就不过多介绍了哟!

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

    1. pip install redis
    2. import redis

     (3)初始化Redis连接
    接口自动化测试框架的初始化过程中,可以添加连接Redis的代码,确保测试过程中能够与Redis建立连接。

    1. class TestFramework:
    2. def __init__(self):
    3. self.redis = redis.Redis(host='localhost', port=6379, password='your_password')

    操作 Redis 常用命令

    (4)字符串操作

    1. # 设置键为"key1"的字符串值为"Hello, Redis!"
    2. r.set('key1', 'Hello, Redis!')
    3. # 获取键为"key1"的字符串值
    4. value = r.get('key1')
    5. print(value) # 输出: b'Hello, Redis!'

    (5)列表操作

    1. # 向名为"list1"的列表左侧插入元素
    2. r.lpush('list1', 'item1')
    3. r.lpush('list1', 'item2')
    4. r.lpush('list1', 'item3')
    5. # 获取名为"list1"的列表所有元素
    6. items = r.lrange('list1', 0, -1)
    7. print(items) # 输出: [b'item3', b'item2', b'item1']

    (6)哈希表操作

    1. # 设置名为"hash1"的哈希表字段和值
    2. r.hset('hash1', 'field1', 'value1')
    3. r.hset('hash1', 'field2', 'value2')
    4. # 获取名为"hash1"的哈希表字段和值
    5. value1 = r.hget('hash1', 'field1')
    6. value2 = r.hget('hash1', 'field2')
    7. print(value1, value2) # 输出: b'value1' b'value2'

    (7)集合操作

    1. # 向名为"set1"的集合添加元素
    2. r.sadd('set1', 'item1')
    3. r.sadd('set1', 'item2')
    4. r.sadd('set1', 'item3')
    5. # 获取名为"set1"的集合所有元素
    6. items = r.smembers('set1')
    7. print(items) # 输出: {b'item1', b'item2', b'item3'}

    以上就是 redis 的常见操作,是不是比写 `sql` 语句简单,是不是 `so easy!!`

    Redis 在接口自动化中的应用

    封装Redis操作方法

    为了方便接口自动化测试框架使用,又要开始封装了,简单封装代码如下:

    1. class RedisClient:
    2. def __init__(self):
    3. self.redis = redis.Redis(host='localhost', port=6379, password='your_password')
    4. def set_data(self, key, value, expire_time=None):
    5. self.redis.set(key, value)
    6. if expire_time is not None:
    7. self.redis.expire(key, expire_time)
    8. def get_data(self, key):
    9. return self.redis.get(key)
    10. def delete_data(self, key):
    11. self.redis.delete(key)
    12. def hash_set_field(self, key, field, value):
    13. self.redis.hset(key, field, value)
    14. def hash_get_field(self, key, field):
    15. return self.redis.hget(key, field)
    16. def hash_delete_field(self, key, field):
    17. self.redis.hdel(key, field)

     接口自动化中比较常用的是字符串了,为了满足更多场景的需求,我们价格哈希数据结构的封装操作方法。

    接口自动化测试中的常见应用场景

    (1)测试数据管理
    接口自动化测试中,将测试数据存储在Redis中,如用户信息、配置参数等。通过使用封装的Redis操作方法,可以方便地进行数据的增、删、改、查。

    1. redis_client= RedisClient()
    2. redis_client.set_data('user:1', '{"name": "kira", "age": 18}')
    3. user = redis_client.get_data('user:1')
    4. print(user.decode()) # 输出:{"name": "kira", "age": 18}

    (2)处理接口依赖数据

    一般步骤如下:

    • 先明确接口的依赖关系: 谁调用谁之前要先调用谁或者谁
    • 设置数据到redis:也就是接口B执行成功后,将关键数据存redis,可以使用我们封装的set,健一般是一个标识符,值就是接口的返回值
    • 从redis获取数据:比如接口A执行前,先获取B数据存Redis,然后调用redis获取数据给A或者B、C 等等。

    上代码:

    1. redis_client = RedisClient()
    2. # 第一个接口,设置依赖数据
    3. def first_api():
    4. response = requests.get('https://api.example.com/first')
    5. data = response.json()
    6. redis_client.set_data('key', data['value'])
    7. def second_api():
    8. # 获取依赖数据
    9. dependency_data = redis_client.get_data('key')
    10. response = requests.post('https://api.example.com/second', data={'data': dependency_data})
    11. result = response.json()
    12. # 处理接口响应结果
    13. if __name__ == '__main__':
    14. first_api()
    15. second_api()

     

    (3)缓存管理

    遇到需要频繁访问的接口,怎么半?
    为了减少接口调用的开销和提高测试效率,可以使用Redis作为缓存工具,将接口的响应结果缓存起来,以便后续的测试用例重复使用。

    1. redis_client= RedisClient()
    2. def get_user_info(user_id):
    3. cache_key = f'user:{user_id}'
    4. user_info = redis_client.get_data(cache_key)
    5. if not user_info:
    6. # 调用接口获取用户信息
    7. user_info = api.get_user_info(user_id)
    8. redis_client.set_data(cache_key, user_info, expire_time=3600)
    9. return user_info

    咱们首先检查Redis缓存中是否已存在对应的用户信息,如果不存在,则调用接口获取用户信息并将其存储到Redis缓存中,以备后续使用。同时,通过设置expire_time参数,可以为缓存数据设置过期时间,避免过期数据的使用。

    (4)并发测试

    在自动化测试中,针对并发场景的测试很重要,我们可以并发模拟一些实际场景,比如:利用redis的原子性和分布式锁,为每个用户创建一个唯一的标识,存到redis中,这样不同用户请求就可以通过检查和比对redis的结果来模拟并发访问了,例如:

    1. # 创建 Redis 客户端
    2. redis_client = RedisClient()
    3. def get_user_info(user_id):
    4. cache_key = f'user:{user_id}'
    5. user_info = redis_client.get_data(cache_key)
    6. if not user_info:
    7. # 调用接口获取用户信息
    8. response = requests.get(f'http://127.0.0.1:5000/?user_id={user_id}')
    9. if response.status_code == 200:
    10. user_info = response.text
    11. print(user_info)
    12. redis_client.set_data(cache_key, user_info, expire_time=3600)
    13. else:
    14. print(f"Failed to retrieve user info for user_id: {user_id}. Status code: {response.status_code}")
    15. return user_info
    16. # 并发测试函数
    17. def run_concurrent_test(user_ids):
    18. with concurrent.futures.ThreadPoolExecutor() as executor:
    19. # 提交任务到线程池
    20. future_to_user_id = {executor.submit(get_user_info, user_id): user_id for user_id in user_ids}
    21. # 处理返回结果
    22. for future in concurrent.futures.as_completed(future_to_user_id):
    23. user_id = future_to_user_id[future]
    24. try:
    25. user_info = future.result()
    26. print(f"user_id: {user_id}; user_info: {user_info}")
    27. except Exception as e:
    28. print(f"Error occurred for user_id: {user_id}, Error: {str(e)}")
    29. if __name__ == '__main__':
    30. u_ids = [i for i in range(10, 99)]
    31. run_concurrent_test(u_ids)

     我们创建线程池,使用submit 将任务(get_user_info)提交到线程池,每个任务一个 user_id,这里简单打印每个用户id,对于的信息,通过并发执行多任务,可以同一时间内获取多个用户信息,提高测试效率。

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

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

     

  • 相关阅读:
    JMeter笔记14 | JMeter场景设计和设置
    4、FFmpeg命令行操作7
    git 本地分支基础操作
    Spark性能调优之广播变量
    MySQL进阶系列:锁-InnoDB中锁的情况
    virtuoso环形振荡器
    学会 Arthas,让你 3 年经验掌握 5 年功力!
    集群配置步骤_java培训
    iOS_Crash 四:的捕获和防护
    【C++】类的声明 与 类的实现 分开 ② ( 头文件导入多次报错 | 头文件的作用 | 类的声明 | 类的实现 | 代码示例 - 类的使用 )
  • 原文地址:https://blog.csdn.net/chengxuyuznguoke/article/details/133962115