Я решил эту проблему, просто создавая другие постоянные настройки

DATABASES = {
#    'default': {
#        'ENGINE': 'postgresql_psycopg2',
#        ...
#    }

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

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

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

[email protected]:~/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 для модульных тестов, так как это прекрасно работает.)

 Nick Heiner10 янв. 2011 г., 20:36
Этот пользователь postgres работает для обычного просмотра сайта, но я не уверен, что он может создать БД.
 Jonas Geiregat08 мар. 2012 г., 18:36
Как сказал @ CarlesBarrobés, у вас, вероятно, нет прав CREAETE. Это следует из документации django: обратите внимание, что для использования этой функции пользователь базы данных, к которому подключается Django, должен обладать правами CREATE DATABASE.
 Carles Barrobés10 янв. 2011 г., 20:34
Вы пробовали, действительно ли у пользователя postgres есть права на создание базы данных?

Ответы на вопрос(6)

Решение Вопроса

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

import sys
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase'
    }
 David S02 мая 2012 г., 20:42
@Rosarch ... да; это немного "нахально", но вы правы! Оно работает. :) Но, ИМХО, иметь какую-либо базу данных дляЕДИНИЦА ИЗМЕРЕНИЯ тестирование хакерское. Я бы хотел, чтобы у Джанго была другая философия, когда дело дошло до этого.
 sleepycal03 февр. 2015 г., 20:59
Это в корне неправильно, пожалуйста, не
 Rexford02 февр. 2016 г., 00:42
@sleepycal Почему это?
 Nick Heiner10 янв. 2011 г., 20:40
это может быть хакерским, но это работает.
 Hugo Luis Villalobos Canto01 авг. 2018 г., 23:20
Я пытаюсь использовать это решение, но я хочу использоватьPostgres как тестовое ядро ​​базы данных, и я получаю сообщение об ошибке, говорящее, что таблицы не существуют. Я думал, что тест создал базу данных. Это так?

вы можете использоватьДжанго нос как ваш TEST_RUNNER. После установки, если вы передадите следующую переменную среды, она не удалит и не создаст заново базу данных.

REUSE_DB=1 ./manage.py test

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

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

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

что вы можете указать тестовую базу данных уже в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',
        },
    },
}
 Lantern12 апр. 2018 г., 10:37
Это позволяет мне менять двигатель?
 Jeff B.01 мар. 2018 г., 04:32
это было простое решение, которое работало отлично. Я использую сайт pythonanywhere, и это позволило мне запустить учебник.
 ilse200513 февр. 2019 г., 10:58
К сожалению, вы не можете изменитьHOST.
 Cole20 авг. 2018 г., 04:27
Это позволило мне найти тестовую базу данных при тестировании с--keepdb аргумент.
 smido09 мая 2018 г., 23:13
@Zee Да, вы можете изменить все, что я думаю. Проверьте документы для получения дополнительной информацииdocs.djangoproject.com/en/2.0/topics/testing/overview/...

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

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

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

https://code.djangoproject.com/wiki/SplitSettings имеет ряд опций для управления настройками, и я выбрал практику, аналогичную описанной в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 для тестирования. Я буду использовать другой модуль настроек, если я хочу использовать другой тестовый бегун или конфигурацию базы данных.

 Lym19 янв. 2015 г., 11:45
Как человек с опытом работы с Rails, я нашел этот ответ лучшим. Rails использует тот же тип соглашения, с небольшим отличием, что в Rails каталог настроек называется config.

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

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

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

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

 Mario Corchero03 июн. 2017 г., 00:14
Тогда у вас будет потенциально невоспроизводимый тест: $ и для выполнения ваших тестов потребуется подключение к открытому миру.
 user196945302 июн. 2017 г., 23:51
Проблема, с которой я иногда сталкиваюсь, заключается в том, что живые данные довольно сложны и получены из какого-то внешнего источника. Для тестирования я хочу подмножество. Да, я мог бы создать это подмножество - это настройка моего тестового класса. Но это может быть нетривиально. Особенно мне лучше, если мои тесты доступны только для чтения в отношении БД.

Ваш ответ на вопрос