В python Django как определить тестовую базу данных и сохранить записи, вставленные в тестовую базу данных, до очистки в методе tearDown тесткейса

Я хочу создать тестовую базу данных для моей базы данных по умолчанию в Django последней версии, для этого я настроил в файле проекта settings.py следующим образом.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
        'TEST': {
            'NAME': BASE_DIR / 'test_db.sqlite3',
        }
    }
}

У меня есть модель Topic в моем models.py файле и я выполнил makemigrtions & migrate cmds, чтобы иметь таблицу в sqlite db. Я создал TestTopic класс в моем файле app(first_app) tests.py следующим образом

from django.test import TestCase,SimpleTestCase
from .models import Topic

class TestTopic(TestCase):
    def setUp(self):
        Topic.objects.create(top_name='Test topic1')
        Topic.objects.create(top_name='Test topic2')
        Topic.objects.create(top_name='Test topic3')

    def test_create_topic(self):
        all_topics = Topic.objects.count()
        self.assertEqual(all_topics, 3)

    def tearDown(self) -> None:
        return super().tearDown()

Я выполняю приведенную ниже команду для запуска тестов моего приложения (first_app). Передаю --keepdb для сохранения test_db.

py manage.py test first_app --keepdb

После этого я вижу, что тестовый пример пройден. Но когда я проверяю test_db.sqlite в приложении sqlite db browser, чтобы увидеть тестовые темы, которые я создал в тестовом примере, я их не вижу. Я хочу, чтобы эти записи были в test_db до тех пор, пока я не очищу их вручную или в методе tearDown моего тестового случая. (Ниже приведен sqlite db browser таблицы test_db.sqlite topics.

)

test_db.sqlite

Опция -keepdb сохранит только схему базы данных, но не данные в ней. Данные, созданные в каждом тесте, никогда не фиксируются в базе данных, Django создает транзакцию в базе данных перед выполнением одного тестового метода, а в конце теста эта транзакция откатывается, если вы используете класс TestCase.

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

.

если вы используете setUpTestData, то данные будут сохранены во время всего набора тестов класса:

class TestFoo(TestCase):
    @classmethod
    def setUpTestData(cls):
        User.objects.create(...)
        User.objects.create(...)
        User.objects.create(...)

    def test_something(self):
        self.assertEqual(1 + 1, 2)

    def tearDown(self) -> None:
        print(User.objects.count())  # you'll have the 3 users here
        return super().tearDown()
Вернуться на верх