一般线上用的缓存都是memcached/redis,django默认对memecached的支持就很方便,在settings.py中进行配置即可。不过同样的缓存配置却不太方便直接用在单元测试中,在测试中,且在测试环境中并无太大必要使用缓存,因此按照django文档可以将缓存配置成,
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
如此则在测试代码中就不会因为memcached的配置而出错。不过如果要对读写缓存的逻辑进行测试的话,就需要另外处理了。
简述下目前的土方法,定义测试缓存的基类,
from django.core.cache import cache
class BaseCacheTestCase(TestCase):
def setUp(self):
self.cache_dict = {}
def get(key):
result = self.cache_dict.get(key)
return result
def set(key, value, timeout):
self.cache_dict[key] = value
def has_key(key):
return key in self.cache_dict
def delete(key):
if key in self.cache_dict:
del self.cache_dict[key]
self.real_get = cache.get
self.real_set = cache.set
self.real_has_key = cache.has_key
self.real_delete = cache.delete
djcache.get = get
djcache.set = set
djcache.has_key = has_key
djcache.delete = delete
def tearDown(self):
djcache.get = self.real_get
djcache.set = self.real_set
djcache.has_key = self.real_has_key
djcache.delete = self.real_delete
在setUp时替换默认缓存接口函数,在tearDown时恢复。后续单独测试缓存的测试用例均继承BaseCacheTestCase。
django默认提供的DummyCache只是实现了缓存接口,实际并未进行任何操作。因此另外也可以手动实现一份,在跑测试用例的时候指定刚定义的缓存实现。不过这样就需要在每一个测试用例的tearDown中清理缓存中的条目,略显麻烦。