02.10

Контроль качества Django проектов

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

Как оценить качество кода?

Основой для оценки яляются 3 вещи:

  • прохождение тестов (doctest, UnitTest)
  • покрытие тестами (coverage.py, figleaf)
  • соответствие стандартам языка (pep8, PyLint, pyflakes, pychecker)

Дополнительно можно использовать:

  • профилирование (hotshot, cProfile)
  • тестирование корректности работы в разных браузерах (Selenium, Windmill)
  • структуру кода (PyMetrics, pygenie)
  • сбор количественных метрик (sloccount)

Для тестирования необходимо использовать свой тест рунер, который будет тестировать проект и входящие в него приложения (поставляемые вместе с ним). Стандартная тест рунер Django выполняет все тесты всех установленных приложений. Мы же используем стабильные версии сторонних библиотек, которые по-умолчанию проходят все тесты? Кроме того свой тест рунер кроме тестирования может собирать различную статистику по коду и строить отчеты.

Покрытие кода тестами дает возможность найти места содержащие потенциальные ошибки. При разработки с нуля этот момент достаточно спорный, но справедливо на 100% если проводится рефакторинг. В то же время 100% покрытие кода тестами не дает гарантии, что этот код работает корректно во всех возможных случаях - код может по разному работать с разными наборами данных и по случайности в тестах используются данные с которыми все отлично работает.

Соответствие кода проекта стандартам языка сводит к минимуму возможность возникновения трудно отлавливаемых ошибок. Например, лишние импорты моделей приложений в Django проекте могут привести к повторной регистрации сигналов, что вызовет множественную реакцию на действия с объектами соответствующищих моделей. Если используется IDE то большинство ошибок, допущенных по невнемательности можно отловить автоматически непосредственно при разработки. С помощью IDE можно автоматизировать отслеживание импортов библиотек, проверку соответсвия сигнатуры функций и методов классов, проверку соответсвия стандартам форматирования. Сторонние утилиты обычно предоставляют более подробные отчеты и используются для интеграции с системами автоматической сборки проекта и непрерывной интеграции. Также они могут дать количественную оценку качества проекта, которую можно использовать для оценки развития проекта.

Если вернуться к началу статьи, там приведен целый список того, что необходимо использовать для комплексной и объективной оценки. Постоянное использование в процессе разработки этих утилит займет достаточно большое количество времени и только отрицательно повлияет на процесс разработки. То есть их работу необходимо автоматизировать - программист должен одной командой запустить процедуру комплексной оценки качества своего кода и на выходе получить легко интепретируемый результат. Например, с помощью PyLint можно получить количественную оценку качества кода и можно взять за правило, что данная оценка должна быть не меньше определенного значения, тогда можно более объективно судить о качестве конкретного кода.

Для автоматизации можно использовать любой инструмент с которым вам удобней работать. Это может быть своея команда для управления Django проектом, bash скрипт, makefile, fabric или buildout. Автоматизируйте с их помощью процесс контроля качества кода один раз и используйте это во всех проектах.

Процесс непрерывной интеграции (CI) представляет из себя:

  1. сборку - построение окружения с установленным проектом и всеми зависимостями
  2. тестирование
  3. работа с отчетами - построение отчетов, работа с кодом по их результатам
  4. переход на стледующую итерацию

Процесс непрерывной интеграции осуществляется автоматически - сборка и тестирование происходит независимо от разработчиков, отчеты доступны в любое время всей команде. Для автоматизации CI существует масса ПО. Питер рекомендует использовать Hudson.

© 2010 Алексей Камедов

При копировании материалов блога ссылка на источник обязательна.