Django автоматически не создает тестовую базу данных

У меня есть проект Django, версия - 3.2.25. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу создать тестовую базу данных, когда выполняю свои тесты с помощью VScode test runner. Если это имеет значение, вот версии pytest:

 name         : pytest                                      
 version      : 8.2.2                                       
 description  : pytest: simple powerful testing with Python 

required by
 - pytest-django requires >=5.4.0
 - pytest-dotenv requires >=5.0.0

В принципе, у меня есть тестовый пример, который использует мою локальную базу данных, я хочу начать использовать виртуальную базу данных, которая динамически создается при выполнении теста, вместо локальной. Чтобы сделать это, я попытался установить свойство Test в моей конфигурации базы данных settings.py:

DATABASES = {
    'default': {
        "NAME": "localDatabase",
        "ENGINE": "django.contrib.gis.db.backends.postgis",
        "USER": "test",
        "PASSWORD": "test",
        "HOST": "127.0.0.1",
        "PORT": "5432",
        "TEST": {
            "NAME": "test_local"
        },
    },
}

Итак, внутри моего тестового примера:

class BillAPITests(APITestCase):
    def test_create_bill(self):
        from django.db import connection
        print(connection.settings_dict["NAME"]
        response = self.client.post(self.base_url, self.base_payload, format="json")
        self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)

в результате печати я получаю:

Локальная база данных

вместо "test_local".

В качестве второй попытки я попробовал настроить pytest.fixture в моем conftest.py:

@pytest.fixture(scope="session")
def django_db_setup():
    load_dotenv()
    
    settings.DATABASES["default"] = {
        "NAME": "test_local",
        "ENGINE": "django.contrib.gis.db.backends.postgis",
        "USER": "test",
        "PASSWORD": "test",
        "HOST": "127.0.0.1",
        "PORT": "5432",
    }

Still the same output...

I have also tried closing all connections in the `django_db_setup` before swapping my default databases using:
```py
from django import db
db.connections.close_all()

Нет результата...

Единственное, что привело меня к другому поведению, - это настройка имени базы данных непосредственно в django_db_setup, например, так:

settings.DATABASES["default"]["NAME"] = "test_local"

Однако, таким образом, django автоматически не создает базу данных "test_local" и не удается подключиться к ней.

Буду признателен за любую помощь, спасибо

Проблема в моем случае заключалась в том, что я переопределил создание тестовой базы данных по умолчанию с помощью Django при запуске тестов. Это произошло из-за устаревшего pytest fixture, который был у меня в conftest.py. Как подтвердил @willeM_ Van Onsem, Django по умолчанию создает тестовую базу данных, добавляя test_ к имени используемой по умолчанию базы данных.

Чтобы проверить, какую базу данных вы используете, просто добавьте инструкцию print в тестовый пример:

from django.db import connection
connection.settings_dict["NAME"]

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

В моем случае конфигурация моей базы данных выглядела следующим образом:

DATABASES = {
    'default': {
        "NAME": "localDatabase",
        "ENGINE": "django.contrib.gis.db.backends.postgis",
        "USER": "test",
        "PASSWORD": "test",
        "HOST": "127.0.0.1",
        "PORT": "5432",
    },
}

и при запуске тестов используемое в данный момент имя базы данных - "test_localDatabase".

Как вы можете видеть, я удалил свойство "TEST" из DATABASES , поскольку оно переопределяет логику Django по умолчанию для генерации нового имени для тестовой базы данных.

Вернуться на верх