Django单元测试只读测试数据库。

13

我可能在这里忽略了一些显而易见的事情。 我正在使用django 1.5.x,并基于django的TestCase类创建单元测试。 我已经在settings中定义了一堆数据库,因为我想从许多不同的源中获取(只读)数据。运行测试时,我只想创建默认数据库的测试版本,其余数据库应被标记为只读,并且不尝试创建test_db_name(用户定义的数据库名无法(也不会)具有创建这些数据库的权限)。

毫无疑问,这是可能的 - 正如我所说,我可能忽略了一些显而易见的事情?

非常感谢您的帮助。

马修

2个回答

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的开发版本才能访问此功能;最终,这将包含在稳定版本中。我理解的缺点是,它适用于所有数据库,而不仅仅是只读数据库。


2
谢谢,但我觉得我们有所误解了?我的问题不是想要控制任何测试数据库的名称,而是根本不想创建测试数据库,除了默认的那个。因此,我希望我的测试使用设置中列出的只读 DB,而不是启动一个空白副本,因为它提供了我在测试中需要的记录。 - Mathew
@Mathew,你可能能够完成大部分工作,看一下更改。 - Josh
3
对于我们中的许多人来说,问题在于一些次要的数据库对整个主机是只读的。指定不同的数据库名称也没有帮助。 - shacker

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”,那么这个解决方案对您来说应该已经足够好了。
当然,如果您想要实际测试与远程数据库的连接以及存储在其中的数据,那么这不是正确的方法。

2
这种技术确实可以防止创建“test_other”,但会导致使用存储在“other”中的数据的视图测试失败(因为它从整个应用程序中被有效地删除了)。 - shacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接