Изначально я планировал написать статью о тестировании yii приложения. Когда я говорю про тестирование, я подразумеваю автоматические тесты. Размышляя над содержанием статьи, я пришел к выводу, что полезнее будет разобраться для чего нужно тестировать приложение, почему я решился внедрять автоматическое тестирование.
Очень много проектов работают и развиваются без автоматических тестов и даже отдельных тестировщиков. Поэтому мне кажется, что тестирование - это вопрос стиля программирования и бизнес требований. Само по себе успешное прохождение автоматического тестирования не говорит о том что программа работает верно. Оно говорит лишь о том, что при нужных входных условиях программа ведет себя точно так как предполагалось. Но если посмотреть на развитие php за последние 5 - 10 лет, то можно увидеть, что огромный объем работы был выполнен для того, чтобы тестирование приложения стало более комфортным.
Причина этого лежит в смене парадигмы программирования: доминирующим стал подход в рамках которого программа бьется на много независимых компонент, каждый компонент обновляется отдельно и как можно чаще. Если у вас возникает ошибка после обновления компонент, то вы можете остаться на старой версии и подождать пока ошибка будет исправлена. При таком подходе к разработке ручная проверка системы становится крайне неэффективной: на проверку начинает уходить больше времени чем на саму разработку. Для такого стиля работы автоматическое тестирование, как прохождение контрольных точек, становится спасением.
Еще один вариант когда тестирование становится крайне полезным - это рефакторинг. Когда мы рефакторим код, мы ожидаем, что поведение системы останется прежним. Любое отклонение от старого поведения означает, что была допущена ошибка либо в изначальном коде, либо в измененном. Кроме этого автоматическое тестирование помогает бороться со сложностью проекта: зачастую меняя код, мы не можем абсолютно точно указать, какие разделы программы, так же потребуют соответствующих изменений (Я предполагаю, что это свидетельствует о плохой продуманности архитектуры программы, но не отменяет сам факт такого поведения).
Кроме ппрочего автоматическое тестирование способно снизить груз психологической ответственности лежащий на разработчике. В книгах всегда описывают идельная архитектура, но, в реальности, у каждого продукта бывают какие-либо нетривиальные зависимости между модулями. При этом разработка сложного продукта, в которой участвуют много человек, подводит к тому, что достаточно сложно всегда учесть все зависимости. Прохождение тестов способно сказать, что в программе нет каких либо явных ошибок, так что код и его результаты можно показать другим людям.
Совокупность этих факторов привела меня к тому, что я начал покрыть код тестами. Само собой изначально эта работа кажется абсолютно неблагодарной и бесполезной. Но по прошествию двух недель, я вижу, если не снижение количества ошибок, то уменьшение времени на выявление и исправление ошибок.