Django 1.4: Тесты работают очень медленно
Я работаю над старой базой кода, которая все еще использует Django 1.4
Это означает, что красивый флаг --keepdb
недоступен.
Выполнение одного такого теста занимает 50 секунд:
time manage.py test myapp.tests.test_foo.FooTestCase.test_something
Мой метод test_something
быстрый. Именно создание test-DB занимает так много времени.
50 секунд - это слишком долго для продуктивного цикла редактирования-тестирования. Что я могу сделать (кроме более быстрого оборудования)?
Вы можете взломать опцию --keepdb
в вашем исходном коде.
Вам нужно отредактировать файл django/db/backends/creation.py
следующим образом:
256c256,259
< self._create_test_db(verbosity, autoclobber)
---
> skip = True
>
> if not skip:
> self._create_test_db(verbosity, autoclobber)
264,281c267,285
< # Report syncdb messages at one level lower than that requested.
< # This ensures we don't get flooded with messages during testing
< # (unless you really ask to be flooded)
< call_command('syncdb',
< verbosity=max(verbosity - 1, 0),
< interactive=False,
< database=self.connection.alias,
< load_initial_data=False)
<
< # We need to then do a flush to ensure that any data installed by
< # custom SQL has been removed. The only test data should come from
< # test fixtures, or autogenerated from post_syncdb triggers.
< # This has the side effect of loading initial data (which was
< # intentionally skipped in the syncdb).
< call_command('flush',
< verbosity=max(verbosity - 1, 0),
< interactive=False,
< database=self.connection.alias)
---
> if not skip:
> # Report syncdb messages at one level lower than that requested.
> # This ensures we don't get flooded with messages during testing
> # (unless you really ask to be flooded)
> call_command('syncdb',
> verbosity=max(verbosity - 1, 0),
> interactive=False,
> database=self.connection.alias,
> load_initial_data=False)
>
> # We need to then do a flush to ensure that any data installed by
> # custom SQL has been removed. The only test data should come from
> # test fixtures, or autogenerated from post_syncdb triggers.
> # This has the side effect of loading initial data (which was
> # intentionally skipped in the syncdb).
> call_command('flush',
> verbosity=max(verbosity - 1, 0),
> interactive=False,
> database=self.connection.alias)
391,393c395,398
< time.sleep(1)
< cursor.execute("DROP DATABASE %s"
< % self.connection.ops.quote_name(test_database_name))
---
>
> #time.sleep(1)
> #cursor.execute("DROP DATABASE %s"
> # % self.connection.ops.quote_name(test_database_name))
Теперь выполнение теста занимает 6, а не 50 секунд.
Если вы изменяете схему базы данных, то вам необходимо установить skip = False
для одного запуска.