使用多个遗留数据库测试django应用程序

klh5stk1  于 2023-02-14  发布在  Go
关注(0)|答案(2)|浏览(122)

我的Django应用程序有5个遗留数据库,几乎所有的模型都设置了 meta属性managed=False,由于设置了managed=False,每个模型的迁移都用选项managed=False创建,因此,Django测试运行器选择每个模型的现有迁移在test_databases中创建测试表。它只是不创建任何东西。我尝试创建test.py设置文件与以下变通办法:

from web_services.settings.dev import *
from django.test.runner import DiscoverRunner

class UnManagedModelTestRunner(DiscoverRunner):

    def setup_test_environment(self, *args, **kwargs):
        from django.apps import apps
        self.unmanaged_models = [m for m in apps.get_models() if not m._meta.managed]
        for m in self.unmanaged_models:
            m._meta.managed = True
        super(UnManagedModelTestRunner, self).setup_test_environment(*args, **kwargs)

    def teardown_test_environment(self, *args, **kwargs):
        super(UnManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs)
        # reset unmanaged models
        for m in self.unmanaged_models:
            m._meta.managed = False

TEST_RUNNER = 'web_services.settings.test.UnManagedModelTestRunner'

但是,它没有帮助,因为无论如何-现有的迁移已经创建了managed=False选项。测试似乎只有在我的模型managed=False注解,删除旧的迁移,创建新的(没有managed=False选项)。
对于这一点,我感到非常困惑--在我的情况下(多个遗留数据库),编写测试的实际好实践是什么?处理调整迁移的麻烦似乎是错误的。

zzlelutf

zzlelutf1#

以下是我目前解决问题的方法。
使用managed=False选项创建的迁移如下所示:

# migrations/0001_initial.py
migrations.CreateModel(
            name='MyModel',
            fields=[
                ('field_id', models.IntegerField(primary_key=True, serialize=False)),
                ('slug', models.CharField(max_length=20, unique=True)),
                ('name', models.CharField(max_length=64)),
            ],
            options={
                'db_table': 'MyModel',
                'managed': False,
            },
        ),

需要注解掉'managed': False才能应用迁移。为了不干扰实际的迁移,我创建了文件夹test_migrations,并将我的迁移复制到其中,其中'managed': False被注解掉:

# test_migrations/0001_initial.py
migrations.CreateModel(
            name='MyModel',
            fields=[
                ('field_id', models.IntegerField(primary_key=True, serialize=False)),
                ('slug', models.CharField(max_length=20, unique=True)),
                ('name', models.CharField(max_length=64)),
            ],
            options={
                'db_table': 'MyModel',
                # 'managed': False,
            },
        ),

然后我们需要在测试运行期间引用这些迁移。为此,我创建了设置文件test.py,并在其中放置了必要的引用。如下所示:

from web_services.settings.dev import *

MIGRATION_MODULES = {
    'myapp': 'web_services.apps.myapp.test_migrations',
}

在运行测试时,您需要参考这些设置:
python manage.py test --settings=web_services.settings.test

xriantvc

xriantvc2#

在研究和阅读了许多关于如何测试遗留只读数据库的文档后,如果你只想在同一个遗留数据库中执行测试而不创建一个副本,最好的和简单的解决方案是在数据库的TEST配置中将同一个遗留数据库设置为MIRROR。

相关问题