Django использует db по умолчанию для модульных тестов вместо db test - PullRequest
0 голосов
/ 11 октября 2019

Когда я запускаю manage.py test django использует мою базу данных по умолчанию вместо тестовой.

Я что-то не так понимаю из документов?

Согласно документам , поведение по умолчанию таково: «для тестов создаются отдельные, пустые базы данных» .

Я установил значение «TEST: NAME» просто для уверенности, но состояние документаэто необходимо, только если я хочу настроить имя тестовой базы данных вместо значения по умолчанию test_{dbname}

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "HOST": "0.0.0.0",
        "NAME": "mydb_db",
        "USER": "postgres",
        "PASSWORD": "postgres",
        "PORT": 5432,
        "TEST": {"NAME": "test_mydb_db"},
    }
}
from unittest import TestCase

class SimpleTest(TestCase):

    def test_get_user_authorized(self):
        client = Client()
        breakpoint()

>>> (Pdb) from django.db import connection
>>> (Pdb) connection.settings_dict['NAME']
'mydb_db'

Если я читаю или создаю данные в модульном тесте, данные из mydb_db а не test_mydb_db, как я ожидал.

Дополнительные примечания

База данных настраивается с помощью docker compose, но я не думаю, что это должно что-то влиять:

services:
  db:
    container_name: postgres
    image: postgres:9.6
    restart: always
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: mydb_db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      PGPASSWORD: postgres

1 Ответ

1 голос
/ 11 октября 2019

Отвечая на мой собственный вопрос здесь. Разобрался сразу после публикации. Похоже, я пропустил важный пункт из документов

SimpleTestCase должен наследоваться от django.test.TestCase, а не unittest.TestCase для создания тестовой базы данных должным образом.

Изменение моего кода на эторешил:


from django.test import TestCase

class SimpleTest(TestCase):

def test_get_user_authorized(self):
        client = Client()
        breakpoint()
>>> (Pdb) from django.db import connection
>>> (Pdb) connection.settings_dict['NAME']
'test_mydb_db'

Документы явно не указывают, что использование unittest не создаст тестовую базу данных, но рекомендует использовать TestCase django, если требуется база данных:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...