Django 单元测试只读数据库

13 投票
2 回答
2237 浏览
提问于 2025-04-18 08:42

我一定是漏掉了什么明显的东西。

我在使用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的开发版本才能使用这个功能;最终这个功能会出现在稳定版本中。需要注意的是,按照我的理解,这个设置会影响所有数据库,而不仅仅是你的只读数据库。

撰写回答