接口自动化测验已成为保证软件质量和稳定性的重要手法。而Redis作为一个高功能的缓存数据库,具有快速读写、多种数据结构等特点,为接口自动化测验供给了强大的支撑。勇哥这儿大略介绍怎么结合Python操作Redis,并将其应用于接口自动化测验结构中,以进步测验功率和数据办理能力。

Redis 根本操作

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

  2. Redis与接口自动化测验结构的集成
    运用Python操作Redis需求导入相应的客户端库,例如:

pipinstallredis
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站:测验玩家勇哥;我会不定期地分享更多的精彩内容。感谢你的阅览和支撑!


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

勇哥,10年落魄测验老司机,技能栈偏python,现在在一家超大型房产公司担任自动化测验主管,日常工作比较冗杂,主要担任自动化测验,功能测验、软件质量办理及人员办理。工作之余专心于为粉丝进行简历修改、面试教导、模仿面试、资料分享、一对一自动化测验教学教导副业开展。现在已服务十多位小伙伴,取得高薪offer。

往期精选文章:

python-Threading多线程之线程锁
Pytest 快速入门
pytest 前后置操作详谈
接口自动化之测验数据动态生成并替换
requests模块该怎么封装?
最通俗易懂python操作数据库
python正则一篇搞掂
接口自动化怎么封装mysql操作
功能测验之必备常识

功能分析思路

Python + ChatGPT来完成一个智能对话的钉钉机器人
一文看懂python怎么履行cmd命令