В течение некоторого времени мое модульное тестирование занимало больше времени, чем ожидалось. Я пытался отладить его пару раз без особого успеха, так как задержки возникают еще до того, как мои тесты начинают выполняться. Это повлияло на мою способность делать что-то отдаленно близкое к разработке через тестирование (возможно, мои ожидания слишком высоки), поэтому я хочу посмотреть, смогу ли я исправить это раз и навсегда.
При запуске теста существует задержка от 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.400s
Около 1:18 из 1: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
Я раздавил все свои миграции, но все еще медленно.
verbose
. В нашем проекте есть пара сотен миграций, некоторые из которых, по-видимому, занимают до секунды. Для тех, кто использует PyCharm (Pro), вы можете добавить--verbose 3
(или-v 3
) в конфигурацию запуска для своего теста (в разделе «Параметры:»). - person djvg   schedule 13.12.2018