测试django应用程序与几个遗留数据库 [英] Testing django application with several legacy databases

查看:140
本文介绍了测试django应用程序与几个遗留数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有django应用程序与5个遗留数据库。几乎所有的模型都设置了元属性 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 apps in apps.get_models()if not m._meta.managed]
在self.unmanaged_models中的m
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)
#重新设置非管理模型
for m in self.unmanaged_models :
m._meta.managed = False

TEST_RUNNER ='web_services.settings.test.UnManagedMo delTestRunner'

并运行 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' 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 = $)
('name',models.CharField(max_length = 64)),
],
options = {
'db_table':'MyModel',
#'managed':False,
},
),

然后我们需要在测试运行期间引用这些迁移。为此,我创建了设置文件 test.py ,并提供必要的参考。像这样:

 来自web_services.settings.dev import * 


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

当运行测试时,您需要参考该设置:



python manage.py test --settings = web_services.settings.test


I have django application with 5 legacy databases. Almost all models are set with the meta attribute managed=False. Since managed=False is set, migrations for each model have been created with the option managed=False. And since, django test runner picks existing migrations for each model to create test tables in test_databases, it simply doesn't create anything. I tried creating test.py settings file with the following workarounds:

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'

and running python manage.py test --settings=web_services.settings.test. However, it didn't help, since anyway - existing migrations had been already created with managed=False option. Tests seem to be working only after I comment out in my models managed=False, deleted old migrations, created new ones (without managed=False option).

With this, I am quite lost - what is actually a good practice to write tests in my case (multiple legacy databases)? It seems wrong to deal with that hassle of adjusting migrations.

解决方案

Here is how I solved my problem for now.

Migrations that are created with managed=False option look like this:

# 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,
            },
        ),

One needs to comment out 'managed': False to allow migrations to be applied. In order not to mess with actual migrations, I have created folder test_migrations and copied there my migrations with 'managed': False commented out:

# 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,
            },
        ),

Then we need to refer to these migrations during test run. To do that, I have created settings file test.py and put there necessary references. Like this:

from web_services.settings.dev import *


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

And when running tests, you need to refer to that settings:

python manage.py test --settings=web_services.settings.test

这篇关于测试django应用程序与几个遗留数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆