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 测试数据库未与自定义测试运行程序一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Django 的内置身份验证与自定义表单(html 模板)一起使用
如何将django-haystack搜索方面与自定义属性一起使用?