Django unittest 只读测试数据库
Posted
技术标签:
【中文标题】Django unittest 只读测试数据库【英文标题】:Django unittest read-only test databases 【发布时间】:2014-07-26 05:08:54 【问题描述】:我必须在这里错过显而易见的事情。 我正在使用 django 1.5.x 并正在创建基于 djangos TestCase 类的单元测试。 当我从很多不同的来源中提取(只读)时,我在设置中定义了一堆数据库。运行测试时,我只想创建我的默认数据库的测试版本,其余的我想标记为只读而不尝试重新创建为 test_db_name(用户定义不会(不能)拥有创建这些的权限dbs 反正)。
这当然是可能的——正如我所说的,我一定错过了显而易见的事情?
感谢任何帮助。
马修
【问题讨论】:
【参考方案1】:不明显,不。 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
--keepdb
命令离开数据库完好无损,而不是让 Django 尝试在运行之间删除它。截至 2014 年 6 月,您必须升级到 Django 的开发版本才能访问它;最终这将在稳定版本中。这样做的缺点是,据我了解,它适用于所有数据库,而不仅仅是您的只读数据库。
【讨论】:
谢谢,但我认为我们已经越线了?!我的问题不是我想控制创建的任何测试数据库的名称,而是我根本不想创建测试数据库,默认情况除外。因此,我希望我的测试不使用空白副本,而是使用测试设置中列出的数据库,因为它是只读的,并提供了我在测试中需要的记录。 @Mathew,您可能能够顺利到达那里,看看变化 对于我们中的许多人来说,整个主机对于这些辅助数据库中的一些是只读的。指定不同的数据库名称没有帮助。【参考方案2】:我遇到了同样的问题并设法解决了这个问题:
settings.py
DATABASES =
'default': ...,
'other': ...
DATABASE_ROUTERS = ['routers.MyRouter']
...
TESTING = 'test' in sys.argv
if TESTING:
DATABASE_ROUTERS = []
DATABASES.pop('other')
如果您不使用硬编码的数据库路由,例如 'using' 并且只使用'DATABASE_ROUTERS',那么这个解决方案对你来说应该足够好了。
当然,如果您想实际测试与远程数据库的连接以及存储在那里的数据,那么这不是要走的路。
【讨论】:
此技术确实会阻止创建“test_other”,但会导致使用“其他”中的数据的视图的测试失败(因为它实际上已从整个应用程序中消失)。以上是关于Django unittest 只读测试数据库的主要内容,如果未能解决你的问题,请参考以下文章
Django 2021年最新版教程35python+request+unittest 对Django接口进行测试