Django 单元测试只读数据库
我一定是漏掉了什么明显的东西。
我在使用django 1.5.x,并且正在创建单元测试,基于django的TestCase类。
我在设置中定义了一堆数据库,因为我需要从很多不同的来源读取(只读)。在运行测试时,我只想创建一个默认数据库的测试版本,其他的我希望标记为只读,不想尝试重新创建这些数据库(用户定义的数据库没有权限创建这些数据库)。
这肯定是可能的——我觉得我一定是漏掉了什么明显的东西?
非常感谢任何帮助。
马修
2 个回答
1
我也遇到过同样的问题,最后是这样解决的:
settings.py
DATABASES = {
'default': {...},
'other': {...}
}
DATABASE_ROUTERS = ['routers.MyRouter']
...
TESTING = 'test' in sys.argv
if TESTING:
DATABASE_ROUTERS = []
DATABASES.pop('other')
如果你没有使用硬编码的数据库路由,比如通过'using'来选择数据库,而只是使用了'DATABASE_ROUTERS',那么这个解决方案应该对你来说足够了。
当然,如果你想真正测试一下与远程数据库的连接以及里面存储的数据,那这个方法就不太合适了。
3
这并不是很明显。有点文档说明,你可以在测试时设置要使用的数据库名称:
在settings.py文件中
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.spatialite',
'NAME': 'db.sqlite3',
'TEST_NAME': '/tmp/test.sqlite3',
},
}
如果你想要不去创建(或者重建)测试数据库,你需要把数据库名称复制到TEST_NAME中并且使用新的python manage.py test
--keepdb
命令,这样就可以保持数据库不变,而不是让Django在每次运行之间尝试删除它。自2014年6月起,你必须升级到Django的开发版本才能使用这个功能;最终这个功能会出现在稳定版本中。需要注意的是,按照我的理解,这个设置会影响所有数据库,而不仅仅是你的只读数据库。