codecamp

Django4.0 进阶测试主题-测试与多数据库

测试主/副配置

如果你使用主/副本(某些数据库称为主/从)复制来测试多数据库配置,那么这种创建测试数据库的策略会带来问题。当创建测试数据库时,不会有任何复制,因此,在主服务器上创建的数据在副本上看不到。
为了弥补这一点,Django 允许你定义一个数据库是 测试镜像。考虑以下(简化的)数据库配置示例:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'HOST': 'dbprimary',
         # ... plus some other settings
    },
    'replica': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'HOST': 'dbreplica',
        'TEST': {
            'MIRROR': 'default',
        },
        # ... plus some other settings
    }
}

在这个设置中,我们有两个数据库服务器。​dbprimary​,用数据库别名 ​default ​描述,​dbreplica ​用别名 ​replica ​描述。正如你所期望的那样,​dbreplica ​被数据库管理员配置为 ​dbprimary ​的读副本,因此在正常活动中,对 ​default ​的任何写入都会出现在 ​replica ​上。
如果 Django 创建了两个独立的测试数据库,就会破坏任何期望复制发生的测试。然而,​replica ​数据库已经被配置为测试镜像(使用 ​MIRROR ​测试设置),表明在测试中,​replica​ 应该被当作 ​default ​的镜像。
在配置测试环境时,​replica ​的测试版本将不会被创建。相反,与​replica​的连接将被重定向为指向 ​default​。因此,对 ​default ​的写入将出现在 ​replica ​上——但这是因为它们实际上是同一个数据库,而不是因为两个数据库之间有数据复制。

控制测试数据库的创建顺序

默认情况下,Django 会假设所有的数据库都依赖于 ​default ​数据库,因此总是先创建 ​default ​数据库。但是,我们不保证测试配置中其他数据库的创建顺序。
如果你的数据库配置需要特定的创建顺序,你可以使用 ​DEPENDENCIES ​测试设置指定存在的依赖关系。考虑以下(简化的)数据库配置示例:

DATABASES = {
    'default': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds'],
        },
    },
    'diamonds': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': [],
        },
    },
    'clubs': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds'],
        },
    },
    'spades': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds', 'hearts'],
        },
    },
    'hearts': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds', 'clubs'],
        },
    }
}

在这种配置下,将首先创建 ​diamonds ​数据库,因为它是唯一没有依赖性的数据库。接下来将创建 ​default ​和 ​clubs ​数据库(尽管这两个数据库的创建顺序没有保证),然后是 ​hearts​,最后是 ​spades​。
如果在 ​DEPENDENCIES ​定义中存在任何循环依赖关系,将引发 ​ImproperlyConfigured ​异常。


Django4.0 进阶测试主题-测试与多主机名
Django4.0 进阶测试主题-TransactionTestCase 高级特性
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }