Как научиться Test Driven Development вместо Test First Development?

Здравствуйте. Меня зовут Игорь и я алкоголик имею проблемы с TDD уже не один год. Как и многие другие разработчики, у кого есть проблемы с TDD, я постоянно делаю одни и те же ошибки:

— Наивный Test First подход. Вместо того, чтобы писать юнит-тест параллельно тестируемому коду с разницей в один шаг, я часто пишу набор тестов, для метода, а потом уже — реализацию самого метода. Это не TDD, а Test First. Гадость.

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

— Я никак не могу увидеть в таком, извращённом, TDD много смысла. Invertion of Control я могу применить только в тот момент, когда выявлена необходимость в нём, а не тогда, когда надо проектировать типы.

— Я срываюсь. Да, все мы, делающие это неправильно, рано или поздно бросаем, потому что это невыносимо. Нет почти никакого смысла в Test First (извините за резкость).


Вопросы:

— Так как же научиться правильному TDD, который даёт цветёт, благоухает и даёт плоды? Есть ли где-то толковые руководства, а лучше достаточно большие практические примеры и задачки, нацеленные именно на обучение сему делу?

— А какие ещё бывают типичные, по вашему мнению, ошибки в попытках делать TDD?


Очень спасибо. С надеждой на исцеление, Игорь.
  • Вопрос задан
  • 5387 просмотров
Пригласить эксперта
Ответы на вопрос 1
pletinsky
@pletinsky
Я тоже иногда использую описанный вами подход — и он не кажется мне плохим или бессмысленным. Очень часто он оказывается эффективным — например, когда требуется писать интеграционные тесты на готовый функционал.

Материалы я думаю вы без труда найдете — их завались по этой теме.
На мой взгляд самое главное следующее — для TDD требуется особый подход к мышлению во время написания кода. И именно этот подход делает его эффективным. Заключается он в том, что вы не пытаетесь полностью выстроить в голове работающий метод, который создаете. Вместо этого вы выделяете отдельные бизнес составляющие метода — и создаете их поэтапно.

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

Например вы делаете метод который вычисляет корень из числа… Напишите простой тест подавая туда число 4 и ожидая что на выходе будет 2. Далее имплеминтируете функционал добиваясь чтобы тест прошел.
Но ничего лишнего там писать не стоит. Потом пишите следующий тест например на реакцию на отрицательные значение — далее имплементируете функционал. И так далее.

То есть это метод мышления. Самому к этому прийти не получится — самый лучший вариант — нанять человека который уже это умеет и научится сидя с ним в паре. Если это не возможно — попытайтесь понять стиль такого кодирования использую пособия на реальных ситуациях вроде этого.

Вот тут описаны проблемы при использовании подхода.

TDD — это не метод тестирования — а метод разработки. Он требует архитектурной готовности системы.
При тестировании модуля (например метода или класса) обязательно избавьтесь от всех внешних зависимостей путем мокирования.
Лучше ввести это как жесткое правило — потому, что оставлять такие зависимости можно только в редких случаях и когда вы уже прошарены в теме и что называется знаете — где правила можно нарушать.

Не ленитесь разрабатывать по шаблону — соблюдая мельчайшие и даже самые странные правила — даже если вы видите потерю эффективности — и со временем вы научитесь применять данный инструмент.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы