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 по умолчанию для генерации нового имени для тестовой базы данных.