Django测试数据库未与自定义测试运行器

时间:2016-02-07 18:25:11

标签: python django postgresql unit-testing

我正在使用Django 1.9并编写了一个自定义测试运行器。我无法弄清楚为什么我的生产数据库被用来代替我的test_数据库。我已经阅读了很多Django文档无济于事。我的生产数据库的名称是zippymeals,所以我的测试数据库应该是test_zippymeals。但是我的测试似乎是针对zippymeals数据库运行的,而不是test_zippymeals。这是我的自定义测试运行器的代码:

class TestRunner(DiscoverRunner):

def __init__(self, pattern=None, top_level=None, verbosity=1, interactive=True, failfast=False, **kwargs):
    super(TestRunner, self).__init__(pattern, top_level, verbosity, interactive, failfast, **kwargs)

def setup_databases(self, **kwargs):
    bash_cmd = "createdb -T zippymeals_template test_zippymeals"
    process = subprocess.Popen(bash_cmd.split(), stdout=subprocess.PIPE)
    process.communicate()[0]

def teardown_databases(self, old_config, **kwargs):
    bash_cmd = "dropdb test_zippymeals"
    process = subprocess.Popen(bash_cmd.split(), stdout=subprocess.PIPE)
    process.communicate()[0]

我在settings.py文件中设置了以下内容:

TEST_RUNNER = 'tests.test_runner.TestRunner'

我正在使用PostgreSQL,因此我的自定义测试运行器使用zippymeals_template数据库(这是我的数据库的空结构)来创建一个空的test_zippymeals数据库。 test_zippymeals数据库被创建得很好,它在我运行测试时没有被使用。此外,我尝试过以下操作,但没有运气:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'zippymeals',
        'TEST': {
            'NAME': 'test_zippymeals'
        }
    }
}

有谁知道如何从DiscoverRunner继承并确保正在使用test_数据库?

1 个答案:

答案 0 :(得分:2)

您需要为setup_databases调用超类方法,这是负责为测试数据库设置正确别名的方法。 E.g。

def setup_databases(self, **kwargs):
    db = super(TestRunner, self).setup_database(**kwargs)
    .... # your code goes here
    return db

以下是在postgres数据库上运行测试的setup_database方法的更通用版本:

class CustomTestRunner(DiscoverRunner):

    def setup_databases(self, **kwargs):
        # your code goes here
        bash_cmd = "createdb -T zippymeals_template test_zippymeals"
        process = subprocess.Popen(bash_cmd.split(), stdout=subprocess.PIPE)
        process.communicate()[0]

        # force Django to connect to the correct db for tests
        connection = db.connections['default']
        db_conf = connection.settings_dict
        db_conf['NAME'] = db_conf['TEST']['NAME']
        connection.connect()