Leo*_*opd 118 python mysql django unit-testing
我的Django单元测试需要很长时间才能运行,所以我正在寻找加快速度的方法.我正在考虑安装SSD,但我知道它也有其缺点.当然,我可以用我的代码做些事情,但我正在寻找结构修复.即使运行单个测试也很慢,因为每次都需要重建/迁移数据库.所以这是我的想法......
既然我知道测试数据库总是很小,为什么我不能只是将系统配置为始终将整个测试数据库保存在RAM中?切勿触摸磁盘.如何在Django中配置它?我更喜欢继续使用MySQL,因为这是我在制作中使用的东西,但如果SQLite 3或其他东西使这很容易,我就会这样做.
SQLite或MySQL是否可以选择完全在内存中运行?应该可以配置一个RAM磁盘然后配置测试数据库来存储它的数据,但我不知道如何告诉Django/MySQL为某个数据库使用不同的数据目录,特别是因为它一直被擦除并重新创建每次运行.(我在Mac FWIW上.)
Eti*_*nne 157
如果在运行测试时将数据库引擎设置为sqlite3,Django将使用内存数据库.
我正在使用这样的代码settings.py
在运行我的测试时将引擎设置为sqlite:
if 'test' in sys.argv:
DATABASE_ENGINE = 'sqlite3'
Run Code Online (Sandbox Code Playgroud)
或者在Django 1.2中:
if 'test' in sys.argv:
DATABASES['default'] = {'ENGINE': 'sqlite3'}
Run Code Online (Sandbox Code Playgroud)
最后在Django 1.3和1.4中:
if 'test' in sys.argv:
DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
Run Code Online (Sandbox Code Playgroud)
(对于Django 1.3,后端的完整路径并不是绝对必要的,但会使设置向前兼容.)
如果您遇到南迁移问题,还可以添加以下行:
SOUTH_TESTS_MIGRATE = False
Run Code Online (Sandbox Code Playgroud)
Anu*_*yal 81
我通常为测试创建一个单独的设置文件,并在测试命令中使用它,例如
python manage.py test --settings=mysite.test_settings myapp
Run Code Online (Sandbox Code Playgroud)
它有两个好处:
你不必test
在sys.argv中检查或任何这样的魔术词,test_settings.py
可以简单地
from settings import *
# make tests faster
SOUTH_TESTS_MIGRATE = False
DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
Run Code Online (Sandbox Code Playgroud)
或者您可以根据需要进一步调整它,将测试设置与生产设置完全分开.
另一个好处是,您可以使用生产数据库引擎而不是sqlite3运行测试,以避免细微的错误,因此在开发使用时
python manage.py test --settings=mysite.test_settings myapp
Run Code Online (Sandbox Code Playgroud)
并且在提交代码之前运行一次
python manage.py test myapp
Run Code Online (Sandbox Code Playgroud)
只是为了确保所有测试都真的通过了.
muu*_*ope 22
MySQL支持名为"MEMORY"的存储引擎,您可以在数据库config(settings.py
)中配置它:
'USER': 'root', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'OPTIONS': {
"init_command": "SET storage_engine=MEMORY",
}
Run Code Online (Sandbox Code Playgroud)
请注意,MEMORY存储引擎不支持blob/text列,因此如果您使用django.db.models.TextField
此列将不适合您.
Dan*_*man 15
我无法回答你的主要问题,但你可以采取一些措施来加快速度.
首先,确保您的MySQL数据库已设置为使用InnoDB.然后它可以使用事务在每次测试之前回滚数据库的状态,这在我的经验中导致了大规模的加速.您可以在settings.py(Django 1.2语法)中传递数据库init命令:
DATABASES = {
'default': {
'ENGINE':'django.db.backends.mysql',
'HOST':'localhost',
'NAME':'mydb',
'USER':'whoever',
'PASSWORD':'whatever',
'OPTIONS':{"init_command": "SET storage_engine=INNODB" }
}
}
Run Code Online (Sandbox Code Playgroud)
其次,您不需要每次都运行South迁移.设置SOUTH_TESTS_MIGRATE = False
在你的settings.py和数据库将与普通的执行syncdb,这将是比通过所有历史悠久的迁移运行更快创建.
Pot*_*hur 10
你可以做双重调整:
我正在使用这两种技巧,我很开心.
如何在Ubuntu上为MySQL设置它:
$ sudo service mysql stop
$ sudo cp -pRL /var/lib/mysql /dev/shm/mysql
$ vim /etc/mysql/my.cnf
# datadir = /dev/shm/mysql
$ sudo service mysql start
Run Code Online (Sandbox Code Playgroud)
当心,它只是用于测试,重启后你的数据库从内存中丢失了!