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接口进行测试

十python_unittest

加载夹具时 django unittest 出错

Django 2021年最新版教程34python unittest 单元测试 覆盖率检测

python django的单元测试

《unittest》为什么需要单元测试?