Test-driven development
May. 7th, 2007 10:26 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Люди любят удивляться этой идейке, мол, красиво, да, но я так не могу, мне сначала код надо написать да поотлаживать.
А я поставил опыт на себе - написать код, и не отлаживать его, а всё через тесты прогнать. Так, чтобы вообще не трассировать никакое поведение, а просто смотреть, какие тесты рухнули, и если они не дают достаточно информации, то модифицировать код и тесты.
Что получается. Код должен состоять из мелких очевидных операций. Как на картинке. Чтобы тест был тоже элементарным. И если код что-то компилирует (тссс, да, у меня и компилятор внутре имеется - Ватсон знает, о чем речь), так два теста нужно: один на фазу компиляции, другой - на фазу исполнения компилированного участка.
В идеале чтобы пальцем тыкать, если при рефакторинге что-то сломалось: "вот тут у тебя не работает". Просто из логов чтобы видно было.
А я поставил опыт на себе - написать код, и не отлаживать его, а всё через тесты прогнать. Так, чтобы вообще не трассировать никакое поведение, а просто смотреть, какие тесты рухнули, и если они не дают достаточно информации, то модифицировать код и тесты.
Что получается. Код должен состоять из мелких очевидных операций. Как на картинке. Чтобы тест был тоже элементарным. И если код что-то компилирует (тссс, да, у меня и компилятор внутре имеется - Ватсон знает, о чем речь), так два теста нужно: один на фазу компиляции, другой - на фазу исполнения компилированного участка.
В идеале чтобы пальцем тыкать, если при рефакторинге что-то сломалось: "вот тут у тебя не работает". Просто из логов чтобы видно было.
no subject
Date: 2007-05-08 08:50 am (UTC)no subject
Date: 2007-05-08 10:28 am (UTC)Еще раз повторю, мне нравятся unit тесты, но это не Silver bullet :).
no subject
Date: 2007-05-08 10:56 am (UTC)Прототип - если это то, что будет спущено в канализацию сразу по использовании без попыток повторного использования кода в непрототипе и при этом достаточно мелок, чтобы уместиться в одной голове, - в юнит-тестах действительно не нуждается. Детские куличики тоже не нуждаются в контроле качества.
Но как только пошёл код, имеющий шанс попасть в продакшн - юнит-тесты окупаются хотя бы тем, что если их нет изначально, то переделка кода под них скорее всего будет выглядеть настолько дорого, что утопит всю идею юнит-тестирования.
no subject
Date: 2007-05-08 04:30 pm (UTC)Почему такое ироничное отношение к стартовым версиям продуктов? Любая сложная система начиналась с такого вот куличика.
Шансы кода попасть в продакшн - по сути вероятность, она растет с приближением финиша проекта. Предсказать попадание туда какого-либо кода однозначно нельзя. Какие особенные переделки требуются в нормальной архитектуре, чтобы к ней можно было применить юнит-тестирование? Переделки потребуются если почти вся функцинальность сосредоточена в нескольких громадных классах с громадными методами - ну так это плохой дизайн, и даже без расчета на последующее юнит-тестирование не следует такую архитектуру использовать.
no subject
Date: 2007-05-08 02:32 pm (UTC)Затягивание же фаз разработки продукта... Мой опыт показывает, что всё фигня. Когда готово, тогда и готово. Главное - процесс и удовольствие от него.
no subject
Date: 2007-05-08 03:37 pm (UTC)А, вот еще есть проблема с тестированием вещей, которые сильно завязаны на остальную инфраструктуру. То есть, если есть класс, который пользуется тремя другими сложными классами, то для тестирования ему приходится подсовывать специально изготовленные тестовые имитации этих трех других классов. Тут стоимость сразу подскакивает не в два раза, а больше (ну, зато в простых случаях все проще, и среднее получается всего раза в 2-3).
no subject
Date: 2007-05-08 04:48 pm (UTC)Затягивание момент неоднозначный. Мне как исполнителю конечно удобно быть не иметь временных ограничений, но удобство заканчивается, когда надо что-нибудь поручить или заказать - ожидать выполнения критичного задания неделями совершенно неприемлимо. Иногда у качества слишком дорогая цена.
no subject
Date: 2007-05-08 10:59 am (UTC)Затем сделаем то же самое для п.2.
Затем сделаем то же самое для п.3.
Будем?
Или пустая трата времени?
no subject
Date: 2007-05-08 04:36 pm (UTC)