Ускорение теста Django (нос) с неиспользованным reuse_db
Я использую django-nose для запуска модульных тестов в django (1.4).
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Создание базы данных занимает много времени.
Итак, я обнаружил, что положить это в settings.py:
os.environ['REUSE_DB'] = "1"
должен сделать свое дело.
На самом деле Джанго Итселве дает следующее предложение:
To reuse old database "<path not very interesting>/var/sqlite/unittest.db" for speed, set env var REUSE_DB=1.
конечно, вам нужно запустить его один раз (или после каждого изменения базы данных) с этим флагом =0
Однако, когда вы устанавливаете флаг в 0, мои тесты заканчиваются замечанием:
Destroying test database for alias 'default'...
Поэтому, когда я хочу запустить его с повторным использованием.... повторное использование нечего... и я получу ошибки, говорящие о том, что таблица не существует
DatabaseError: no such table: <and than a table name>
Тест выполняется отлично, когда для reuse_db установлено значение 0
Я использую тестовый псевдоним базы данных в моих настройках разработки:
DATABASES = {
'default': {
'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'development.db'),
'TEST_NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
Я не использую базу данных sqllite в памяти для тестирования, потому что где-то читал, что это плохо работает с django-nose.
Так как же я могу использовать БД, когда она в конце концов уничтожает базу данных...
в соответствии с этим https://docs.djangoproject.com/en/1.4/topics/testing/ django делает это, но не показывает, как предотвратить это (если я могу), или как используйте параметр reuse_db. я должен использовать другие настройки?
3 ответа
Если я правильно понял, вы не знаете, как создать тестовую базу данных в первый раз (чтобы использовать ее позже).
NoseTestSuiteRunner должен создать его автоматически, если БД не существует, даже если вы установите REUSE_DB = 0. Если вы хотите создать тестовую БД вручную, вы можете создать следующий файл:
test_db_settings.py
в котором вы указываете:
from settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
# TestRunner uses a database with name that consists
# of prefix test_ and your database name if your database
# name is db then the test database name has to be test_db
'NAME': 'test_db',
'USER': 'postgres_user',
'PASSWORD': 'postgres_user',
'HOST': 'localhost',
'PORT': '5432',
}
}
после этого создайте test_db:
createdb -U postgres_user -h localhost test_db # if you use postgres
python manage.py syncdb --settings test_db_settings.py
python manage.py migrate --settings test_db_settings.py (only if you use South)
Теперь у нас есть БД, которая используется TestRunner. Мы можем запустить тест:
REUSE_DB=1 python manage.py test
обновленный
Вы уверены, что используете NoseTestSuiteRunner? Вот некоторый код из django_nose.NoseTestSuiteRunner. Как мы видим, если опция REUSE_DB установлена, то teardown_database отключен. Если вы хотите, вы можете отладить его, например, установить здесь точку останова, чтобы проверить, действительно ли вы используете ее Runner и т. Д.
def teardown_databases(self, *args, **kwargs):
"""Leave those poor, reusable databases alone if REUSE_DB is true."""
if not _reusing_db():
return super(NoseTestSuiteRunner, self).teardown_databases(
*args, **kwargs)
# else skip tearing down the DB so we can reuse it next time
Я принял ответ Андрея Кайгородова, потому что он привел меня к решению... читая его ответ, я подумал (как легко и как глупо с моей стороны...)
В любом случае, поместите этот файл settings_test_db.py рядом с настройками с этим контентом: (заполнив название вашего проекта)
from <myproject>.settings import *
DATABASES = {
'default': {
'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
И для sqlite вам не нужно создавать БД. просто беги
python manage.py syncdb --settings <myproject>.settings_test_db
(примечание: используйте имя проекта и без.py)
и запустить миграцию
python manage.py migrate --settings <myproject>.settings_test_db
(только если вы используете Юг)
и установите в вашем settings.py:
os.environ['REUSE_DB'] = "1"
так что вы можете использовать
python manage.py test
Кстати, вместо использования отдельного файла настроек теста... вы можете определить тестовый anme в тех же настройках:
DATABASES = {
'default': {
'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'test.db'),
'TEST_NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '', # empty string for localhost.
'PORT': '', # empty string for default.
}
}