我的一些单元测试需要10-15秒才能创建表格。这似乎不必要地长。它必须创建大约50个表,但这仍然只有每秒3个表。在经常进行单元测试时,这是一个很大的烦恼。
作为一种解决方法,我一直在sqlite3中运行我的单元测试。它速度非常快,但我更喜欢在MySQL上运行我的测试,因为那是我的实时服务器运行的。
为了说明速度差异,请创建一个新项目。然后使用mysql在其上运行syncdb。然后使用sqlite3尝试它。
[~/testproject] ./manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
对我来说,在MySQL中创建上述表大约需要2秒钟。 Sqlite3几乎是即时的。
我在我的开发机器上运行mysql。这是我的my.cnf。
请建议您可以考虑的任何提示或调整,这可能有助于加快MySQL的表创建时间。
答案 0 :(得分:3)
您可以创建RAM磁盘并在那里移动数据库,仅用于单元测试。 如果你为此编写脚本,那么它是自动且非常方便的。
另外,出于其他目的,我编写了加载DB的自定义测试运行器 从sql dump而不是创建它然后创建表。
你选择。
答案 1 :(得分:1)
我发现使用sqlite替代使我的单元测试更快。我也正在删除southdb,因为这也会减慢表的创建速度。
if len(sys.argv) > 1 and sys.argv[1] == 'test':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
INSTALLED_APPS = tuple([x for x in INSTALLED_APPS if x != 'south'])
答案 2 :(得分:0)
我的INNODB表创建速度一直很慢(创建13个小表的时间约为25秒)。
我在my.cnf文件的[mysqld]部分中尝试了选项。
添加:
innodb_flush_method=fdatasync
产生了最好的结果(创建相同的13个小表约1.5秒)。
答案 3 :(得分:0)
仅在Mac OSX上,将以下内容添加到〜/ .my.cnf:
[mysqld]
skip-sync-frm=ON
对我来说,这改善了我的Django测试套件在MySQL上的启动时间从1分30秒到7秒!
详细信息: http://www.stereoplex.com/blog/speeding-up-django-unit-test-runs-with-mysql