В 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.
Опция -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()