Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

воскресенье, 1 января 2012 г.

Test Driven Development: Что делать, если тест изначально зеленый?

Могу поделиться своим алгоритмом работы с тестами.

Значит так. Тесты в моей жизни, это способ понизить уровень стресса. Я балансирую на небольшом промежутке между добавлением теста, который избавит меня от беспокойства и удалением теста, который меня начал раздражать (хрупкий, нечитабельный - проблемный...)

Алгоритм прост как двери. Если я о чем-то беспокоюсь - я вношу это в TODO-список и на время успокаиваюсь. Позже я извлекаю заметку из TODO и проверяю свою гипотезу с помощью нового теста.

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

Неопределенность с изначально зеленым тестом устраняет удаление или изменение функциональности, от которой тест зависим. Алгоритм:
- я ломаю код (зная при этом как тест должен слететь);
- я запускаю все тесты (можно запускать только последний тест считая, что остальные скорее всего тоже полетят, но я запускаю все тесты потому, что так я одним выстрелом проверяю еще и другие тесты и фикс-поломку {она так же можно быть ошибочна})
- я убеждаюсь, что тест слетел так, как я того ожидал;
- я возвращаю все как было
- я снова запускаю тесты (мало ли не так откатился)
- я вижу зеленую полосу
- я успокаиваюсь, вычеркиваю из TODO волнушку и коммичусь.

Основная цель - устранить беспокойство - реализована.

Другой бы не парился по этому поводу - и ладно. Ну не было бы у него этого теста. Главное, чтобы я не парился на счет своего кода. Если мозг парится, то он делает ошибки и тупит. А я не хочу чтобы мой мозг тупил :)

Кто-то может сказать об избыточности - мол много тестов, которые тестируют одно и то же; много кода, который надо поддерживать; дублирование наконец! И я понимаю эту позицию. Что я делаю для этого? Я удаляю тесты. Но не сразу.

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

2) Этот тест меня достал и я регулярно об него спотыкаюсь. В таком случае я смотрю пункт (1) и если там все ок, то удаляю тест без угрызения совести. Если же там не все ок, я думаю что бы написать такого вместо текущего теста, чтобы и волки сыты и овцы целы. Естественно новый тест будет сразу зеленый, а потому я прибегну к алгоритму, описанному в этом посте немного выше и перепроверю тест.

С комментарием:
"если ты пишешь тест, который изначально зеленый, то на это есть только 2 причины: либо тест не нужен, либо ты не понимаешь свой код. Обе причины, скорее всего, при условии, что ты единственный творец кода, следствие того, что ты движешься слишком большими шагами (или сделал несколько больших шагов)"
согласен на 100%

Но давай немного переиграем. Представим две версии пространства-времени:
1) В одном я делаю большие шаги и имею на пути разработки ряд изначально зеленых тестов.

2) Во втором я делаю бы шажки более мелкими и каждый мой тест из списка предложенных был бы изначально красный.

Вероятно во втором измерении я напишу даже больше тестов чем в первом, потому что шажки маленькие. Но допустим, для простоты, что в обоих случаях количество тестов получится одинаковое.

И что тогда получается? Делаешь мелкие шажки и все 20 тестов валидные. Но если делаешь шаги побольше, то часть из тех же 20 тестов уже лишние (потому что они изначально зеленые).

Я бы так же рассмотрел такую штуку, как ожидание автора. Тут тоже можно поделить на две части:
1) Бывает так, ожидаешь, что тест пройдет и все равно его пишешь - просто осознаешь, что где-то сделал большой шаг и в будущем без этого теста рефакторить будет беспокойно. Пофиг, что он зеленый - мне без него будет не комфортно потом.

2) Бывает так же так, что вовсе не ждешь зеленой полосы, а тут она на тебя бумц! Имеем фидбек о том, что недостаточно знаем систему. Но что от этого? Тест не перестает быть тестом. Знал бы систему, сделал бы мельче шаг - был бы вынужден написать этот тест. И он бы остался...

При все при этом ценность - что ты при разработке чувствуешь и какой код получится в результате.

Как-то так.

2 комментария:

  1. Спасибо:) Момент про поломку - мой takeaway из предыдущего поста, а тут его развернул:)

    P.S. Вчера почему-то не постились комменты, сегодня спасибо и за вчерашний пост:)

    ОтветитьУдалить
  2. Спасибо за комментарий, Ваня. Задавай вопросы, а я с радостью развернуто на них отвечу. Заранее спасибо за вопросы. :)

    ОтветитьУдалить