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记录日志