Надежное программное обеспечение может быть быстрым в реализации.

Тестирование программного обеспечения зачастую воспринимается клиентами как нечто усложняющее общий процесс, и как то, что имеет мало общего с настоящими потребностями обычных людей и удлиняет процесс разработки.

Программисты же обычно не пишут тесты, потому что нужно постоянно реализовывать новые функциональные возможности программы, а написание тестов требует дополнительного времени.

Из-за таких точек зрения возникает довольно типичная ситуация. Разработчики под давлением менеджмента, ругая управленцев, пишут код по 12 часов в сутки, и все же не успевают реализовать все потребности клиента, поскольку слишком часто все ломается. А заказчик давит на менеджмент со сроками конечного продукта и хочет, чтобы уже хоть что-нибудь было в нормальном работающем состоянии.

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

Однако для этой ситуации давно придумано решение. Это решение — написание тестов.

Давайте посмотрим на то, как тесты влияют на течение проектов и их успешность:

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

Однако, у этой идеи есть и свои потенциальные подводные камни.

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

Конечно для уменьшения влияния всех этих подводных камней на процесс разработки есть отдельный набор различных техник. Но в этой статье мы на нем останавливаться не будем (разберем это в других статьях).

Резюме: добавление тестов в процесс разработки, вероятно, замедлит поставку новой функциональности на непродолжительное время (обычно требуется не более месяца, для того, чтобы выстроить всю необходимую инфраструктуру кода для тестов), но принесет большую гибкость и скорость в будущем, увеличив при этом надежность программного обеспечения.