Django 测试挂起 --keepdb 标志

Django testing hangs with --keepdb flag

出于性能调整的原因,我想 运行 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

通过添加 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