使用unitest对redis连接做一个简单的单元测试

1.定义了一个名为RedisDb的类,用于简化与Redis数据库的交互操作。代码如下:

import redis
from config.setting import REDIS_HOST, REDIS_PORT, REDIS_PASSWD, EXPIRE_TIME

class RedisDb():

    def __init__(self, host, port, passwd):
        try:
        # 建立数据库连接
            self.r = redis.Redis(
                host=host,
                port=port,
                password=passwd,
                decode_responses=True # get() 得到字符串类型的数据
            )
        except redis.ConnectionError as e :
            print(f"Connection error : {e}")
            raise

    def handle_redis_token(self, key, value=None):
        if value: # 如果value非空,那么就设置key和value,EXPIRE_TIME为过期时间
            self.r.set(key, value, ex=EXPIRE_TIME)
        else: # 如果value为空,那么直接通过key从redis中取值
            redis_token = self.r.get(key)
            return redis_token


redis_db = RedisDb(REDIS_HOST, REDIS_PORT, REDIS_PASSWD)

2.那么如何测试redis是否能正常工作呢?

RedisDb类中有两个方法,一个是初始化连接,一个是设置键值

针对此进行简单的单元测试

完整代码如下:

from datetime import time

import redis
from config.setting import REDIS_HOST, REDIS_PORT, REDIS_PASSWD, EXPIRE_TIME
import unittest

import logging
#logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler()  # 控制台输出
    ]
)
# 添加一个FileHandler来记录所有级别的日志
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logging.getLogger().addHandler(file_handler)




class RedisDb():

    def __init__(self, host, port, passwd):
        try:
        # 建立数据库连接
            self.r = redis.Redis(
                host=host,
                port=port,
                password=passwd,
                decode_responses=True # get() 得到字符串类型的数据
            )
        except redis.ConnectionError as e :
            print(f"Connection error : {e}")
            raise

    def handle_redis_token(self, key, value=None):
        if value: # 如果value非空,那么就设置key和value,EXPIRE_TIME为过期时间
            self.r.set(key, value, ex=EXPIRE_TIME)
        else: # 如果value为空,那么直接通过key从redis中取值
            redis_token = self.r.get(key)
            return redis_token


redis_db = RedisDb(REDIS_HOST, REDIS_PORT, REDIS_PASSWD)



# 假定的常量
EXPIRE_TIME = 60  # 示例过期时间为60秒

class TestRedisDb(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # 这里使用真实的或者测试环境的Redis配置
        cls.REDIS_HOST = REDIS_HOST  # Redis服务器地址
        cls.REDIS_PORT = REDIS_PORT      # Redis服务器端口
        cls.REDIS_PASSWD = REDIS_PASSWD        # Redis密码,如果没有设置则留空
        cls.redis_db = RedisDb(cls.REDIS_HOST, cls.REDIS_PORT, cls.REDIS_PASSWD)

    @classmethod
    def tearDownClass(cls):
        # 清理环境,例如删除测试中创建的键值对
        pass

    def test_redis_connection(self):
        # 测试Redis连接是否成功
        logging.info(f"Redis connection: {self.redis_db.r}")
        self.assertIsNotNone(self.redis_db.r, "Redis connection should not be None")

    def test_handle_redis_token_set(self):
        # 测试设置键值对
        test_key = "test_key"
        test_value = "test_value"
        self.redis_db.handle_redis_token(test_key, test_value)
        actual_value = self.redis_db.r.get(test_key)
        logging.info(f"Actual value for key '{test_key}': {actual_value}")
        self.assertEqual(actual_value, test_value, f"Value for key '{test_key}' should match after setting.")

    def test_handle_redis_token_get(self):
        # 测试获取键值
        test_key = "test_key_get"
        test_value = "test_value_get"
        self.redis_db.r.set(test_key, test_value, ex=EXPIRE_TIME)  # 直接使用redis.Redis对象设置值,绕过handle_redis_token
        retrieved_value = self.redis_db.handle_redis_token(test_key)
        logging.info(f"Retrieved value for key '{test_key}': {retrieved_value}")
        self.assertEqual(retrieved_value, test_value, f"Retrieved value for key '{test_key}' should match.")


if __name__ == '__main__':
    # 创建一个测试套件
    suite = unittest.TestSuite()
    # 添加测试用例到套件中
    suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestRedisDb))    # 创建一个测试运行器

    runner = unittest.TextTestRunner()
    # 运行测试套件
    runner.run(suite)

TestRedisDb类
该类继承自unittest.TestCase,用于测试RedisDb类的功能。


setUpClass()方法
该方法为类级别的设置方法,用于在所有测试用例执行前进行环境准备。在这里,使用真实的或测试环境的Redis配置创建RedisDb对象。


tearDownClass()方法
该方法为类级别的清理方法,用于在所有测试用例执行后进行环境清理。在这里,没有进行任何操作。


test_redis_connection()方法
该方法用于测试Redis连接是否成功。通过调用redis_db.r获取Redis连接对象,并使用断言语句确保连接对象不为None。


test_handle_redis_token_set()方法
该方法用于测试设置键值对。首先设置一个测试用的键值对,然后通过调用handle_redis_token()方法设置键值对,并使用断言语句确保设置后的值与预期值相等。


test_handle_redis_token_get()方法
该方法用于测试获取键值。首先设置一个测试用的键值对,然后通过调用handle_redis_token()方法获取键值,并使用断言语句确保获取的值与预期值相等。


main
主程序用于执行测试。首先创建一个测试套件,将TestRedisDb类中的测试用例添加到套件中,然后创建一个测试运行器并运行测试套件。

中间加入logging记录日志

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值