【问题标题】:Django testing hangs with --keepdb flagDjango 测试挂起 --keepdb 标志
【发布时间】:2020-09-01 00:39:58
【问题描述】:

出于性能调整的原因,我想针对我的生产数据库副本运行 Django 测试。据我了解,这应该可以通过:

(1) 调整 Django 设置,如

DATABASES = {
    'default': {
        ...
        'TEST': {
            'NAME': 'my_database_copy',
        },
    }
}

和 (2) 使用--keepdb 标志,如python manage.py test --keepdb。[1]

但是当我这样做时,进程挂起,看起来像这样:

bash-4.2$ python manage.py test --keepdb
Using existing test database for alias 'default'...

(进程不会以ctrl+c 关闭。我正在使用 Docker,我通过重新启动 Docker 来停止它。)

数据库没有未应用的迁移,如果省略 --keepdb,测试命令 (python manage.py test) 工作正常。

我确认数据库副本已正确恢复并可访问,因为我可以在运行 python manage.py shell 时访问它。

[1]https://docs.djangoproject.com/en/3.1/topics/testing/overview/#preserving-the-test-database

【问题讨论】:

  • 如果不使用--keepdb,测试数据库会被删除吗?
  • @Ben 如果我省略了--keepdb 标志,那么测试进程会识别出database “my_database_copy” already exists,并询问进程是否应该删除它。如果我输入“否”,则测试过程存在(自然)。如果我输入“是”,则测试成功运行。如果我然后运行python manage.py shell,我可以确认数据库已被删除,django.db.utils.OperationalError: FATAL: database “my_database_copy” does not exist
  • 有趣,在调试模式下运行会告诉你什么吗docs.djangoproject.com/en/3.1/ref/django-admin/…python manage.py test --keepdb --debug-mode
  • @Ben 感谢您的帮助。我相信我能够通过更改 SERIALIZE 设置来解决问题。请参阅我发布的答案。

标签: python django django-testing django-tests


【解决方案1】:

通过添加SERIALIZE 键来调整设置字典,如下所示:

DATABASES = {
    'default': {
        ...
        'TEST': {
            'NAME': 'my_database_copy',
            'SERIALIZE': False,
        },
    }
}

SERIALIZETrue(默认值)时,Django 尝试将整个数据库的副本作为字符串读入内存。见[1]。当数据库引擎不支持事务时,这对测试很有帮助,但在我的情况下,由于内存不足而崩溃。此处介绍了通过设置停用此行为[2]。

[1]https://github.com/django/django/blob/d5b526bf78a9e5d9760e0c0f7647622bf47782fe/django/db/backends/base/creation.py#L73

[2]https://docs.djangoproject.com/en/3.1/ref/settings/#serialize

【讨论】:

    最近更新 更多