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 для одного запуска.

Вернуться на верх