Как сохранить тестовую базу данных 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

Для того, чтобы сохранить все тест базы данных Джанго состояния после выполнения теста (не только таблиц структуры)

  1. Убедитесь, что ваш тестовый класс основан на django.test.SimpleTestCase (не из django.test import TestCase, TransactionTestCase)
  2. Пройдите один из ваших тестов, для которого вы хотите сохранить состояние базы данных.
  3. При желании добавить raise Exception('db savepoint') в середине вашего теста (или пропустите этот шаг, если вы хотите сохранить состояние после полного выполнения теста)
  4. Добавьте следующий код в свой тестовый класс, чтобы предотвратить очистку таблиц базы данных после выполнения теста.
    def tearDown(self) -> None:
        pass

    @classmethod
    def tearDownClass(cls):
        pass
  1. Запустите тест с --keepdb параметр, например ./manage.py test app.test --keepdb - предотвратить очистку всей БД после выполнения теста
  2. Подождите, пока тест не пройдет
  3. Прибыль! Сделайте снимок / откройте свою 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

Другие вопросы по тегам