Django тестовая база данных использует локальный db.sqlite3, не работает в памяти - PullRequest
0 голосов
/ 16 января 2020

Когда я запускаю Django тесты, которые вставляют данные в базу данных, он вставляет в мои локальные db.sqlite3 и сохранения , когда тесты заканчиваются. Я не хочу, чтобы это произошло, и это не должно быть в соответствии с документами :

Независимо от того, пройдены тесты или нет, базы данных тестов уничтожаются, когда все тесты были выполнены.

Мой модульный тест:

from unittest import TestCase

from web.constants import USER_TYPE_CONTRACTOR
from web.models import User


class LoginTestCase(TestCase):

    def setUp(self):
        self.demo_user_1_username = 'c2'
        User.objects.create(username=self.demo_user_1_username, password='c12345678')

    def test_user_defaults_to_contractor(self):
        demo_user_1 = User.objects.get(username=self.demo_user_1_username)
        self.assertEqual(demo_user_1.user_type, USER_TYPE_CONTRACTOR)

    def doCleanups(self):
        """Delete demo data from database"""
        # I needed to do this as workaround
        # demo_user_1 = User.objects.get(username=self.demo_user_1_username)
        # demo_user_1.delete()

Пользователь c2 теперь находится в db.sqlite3, поэтому, когда я снова запускаю тест, не удается, поскольку имя пользователя c2 уже существует.

Я пытался сделать это в settings.py:

DATABASES = {
    'default': dj_database_url.config(conn_max_age=600)
}
DATABASES['default']['TEST'] = {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'test_db.sqlite3'),
}

Но test_db.sqlite3 не создано.

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

1 Ответ

1 голос
/ 16 января 2020

Проблема здесь, как @Chris упомянул в прямом использовании TestCase из unitetest модуля, иерархическая цепочка выглядит так:

TestCase->TransactionTestCase->SimpleTestCase->unittest.TestCase

Как документация резюме:

[TestCase] ​​- это самый распространенный класс для написания тестов в Django. Он наследуется от TransactionTestCase (и, соответственно, от SimpleTestCase). Если ваше приложение Django не использует базу данных, используйте SimpleTestCase.

Здесь:

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

ПРИМЕЧАНИЕ : В вашем случае, тесты используют фактическую базу данных, что приводит к потере данных и заполнению фиктивными данными. Никогда не используйте такой рабочий процесс!

На самом деле тесты вообще не должны использовать вашу фактическую базу данных, по умолчанию для sqlite3 с поддержкой Django будет обрабатываться база данных в памяти, уничтожение базой данных можно управлять с помощью флага --keepdb. Вообще говоря, процесс выглядит следующим образом:

  1. Тестовая база данных будет создана с теми же учетными данными, что и фактические, но имя будет test_<actual_db_name>. Можно даже получить доступ к базе данных между выполнением теста, если она не удаляется каждый раз после того, как тесты пройдены (--keepdb).
  2. Перед выполнением теста БД теста будет в состоянии как фактическое с выполнением python manage.py migration, хотя вы можете пропустить выполнение миграции с помощью переопределения переменной MIGRATION_MODULES env.

Итак, решение состоит в том, чтобы переключиться на использование django.test.TestCase.

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