Как сохранить тестовую базу данных django после запуска тестовых случаев
Когда я запускаю тестовые случаи, набрав
python manage.py test myapp
После завершения тестовых случаев тестовые базы данных по умолчанию удаляются программой запуска django. Я не хочу, чтобы это было удалено.
Я могу использовать любую базу данных!
Я хочу сохранить свою базу данных, потому что в базе данных есть ошибки, которые я хотел увидеть в созданной базе данных. Так что я могу их точно определить!
6 ответов
Согласно документам:
Независимо от того, пройдены тесты или нет, базы данных тестов уничтожаются после выполнения всех тестов.
Хотя, светильники могут помочь в вашей ситуации. Просто создайте исходные данные, вы хотите быть там при запуске теста, как текстуру, и выполните тестовую загрузку.
Вы можете предотвратить разрушение тестовых баз данных, используя test --keepdb
вариант.
https://docs.djangoproject.com/en/1.10/topics/testing/overview/
Проходя -k
к manage.py test
сохранит тестовую базу данных, он все равно удалит записи, созданные в ваших тестовых примерах. Это потому, что DjangoTestCase
классы по-прежнему будут сбрасывать вашу базу данных после каждого тестового примера (django.test.TransactionTestCase
сделаю flush
, пока django.test.TestCase
обернет каждый ваш тестовый пример в транзакцию и выполнит откат, когда тестовый пример будет выполнен).
Единственное реальное решение, чтобы заставить Django сохранять тестовые данные, - это расширить TestCase
class и переопределите код, который сбрасывает вашу базу данных.
Однако, если у вас нет времени для этого, вы также можете приостановить выполнение тестового примера до его завершения, что даст вам время проверить свою базу данных до ее сброса. Есть несколько способов добиться этого, но теперь ЭТО ХАК, запрашивающий пользователяinput
в вашем коде Python заставит Python приостановить выполнение и дождаться ввода пользователя.
from django.test import TestCase
class MyTestCase(TestCase):
def test_something_does_something(self):
result = do_something_with_the_database()
self.assertTrue(result)
# Ask for `input` so execution will pause and wait for input.
input(
'Execution is paused and you can now inspect the database.\n'
'Press return/enter key to continue:')
В качестве альтернативы вы также можете использовать pdb
с set_trace
функция, которая также приостанавливает выполнение и ожидает ввода, и в то же время позволяет вам отлаживать среду в этой точке выполнения кода.
Просто убедитесь, что вы удалили input()
(или pdb.set_trace()
) перед отправкой кода в свою автоматизированную систему сборки, иначе он будет ждать ввода пользователя и истечения времени ожидания.
Согласно документации, вы можете сохранить базу данных после выполнения тестов:
$ python manage.py test -k
или же
$ python manage.py test --keepdb
Для того, чтобы сохранить все тест базы данных Джанго состояния после выполнения теста (не только таблиц структуры)
- Убедитесь, что ваш тестовый класс основан на
django.test.SimpleTestCase
(не из django.test import TestCase, TransactionTestCase) - Пройдите один из ваших тестов, для которого вы хотите сохранить состояние базы данных.
- При желании добавить
raise Exception('db savepoint')
в середине вашего теста (или пропустите этот шаг, если вы хотите сохранить состояние после полного выполнения теста) - Добавьте следующий код в свой тестовый класс, чтобы предотвратить очистку таблиц базы данных после выполнения теста.
def tearDown(self) -> None:
pass
@classmethod
def tearDownClass(cls):
pass
- Запустите тест с
--keepdb
параметр, например./manage.py test app.test --keepdb
- предотвратить очистку всей БД после выполнения теста - Подождите, пока тест не пройдет
- Прибыль! Сделайте снимок / откройте свою test_database [не забывайте, что Django по умолчанию добавит префикс test_ в вашу базу данных по умолчанию]
См. Пример test test_copy
./manage.py test --noinput --keepdb api.tests.SomeTests.test_copy
class SomeTests(SimpleTestCase):
def setUp(self):
super(SomeTests, self).setUp()
self.huge_set_up_operations()
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.huge_init_database()
def tearDown(self):
pass
@classmethod
def tearDownClass(cls):
pass
def test_copy(self):
subscription_models.COPY_SUBSCRIPTION_CHUNK_SIZE = 1 # verifies that everything goes ok even if chunked
target_list = AutoResponderFactory.create(user=self.user).list
target_contact = ContactFactory.create(user=self.user)
SubscriptionFactory.create(contact=target_contact, list=target_list)
Для всех, кто работает в среде Pytest, я использую следующий файл pytest.ini для тестирования
[pytest]
DJANGO_SETTINGS_MODULE=myapp.settings.test
python_files = tests.py test_*.py *_tests.py
addopts =
--ds=myapp.settings.test
--reuse-db
--nomigrations
обратите внимание на аргумент команды "--resuse-db" / addpots