Разные БД для тестирования в Django? - PullRequest
50 голосов
/ 10 января 2011
DATABASES = {
#    'default': {
#        'ENGINE': 'postgresql_psycopg2',
#        ...
#    }

    # for unit tests
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase'
    }
}

У меня есть две базы данных: одну я хотел бы использовать для модульных тестов, а другую - для всего остального. Можно ли настроить это в Django 1.2.4?

(Причина, по которой я спрашиваю, состоит в том, что с postgresql я получаю следующую ошибку:

foo@bar:~/path/$ python manage.py test
Creating test database 'default'...
Got an error creating the test database: permission denied to create database

Type 'yes' if you would like to try deleting the test database 'test_baz', or 'no' to cancel: yes
Destroying old test database...
Got an error recreating the test database: database "test_baz" does not exist

Почему я мог получить эту ошибку? Наверное, мне все равно, смогу ли я всегда использовать SQLite для модульных тестов, так как это прекрасно работает.)

Ответы [ 8 ]

64 голосов
/ 10 января 2011

В вашем settings.py (или local_settings.py):

import sys
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase'
    }
31 голосов
/ 21 марта 2012

Я справляюсь с этим, имея несколько файлов настроек, так как я использую это для поддержания набора общих настроек с изменениями для каждого экземпляра.Это немного сложнее в настройке, чем некоторые другие решения, но мне все равно нужно было это сделать, потому что я управлял немного другими настройками для локальной разработки, удаленной разработки, организации и производства.

*У 1004 * есть несколько опций для управления настройками, и я выбрал практику, аналогичную описанной в https://code.djangoproject.com/wiki/SplitSettings#SimplePackageOrganizationforEnvironments

Итак, в моем каталоге проектов Django у меня есть папка настроек, которая выглядит следующим образом:

$ tree settings
settings
├── defaults.py
├── dev.py
├── dev.pyc
├── __init__.py
├── lettuce.py
├── travis.py
├── unittest.py

Общие настройки находятся в файле settings / defaults.py, и я импортирую их в файлы настроек своего экземпляра.Поэтому settings / unittest.py выглядит следующим образом:

from defaults import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'my_database',
    }
} 

Затем, когда я хочу запустить тесты, я просто выполняю:

$ ./manage.py test --settings=settings.unittest

, чтобы использовать sqlite для тестирования.Я буду использовать другой модуль настроек, если я хочу использовать другой тестовый бегун или конфигурацию базы данных.

14 голосов
/ 04 января 2018

Хочу отметить, что вы можете указать тестовую базу данных уже в settings.py.Смотри https://docs.djangoproject.com/en/2.0/ref/settings/#test:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'mydatabaseuser',
        'NAME': 'mydatabase',
        'TEST': {
            'NAME': 'mytestdatabase',
        },
    },
}
6 голосов
/ 12 ноября 2014

Это значительно ускорило выполнение теста.

import sys

if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'TEST_CHARSET': 'UTF8', # if your normal db is utf8
        'NAME': ':memory:', # in memory
        'TEST_NAME': ':memory:', # in memory
    }

    DEBUG = False # might accelerate a bit
    TEMPLATE_DEBUG = False

    from django.core.management import call_command
    call_command('syncdb', migrate=True) # tables don't get created automatically for me
3 голосов
/ 04 мая 2013

Хотя это уже решено ...

Если ваша база данных для тестов - это просто обычная БД:

Я думаю, что вы не проводите модульное тестирование, поскольку полагаетесь на базу данных. В любом случае, django содержит тип теста для этого (не унитарного): django.test.TestCase

Вам нужно извлечь из django.test.TestCase вместо unittest.TestCase, что создаст для вас новую базу данных для повторной проверки, которая будет уничтожена после завершения теста.

Есть интересные объяснения / советы по тестированию с помощью db в следующей ссылке
Тестирование приложений Django

3 голосов
/ 20 марта 2012

Если у вас есть доступ к созданию базы данных вручную, вы можете использовать django-nose в качестве TEST_RUNNER.После установки, если вы передадите следующую переменную среды, она не удалит и не создаст заново базу данных.

REUSE_DB=1 ./manage.py test

Вы также можете добавить следующее в settings.py, чтобы вам не приходилось писать REUSE_DB= 1 каждый раз, когда вы хотите запустить тесты:

os.environ['REUSE_DB'] = "1"

Примечание: это также оставит все ваши таблицы в базах данных, что означает, что настройка теста будет немного быстрее, но вам придется вручную обновлять таблицы (или удалять и заново создавать базу данных самостоятельно) при смене моделей.

2 голосов
/ 09 февраля 2018

Я решил эту проблему, просто создав константу других настроек DATABASES_AVAILABLE.

DATABASES_AVAILABLE = {
    'main': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'nep',
        'USER': 'user',
        'PASSWORD': 'passwd',
        'HOST': 'localhost',
    },
    'remote': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'nes_dev',
        'USER': 'usr',
        'PASSWORD': 'passwd',
        'HOST': '200.144.254.136',
    },
    'sqlite': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
}

# This solves the problem with tests
# Define a system variable called DJANGO_DATABASE_TEST and set it to the
# the database you want
database = os.environ.get('DJANGO_DATABASE_TEST', 'main')
DATABASES = {
    'default': DATABASES_AVAILABLE[database]
}
1 голос
/ 26 октября 2017

Почему я мог получить эту ошибку?

Из-за недостаточных разрешений. Вы можете изменить права пользователя на ALTER USER username CREATEDB; после запуска psql с привилегиями суперпользователя.

Пример

$ sudo su - postgres
$ psql
psql (9.3.18)
Type "help" for help.

postgres=# ALTER USER username CREATEDB;
ALTER ROLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...