Ускорение теста 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.
        }
    }
Другие вопросы по тегам