Почему вам стоит начать вести разработку через тестирование

В нашей группе не один раз обсуждалась разработка через тестирование (test-driven development), и каждый раз в комментариях были в основном положительные отзывы от тех, кто применял эту методологию. Для тех, кто пропустил, собрали все доводы «за» в одной статье.

Напомните, что же вообще такое ваше «Test-Drive-Development»?

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

scheme

Звучит как-то странно. А это точно эффективно?

Судя по всему, да. Во-первых, это позволяет чётче понять, что, собственно, нужно писать. Есть условие, которое должно выполняться после работы кода — и точка. Сами тесты должны формироваться на основе технического задания. Если в результате написания тестов они начинают противоречить сами себе — это повод пересмотреть ТЗ.

Во-вторых, в результате разделения задач на менее объёмные подзадачи, код становится заметно проще и удобочитаемее. В идеале на один тест должно приходиться одно утверждение (assert). К тому же плохой в оформлении код (например, использующий глобальные переменные или синглтоны) обычно так же сложен в тестировании, что стимулирует разработчика его не писать.

В-третьих, сильно упрощается поддержка кода. Если в результате внесения новой функциональности или изменения старой какой-то участок кода начинает работать некорректно, это будет мгновенно выявлено. Вносить в код изменения гораздо легче, когда он разбит на модули (а TDD требует модульности программ). Инспектировать код, написанный по методологии TDD гораздо проще — каждый коммит выполняется для реализации чёткой задачи, которая будет отражена в комментарии к нему.

xkcd_1296_v6

Но мне кажется, что писать как обычно гораздо быстрее

Да, действительно, поначалу применение TDD будет отнимать лишнее время. Однако, это скорее дело привычки — со временем вы привыкнете писать сперва тесты, а лишь затем код и, возможно, будете даже выигрывать во времени, ведь процесс разработки будет чётко структурирован, вам придётся сначала решить вопрос «Что писать?», а лишь потом «Как писать?». К тому же, потратив время сейчас, вы выиграете время в будущем, сильно облегчив себе поддержку продукта.

Всегда ли имеет смысл использовать TDD?

Разумеется, нет. TDD не панацея. Например, если разработка представляет из себя последовательность экспериментов, когда нет чёткой уверенности в том, что именно необходимо в итоге, написание тестов станет скорее грузом, который тянет команду назад.

pravki

С чего же начать?

По разработке с упором на тестирование есть отличная книга Кента Бека — «Экстремальное программирование: разработка через тестирование». Начните читать её и следите за нашими публикациями, мы обязательно будем ещё писать на эту тему! 😉

Пётр Соковых, транслятор двоичного кода в русский язык