TDD - это компромисс «плати мне сейчас или плати позже». Если вы только отсчитываете время от начала кодирования до проверки в своем коде, то TDD часто занимает больше времени, особенно при первом изучении TDD. Окупаемость наступает позже на этапе тестирования, а также в будущих циклах кодирования.
Для фазы тестирования я обнаружил, что с TDD:
- У меня было значительно меньше ошибок. В моем последнем коде TDD у меня были ошибки только из-за недопонимания требований (или изменений) или из-за областей, в которых я не смог принести тестируемый код (в данном случае PHP-код).
- Ошибки, которые у меня были, как правило, было легче воспроизвести при тестировании, потому что я уже получил тестируемую систему.
- Исправление ошибок происходило быстрее, и с помощью тестов я мог поверить, что я не представил новых ошибок.
Сам код имел следующие свойства:
Когда я начал думать, как клиент кода, код, как правило, был проще в использовании. (Это одно из преимуществ написания тестов первым.)
Код легче проверить.
Написание модульных тестов проще (и во многих случаях веселее) как раз перед, а не после, поэтому пишется больше тестов.
Код легче реорганизовать и очистить. Это было особенно верно для Python, где инструментам автоматического рефакторинга приходится труднее.
Из-за этого, когда пришло время пересмотреть код, его было легче понять и легче изменить, плюс у нас уже было по крайней мере несколько регрессионных тестов.
Это означает, что срок окупаемости TDD может составлять месяцев позже. Кроме того, запуск TDD с унаследованным кодом особенно сложен. Затем нужно время, чтобы научиться писать хорошие тесты (плохой набор тестов может быть либо недостаточным, либо, что еще хуже, хрупким, усложняющим, а не облегчающим проведение рефакторингов), а также как тестировать сложную систему.
Я должен признать, что мне не удалось заставить слишком много других людей переключиться на TDD. Я думаю, что я во многом переключился, потому что я хотел более простой способ тестирования, а также у меня была возможность научиться этому с небольшой базой кода и личным проектом.