我是Django的新手。我在项目中有一个应用程序,它是用测试驱动开发开发的。在生产中我们使用MySQL作为数据库引擎,但如果我用MySQL运行测试:
./manage test myapp
然后它吸收太多时间(2-4分钟)来创建数据库,虽然测试速度非常快(大约一秒钟)。
如果我使用SQLite,那么测试只需要几秒钟,这对我来说是完美的。但问题是我经常需要在MySQL上使用我的本地数据库的管理界面。
如何让django在sqlite上运行测试并使用mysql启动runserver?
现在我在settings / local.py中使用这些设置,但我应该注释/取消注释行以更改数据库,具体取决于我目前正在执行的操作。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Use for testing
'NAME': 'databasename.db3',
# 'ENGINE': 'django.db.backends.mysql', # Use if need admin on localserver
# 'NAME': 'databasename',
'USER': 'myuser', # Not used with sqlite3.
'PASSWORD': 'somepassword', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
'TEST_CHARSET': "utf8", #option to make tesing database with utf8
'TEST_COLLATION': "utf8_general_ci",
}
}
答案 0 :(得分:7)
一种选择是在test
中检查sys.argv
settings.py
个参数:
if 'test' in sys.argv:
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
DATABASES['default']['NAME'] = 'databasename.db3'
但是,作为旁注:严格来说,为测试和开发/阶段/生产提供不同的数据库后端并不是一个好主意。您可能会遇到database-specific“特殊”案例,这可能会花费您大量时间和头痛。
答案 1 :(得分:2)
你不需要做任何黑客攻击。 " - 设置" - 这就是你要找的东西。
python manage.py test APP --settings settings.local
python manage.py test APP --settings settings.production
答案 2 :(得分:0)
在生产和测试中使用相同的设置始终是个好主意。它可以提供更好的测试。处理运行缓慢的测试的好方法是使用django-nose。它允许您重用以前创建的测试数据库。这可以超级加速测试运行。查看文档中的enabling database reuse。一个例子如下:
REUSE_DB=1 ./manage.py test
答案 3 :(得分:0)
通常我使用以下架构:
为不同模式创建两个设置文件
touch settings/production.py
touch settings/testing.py
在生产模式
ln -s settings/production.py settings/__init__.py
在测试模式
ln -s settings/testing.py settings/__init__.py