Django4 中文入门教程 Django4.0 进阶测试主题-测试与多数据库

2024-02-25 开发教程 Django4 中文入门教程 匿名 7

测试主/副配置

如果你使用主/副本(某些数据库称为主/从)复制来测试多数据库配置,那么这种创建测试数据库的策略会带来问题。当创建测试数据库时,不会有任何复制,因此,在主服务器上创建的数据在副本上看不到。
为了弥补这一点,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 ​异常。