Django unittest只读测试数据库

时间:2014-06-05 09:19:37

标签: python django unit-testing django-1.5

我必须在这里忽略明显的。 我正在使用django 1.5.x并正在创建基于djangos TestCase类的单元测试。 我在设置中定义了一堆数据库,因为我从很多不同的源中提取(只读)。在运行测试时,我只想创建我的默认数据库的测试版本,其余的我想要标记为只读而不是尝试重新创建为test_db_name(用户定义的赢得' t(可以' t)具有无论如何都要创建这些dbs的权限。)

当然这是可能的 - 正如我所说,我必须错过显而易见的事情?

感谢任何帮助。

马修

2 个答案:

答案 0 :(得分:2)

不明显,不。 Sort-of documented,您可以设置在测试时使用的数据库名称:

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 {{3命令保持数据库不变,而不是让Django尝试在运行之间删除它。截至2014年6月,您必须升级到Django的开发版才能访问它;最终这将是稳定发布。这方面的缺点是,据我所知,它适用于所有数据库,而不仅仅是您的只读数据库。

答案 1 :(得分:0)

我遇到了同样的问题并设法解决了这个问题:

settings.py

DATABASES = {
    'default': {...},
    'other': {...}
}

DATABASE_ROUTERS = ['routers.MyRouter']

...

TESTING = 'test' in sys.argv

if TESTING:
    DATABASE_ROUTERS = []
    DATABASES.pop('other')    

如果您不使用硬编码数据库路由,例如使用'using' 并且只使用'DATABASE_ROUTERS',那么这个解决方案应该足够好了。

当然,如果您想要实际测试与远程数据库的连接以及存储在那里的数据,那么这就不可能了。