【问题标题】:Django test database not being used with custom test runnerDjango 测试数据库未与自定义测试运行程序一起使用
【发布时间】:2016-05-17 09:18:24
【问题描述】:

我正在使用 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_ 数据库?

【问题讨论】:

    标签: python django postgresql unit-testing


    【解决方案1】:

    您需要为setup_databases 调用超类方法,该方法负责为测试数据库设置正确的别名。例如

    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()
    

    【讨论】:

    • 感谢您的回复和帮助,尽管我不明白这是如何解决问题的。我不想使用默认的测试数据库创建。如果我调用 super.setup_databases(),那么 Django 会尝试为我创建测试数据库,这正是我不希望发生的事情。我想自己创建数据库(没有迁移)。现在,如果我按照您的建议进行操作,测试运行程序将失败并显示未找到表的错误消息,这是应该的。所以我想我真正要问的是,如何让 DiscoverRunner 的子类正确别名(?)或使测试指向 test_zippymeals?
    • 我已经用不依赖 Django 的 super.setup_database 的 CustomTestRunner 的示例实现更新了答案。
    • 太棒了,谢谢,我会深入研究一下,看看能不能让它工作。
    猜你喜欢
    • 2018-11-02
    • 2020-07-02
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2012-05-09
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多