使用多个遗留数据库测试 Django 应用程序
Testing django application with several legacy databases
我有一个带有 5 个遗留数据库的 Django 应用程序。几乎所有模型都设置了 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'
和运行python manage.py test --settings=web_services.settings.test
。但是,它没有帮助,因为无论如何 - 已经使用 managed=False
选项创建了现有的迁移。测试似乎只有在我在我的模型中注释掉 managed=False
、删除旧迁移、创建新迁移(没有 managed=False
选项)后才有效。
有了这个,我很迷茫——在我的情况下(多个遗留数据库)编写测试实际上是一个好的做法?处理调整迁移的麻烦似乎是错误的。
这是我现在解决问题的方法。
使用 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',
}
而运行ning测试时,需要参考那个设置:
python manage.py test --settings=web_services.settings.test
我有一个带有 5 个遗留数据库的 Django 应用程序。几乎所有模型都设置了 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'
和运行python manage.py test --settings=web_services.settings.test
。但是,它没有帮助,因为无论如何 - 已经使用 managed=False
选项创建了现有的迁移。测试似乎只有在我在我的模型中注释掉 managed=False
、删除旧迁移、创建新迁移(没有 managed=False
选项)后才有效。
有了这个,我很迷茫——在我的情况下(多个遗留数据库)编写测试实际上是一个好的做法?处理调整迁移的麻烦似乎是错误的。
这是我现在解决问题的方法。
使用 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',
}
而运行ning测试时,需要参考那个设置:
python manage.py test --settings=web_services.settings.test