Для создания тестовой базы данных Django Unit Testing потребовалось очень много времени

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

При запуске теста задержка составляет от 70 до 80 секунд между началом и фактическим началом теста. Например, если я запускаю тест для небольшого модуля (используяtime python manage.py test myapp), Я получил

<... bunch of unimportant print messages I print from my settings>

Creating test database for alias 'default'...
......
----------------------------------------------------------------
Ran 6 tests in 2.161s

OK
Destroying test database for alias 'default'...

real    1m21.612s
user    1m17.170s
sys     0m1.4,00s

Около 1m18 из 1m: 21 между

Creating test database for alias 'default'...

и

.......

линия. Другими словами, тест занимает менее 3 секунд, но инициализация базы данных занимает 1: 18 минут.

У меня около 30 приложений, большинство из которых имеют от 1 до 3 моделей баз данных, так что это должно дать представление о размере проекта. Я использую SQLite для модульного тестирования и реализовал некоторые из предложенных улучшений. Я не могу опубликовать весь файл настроек, но с удовольствием добавляю любую необходимую информацию.

Я использую бегун

from django.test.runner import DiscoverRunner
from django.conf import settings

class ExcludeAppsTestSuiteRunner(DiscoverRunner):
    """Override the default django 'test' command, exclude from testing
    apps which we know will fail."""

    def run_tests(self, test_labels, extra_tests=None, **kwargs):
        if not test_labels:
            # No appnames specified on the command line, so we run all
            # tests, but remove those which we know are troublesome.
            test_labels = (
                'app1',
                'app2',
                ....
                )
            print ('Testing: ' + str(test_labels))

        return super(ExcludeAppsTestSuiteRunner, self).run_tests(
                test_labels, extra_tests, **kwargs)

и в моих настройках:

TEST_RUNNER = 'config.test_runner.ExcludeAppsTestSuiteRunner'

Я также пытался использоватьdjango-nose сdjango-nose-exclude

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

Пожалуйста, дайте мне знать, если

Это нормально и ожидаемоНе ожидается (и, надеюсь, исправить или привести к тому, что делать)

Опять же, мне не нужна помощь в том, как ускорить сам тест, кроме инициализации (или накладных расходов). Я хочу, чтобы пример выше занял 10 секунд вместо 80 секунд.

Большое спасибо

Я запускаю тест (для одного приложения) с--verbose 3 и обнаружил, что все это связано с миграциями:

  Rendering model states... DONE (40.500s)
  Applying authentication.0001_initial... OK (0.005s)
  Applying account.0001_initial... OK (0.022s)
  Applying account.0002_email_max_length... OK (0.016s)
  Applying contenttypes.0001_initial... OK (0.024s)
  Applying contenttypes.0002_remove_content_type_name... OK (0.048s)
  Applying s3video.0001_initial... OK (0.021s)
  Applying s3picture.0001_initial... OK (0.052s)
  ... Many more like this

Я подавил все свои миграции, но все еще медленно.

Ответы на вопрос(4)

Ваш ответ на вопрос