【问题标题】:Django unittest read-only test databasesDjango unittest 只读测试数据库
【发布时间】:2014-07-26 05:08:54
【问题描述】:

我必须在这里错过显而易见的事情。 我正在使用 django 1.5.x 并正在创建基于 djangos TestCase 类的单元测试。 当我从很多不同的来源中提取(只读)时,我在设置中定义了一堆数据库。运行测试时,我只想创建我的默认数据库的测试版本,其余的我想标记为只读而不尝试重新创建为 test_db_name(用户定义不会(不能)拥有创建这些的权限dbs 反正)。

这当然是可能的——正如我所说的,我一定错过了显而易见的事情?

感谢任何帮助。

马修

【问题讨论】:

    标签: python django unit-testing django-1.5


    【解决方案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”,但会导致使用“其他”中的数据的视图的测试失败(因为它实际上已从整个应用程序中消失)。
    猜你喜欢
    • 1970-01-01
    • 2022-07-05
    • 2014-12-07
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多