我的Django单元测试需要很长时间才能运行,所以我正在寻找加速的方法。我正在考虑安装一个SSD,但我知道这也有它的缺点。当然,我可以用我的代码做一些事情,但我正在寻找一个结构修复。即使运行一次测试也很慢,因为每次都需要重新构建/南迁移数据库。我的想法是..。
既然我知道测试数据库总是很小,为什么我不能简单地将系统配置为始终将整个测试数据库保存在RAM中?永远不要碰磁盘。如何在Django中配置?我更喜欢继续使用MySQL,因为这是我在生产中使用的,但如果SQLite3或其他东西让这件事变得容易,我会走那条路。
SQLite或MySQL是否有完全在内存中运行的选项?应该可以配置一个RAM盘,然后配置测试数据库来存储它的数据,但是我不确定如何告诉Django / MySQL为某个数据库使用不同的数据目录,特别是因为它每次运行都会被擦除和重新创建。(我用的是Mac FWIW。)
发布于 2010-06-23 08:39:27
如果在运行测试时将数据库引擎设置为sqlite3,则返回Django will use a in-memory database。
运行测试时,我在settings.py
中使用如下代码将引擎设置为sqlite:
if 'test' in sys.argv:
DATABASE_ENGINE = 'sqlite3'
或者在Django 1.2中:
if 'test' in sys.argv:
DATABASES['default'] = {'ENGINE': 'sqlite3'}
最后在Django 1.3和1.4中:
if 'test' in sys.argv:
DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
(对于Django 1.3,到后端的完整路径并不是必须的,但可以使设置向前兼容。)
您还可以添加以下行,以防您在南迁移时遇到问题:
SOUTH_TESTS_MIGRATE = False
发布于 2010-06-23 03:22:18
MySQL支持名为"MEMORY“的存储引擎,您可以在数据库配置(settings.py
)中对其进行如下配置:
'USER': 'root', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'OPTIONS': {
"init_command": "SET storage_engine=MEMORY",
}
请注意,内存存储引擎不支持blob / text列,因此如果您使用的是django.db.models.TextField
,这将不适用于您。
发布于 2010-06-23 03:22:58
我不能回答你的主要问题,但你可以做一些事情来加快速度。
首先,确保您的MySQL数据库设置为使用InnoDB。然后,它可以在每次测试之前使用事务回滚数据库的状态,这在我的经验中导致了巨大的加速。您可以在settings.py中传递数据库初始化命令(Django1.2语法):
DATABASES = {
'default': {
'ENGINE':'django.db.backends.mysql',
'HOST':'localhost',
'NAME':'mydb',
'USER':'whoever',
'PASSWORD':'whatever',
'OPTIONS':{"init_command": "SET storage_engine=INNODB" }
}
}
其次,您不需要每次都运行South迁移。在您的settings.py中设置SOUTH_TESTS_MIGRATE = False
,将使用普通同步数据库创建数据库,这将比运行所有历史迁移快得多。
https://stackoverflow.com/questions/3096148
复制相似问题