Django 测试数据库未与自定义测试运行程序一起使用

Posted

技术标签:

【中文标题】Django 测试数据库未与自定义测试运行程序一起使用【英文标题】:Django test database not being used with custom test runner 【发布时间】: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_ 数据库?

【问题讨论】:

【参考方案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 的示例实现更新了答案。 太棒了,谢谢,我会深入研究一下,看看能不能让它工作。

以上是关于Django 测试数据库未与自定义测试运行程序一起使用的主要内容,如果未能解决你的问题,请参考以下文章

初始化期间程序未与 Array 一起运行

如何将 Django 的内置身份验证与自定义表单(html 模板)一起使用

Django 酥脆的表单可以与自定义小部件一起使用吗?

如何将django-haystack搜索方面与自定义属性一起使用?

VSTest.Console.exe的测试运行结果未与测试计划关联

jwt 令牌授权无法与自定义角色一起正常工作