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
异常。