23 ноября 2010 г.

Тесты в Django - это быстро!

Одним из фактов, которым любят злоупотреблять люди, не желающие писать тесты, является то, что тесты - это медленно. И не только медленно писать сами тесты, но и медленно их запускать. И надо признаться Django раньше с удовольствием шла на поводу у этого факта.

Судите сами, у меня есть простой тестовый проект для своей библиотеки. В нем 39 тестов, из них 38 тестов по базе данных и 1 тест по работе с django.test.Client. В тестовом проекте есть 12 приложений, добавленных в INSTALLED_APPS, эти приложения создают 11 таблиц в базе данных и 3 индекса. Данные с фикстур нигде не загружаются. Никаких стресс-тестов проект не содержит.

Теперь давайте посмотрим на скорость выполнения тестов.

Django 1.0.4 справляется за ~14.8с, т.е. около 0.38c на каждый тест. И это действительно МЕДЛЕННО! Ведь повторюсь эти 39 тестов очень легкие в плане потребления ресурсов и очень щадящие к базе данных. Благо что 1.0.4 версию уже мало кто использует (я надеюсь) и потому этот результат не будет очень важным для нас.

Намного интересней и важней результат выполнения тестов в виртуальном окружении с Django 1.1.2. И он весьма неплох. Теперь 39 тестов успешно проходят всего за ~1.2с, т.е. более 10-кратное ускорение по сравнению с предыдущей версией Django. И теперь одному тесту требуется всего ничего, 0.03с. Неплохо, неплохо и главное не медленно. Но может ли быть быстрее?

В надеждах, что может быть и быстрее, я активирую виртуальное окружение с Django 1.2.3. И результаты выполнения тестов подтверждают мое предположение. Действительно еще быстрее. Теперь проход всех тестов занимает ~0.68с, практически в два раза быстрее предыдущей версии. Замечательно. И смело можно говорить, что тесты в Django - это быстро.

На сим можно было и заканчивать мой рассказ, но ведь я помню, что Alex Gaynor совсем недавно отрапортовал о еще более значительном ускорении выполнение тестов. Думая, куда ж еще быстрее, я все же активировал виртуальное окружение с версией Django из trunk-а и запустил выполнение тестов. К сожалению, а может и к радости, результаты не оказались какими-то заоблачными. Мои 39 тестов теперь проходят на ~0.08с быстрее и если это незначительный прирост относительно последней версии, то по сравнению даже с версией 1.1 - это около трех "бесплатных" теста.

А мораль сей басни такова, разработчики Django предостовляют в ваше разпоряжение по-настоящему быстрый инструмент для проведения тестирования, так что пользуйтесь ним, не забиывайте!

зы. Все тестовые классы в проекте наследовались от django.test.TestCase, тесты запускались как python testproject/manage.py test. Все стандартно.

blog comments powered by Disqus