Как использовать различные механизмы баз данных в Django для тестирования и производства

Я очень новичок в Django. У меня есть приложение в проекте, которое разрабатывается с помощью тестовой разработки. В производстве мы используем MySQL как механизм базы данных, но если я запускаю тест с MySQL:

./manage test myapp

Затем он поглощает слишком много времени (2-4 минуты) для создания базы данных, хотя тесты довольно быстрые (примерно через секунду).

Если я использую SQLite, тогда тесты требуют всего несколько секунд, что идеально для меня. Но проблема в том, что мне часто нужен интерфейс администратора с моей локальной базой данных в MySQL.

Как заставить django запускать тесты на sqlite и запустить runerver с mysql?

Теперь я использую эти настройки в настройках /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",
 }
}
4 ответа

Один вариант - проверить sys.argv для аргумента test в settings.py:

if 'test' in sys.argv:
 DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
 DATABASES['default']['NAME'] = 'databasename.db3'

Хотя, как побочная заметка: строго говоря, на самом деле неплохо иметь разные базы данных для тестирования и разработки/стадии/производства. Вы можете столкнуться с специфичными для конкретной базы данных "специальными" случаями, которые могут стоить вам много времени и головной боли.


Вам не нужно делать хаки. "--settings" - это то, что вы ищете.

python manage.py test APP --settings settings.local
python manage.py test APP --settings settings.production


По возможности всегда рекомендуется использовать одну и ту же установку в производстве и тестировании. Это позволяет лучше тестировать. Я отлично умею работать с медленными тестами, чтобы использовать django-nose. Он позволяет повторно использовать ранее созданные тестовые базы данных. Это может ускорить тестовые прогоны. Проверьте включение повторного использования базы данных в документах. Пример следующий:

REUSE_DB=1 ./manage.py test


Обычно я использую следующую схему:

Создайте два файла настроек для разных режимов

touch settings/production.py
touch settings/testing.py

В режиме производства

ln -s settings/production.py settings/__init__.py

В режиме тестирования

ln -s settings/testing.py settings/__init__.py

licensed under cc by-sa 3.0 with attribution.