【问题标题】:Django testing mirror database not receiving dataDjango测试镜像数据库没有收到数据
【发布时间】:2013-09-25 22:12:42
【问题描述】:

我正在尝试对我的 Django 应用程序进行一些测试。我在整个应用程序中使用数据库镜像进行一些读取。当我尝试测试这些部分时,通过在数据库中创建模拟数据然后尝试读取它,看起来好像数据不在镜像数据库中,尽管被配置为TEST_MIRROR

用于测试的数据库配置如下所示:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'maindb',
    'HOST': 'localhost'
  },
  'mirror1': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'maindb',
    'HOST': 'localhost',
    'TEST_MIRROR': 'default'
  }
}

然后在我的测试中我做了这样的事情(Foo 是一个模型)

Foo.objects.create(name='bar')
self.assertTrue(Foo.objects.filter(name='bar').exists()) # passes
self.assertTrue(Foo.objects.using('mirror1').filter(name='bar').exists()) # fails

这让我很困惑,因为我认为TEST_MIRROR 的目的是让对镜像的调用直接传递到默认值?

【问题讨论】:

    标签: python django unit-testing testing


    【解决方案1】:

    如果您的设置包含多个数据库,并且您有一个测试 需要每个数据库,您可以使用 multi_db 属性 请求完全刷新的测试套件。

    例如:

    class TestMyViews(TestCase):
        multi_db = True        # for Django < 3.1 (deprecated since 2.2)
        databases = '__all__'  # for Django >= 2.2
        # databases = {'default', 'other'}  # or explicit databases
    
    
        def testIndexPageView(self):
            call_some_test_code()
    

    该文档 (multi-database support testing) 并不准确,因为条件 multi_db(间接在 _databases_names 中)不仅用于 Django 源代码中的刷新(tearDown),还用于“_fixture_setup”。 (Django-1.5.1/django/test/testcases.py:834) 因此它似乎是一个独立于主/从设置的基本条件。

    【讨论】:

    • 恐怕我认为这不是这种情况下的答案。我们在生产中有类似主/从关系的东西(在 Heroku 上带有“跟随者”数据库),但是在进行本地开发时,我们只需将两者的数据库配置都指向一个数据库。当测试构建环境时,它会为每个现有数据库创建一个_test 副本,但由于它在配置中看到两个,它会尝试创建相同的一个两次。这就是TEST_MIRROR 所做的修复,因为它知道不为镜像创建数据库,但似乎没有通知 ORM 将查询从镜像数据库传递到主数据库。
    【解决方案2】:

    我认为答案可能在于here:

    配置测试环境后,会生成一个测试版本的slave 不会被创建。相反,与从站的连接将被重定向到 指向默认

    由于从机在测试中并不真正存在,所以尝试直接调用它失败是有道理的

    【讨论】:

    • 我读到“相反,与从站的连接将被重定向到默认指向”,因为指向从站的任何内容都会传递给主站,所以看起来它应该工作。也许这只是我读错了的一个案例(而且 IMO 可以在文档中更清楚地写...)
    • 我不是官方消息来源,我明白你的意思,但我的理解是这只发生在测试环境中
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 2020-11-17
    • 2012-03-07
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多