Привет!
Нашел просто потрясающий философский
рассказ о unit-тестировании. На русском не было — решил перевести
.
В мае 2006 года, плохо подготовленная экспедиция в Гималаи сбилась с пути. После двух недель скитаний, страдая от голода, жажды и озонируя воздух, как может его озонировать группа затерявшихся на две недели неопытных путешественников, наши страдальцы оказались у входа в древнюю пещеру.
В пещере они увидели лабиринт боксов (cubicles, кабинок). В каждом боксе был деревянный стол, эргономически правильное бамбуковое кресло, календарь Дилберта и странное компьютеро-подобное механическое устройство. В одном углу офиса они нашли запасы темной жидкости (позже определенной как ранние примеры газированного напитка с высоким содержанием кофеина) и стол для пинг-понга. Путешественники поняли, что пещера была древним софтверным стартапом. Самым древним. Древнее даже чем Netscape...
Среди прочих замечательных вещей они нашли нечто потрясающее: записку, оставленную одним из программистов. Гид экспедиции, будучи не очень хорошим гидом, знал как читать древний язык и перевел записку:
Мы выкатили релиз раньше срока, как обычно. Все тесты проходят, так что в оставшуюся неделю мы решили отдохнуть. Собираемся в морское путешествие. Поскольку это занятие по тим-билдингу, мы надеемся что получим возмещение расходов.
Путешественники смотрели друг на друга в полном недоумении. Они не только открыли самый древний софтверный стартап в истории, но еще и команду разработчиков, которая оказывается релизилась впереди расписания на постоянной основе!
Каков был секрет древних программистов? И что с ними случилось? Путешественники обрыскали каждый бокс в поисках зацепок и нашли две заношенные брошюры. Одна из них называлась "Научись путешествовать по морю за 30 минут", что объясняло судьбу программистов. Вы держите в руках перевод второй брошюры "Путь Тестивуса". Кто написал ее? Что такое Тестивус? Одному Гуглу известно наверняка...
Объясняет ли содержимое этого текста успехи древних программистов? Нельзя сказать точно, но мы верим, что их потрясающая доблесть обязана комбинации философии Тестивуса и приему в больших количествах темной жидкости с кофеином, найденной в пещере.
Прочитайте брошюру и сделайте свои выводы.
Alberto Savoia, CTO/Cofounder of Agitar Software
Апрель 2007, Mountain View, Calif.
Ученик спросил мастера-программиста:
"Когда я могу перестать писать тесты?"
Мастер ответил:
"Когда ты перестаешь писать код"
Ученик спросил:
"Когда я перестаю писать код?"
Мастер ответил:
"Когда ты становишься менеджером"
Ученик задрожал и спросил:
"Когда я становлюсь менеджером?"
Мастер ответил:
"Когда ты перестаешь писать тесты"
Ученик побежал писать тесты.
Остались только следы.
Если код заслуживает быть написанным, он заслуживает иметь тесты.
Догма говорит:
"Делай это.
Делай только это.
Делай это только так.
И делай это потому, что я тебе говорю."
Догма не гибкая. Тестированию нужна гибкость.
Догма убивает творчество. Тестированию нужно творчество.
Карма говорит:
"Делай хорошие вещи, и хорошие вещи произойдут с тобой.
Делай их так, как ты знаешь.
Делай их так, как тебе нравится."
Карма гибка. Тестированию нужна гибкость
Карма процветает на творчестве. Тестированию нужно творчество.
Когда пишешь код, думай о тесте.
Когда пишешь тест, думай о коде.
Когда ты думаешь о коде и тесте как о едином,
тестирование просто, а код красив.
Ученик спросил великого мастера программирования Летящего Пера:
"Что превращает тест в юнит тест?"
Великий мастер программирования ответил:
"Если он обращается к базе, значит он не юнит тест.
Если он обращается к сети, значит он не юнит тест.
Если он обращается к файловой системе, значит он не юнит тест.
Если он не может выполняться одновременно с другими тестами, значит он не юнит тест.
Если ты должен делать что-то с окружением, чтобы выполнить тест, значит он не юнит тест."
Другой мастер программист присоединился и начал возражать.
"Извините, что я спросил", — сказал ученик.
Позже ночью он получил записку от величайшего мастера программиста. Записка гласила:
"Ответ великого мастера Летящего Пера прекрасный ориентир.
Следуй ему, и в большинстве случаев не пожалеешь.
Но не стоит застревать на догме.
Пиши тест, который должен быть написан."
Ученик спал хорошо.
Мастера все еще продолжали спорить глубокой ночью.
Твой код — как глина.
Пока она свежая — она мягкая и податливая.
Со временем она становится твердой и хрупкой.
Если ты пишешь тесты, пока код свежий и легко изменяемый —
тестирование будет проще, а код вместе с тестами будет прочнее.
Запускай тесты часто.
Не позволяй им застаиваться.
Радуйся, когда они проходят.
Радуйся, когда они не проходят.
Лучшее — враг хорошего.
Не жди лучшего чтобы сделать лучше.
Не жди лучшего чтобы сделать хорошо.
Напиши тест, какой сможешь, сегодня.
Когда код ужасен — тесты могут быть ужасны.
Ты не любишь писать ужасные тесты,
Но ужасный код нуждается в тестах больше всего.
Не разрешай ужасному коду отговорить тебя писать тесты,
Но позволь ужасному коду отговорить тебя писать ужасный код в будущем
Ученик спросил двух мастеров программистов:
"Я не могу написать этот код без создания моков и нарушения инкапсуляции.
Что мне делать?"
Один мастер программист ответил:
"Моки — это плохо, и ты никогда не должен нарушать инкапсуляцию.
Перепиши код, чтобы можно было тестировать правильно."
Другой мастер ответил:
"Моки — это хорошо, и тестирование важнее инкапсуляции."
Обескураженный ученик ушел за пивом. В местной пивной он встретил
Величайшего мастера программиста посасывающего пивко с куриными крылышками.
"Величайший мастер!" — сказал ученик, —
"Я думал, что вы не пьете.
И разве вы не вегетарианец?"
Величайший мастер улыбнулся и ответил:
"Иногда жажда лучше утоляется пивом, а голод — куриными крылышками".
Ученик больше не был обескуражен.
Фермер без плуга — плохой фермер.
Счетовод без абака — плохой счетовод.
Некоторые задачи лучше выполняются голыми руками.
А некоторые — инструментами.
Нет ничего благородного делать что-то руками,
что может быть лучше сделано с инструментом.
Не разумно использовать голову там, где она не нужна.
Ученик подошел к мастеру программисту и сказал:
"Все мои тесты всегда проходят. Не заслуживаю ли я повышения?"
Мастер отвесил леща ученику и ответил:
"Если все твои тест всегда проходят, тебе стоит лучше писать тесты"
С красной шеей пошел ученик жаловаться в HR.
Но это уже другая история...
Если пишешь код — пиши тесты
Не застряньте в догме юнит тестирования
Примите карму юнит тестов
Думай о коде и тестах как о едином
Тест важнее, чем юнит
Тестируй, пока свежо
Тесты без запуска — пустая трата времени
Несовершенный тест сегодня лучше совершенного теста когда-нибудь
Ужасный тест лучше чем никакой
Иногда тест оправдывает средство
Только дураки обходятся без инструментов
Хороший тест падает