Почему я должен использовать разработку, основанную на тестировании?[дубликат]

StackOverflow https://stackoverflow.com/questions/804569

  •  03-07-2019
  •  | 
  •  

Вопрос

Дублировать:

Для разработчика, который не знает о разработке на основе тестирования, какие проблемы будут решены путем внедрения TDD?

[РЕДАКТИРОВАТЬ] Давайте предположим, что разработчик уже (ab) использует платформу модульного тестирования.

Это было полезно?

Решение

Вот три причины, по которым TDD может помочь разработчику / команде:

  • Лучшее понимание того, что вы собираетесь написать
  • Немного лучше обеспечивает соблюдение политики написания тестов
  • Ускоряет разработку

Одна из причин для написания тестов в первую очередь заключается в том, чтобы лучше понять фактический код, прежде чем вы его напишете.Для меня это главное преимущество разработки, основанной на тестировании.Когда вы сначала пишете тестовые примеры, вы более критически относитесь к угловым примерам.Тогда вам будет легче обратиться к ним, когда вы напишете код и убедитесь, что они точны.

Другая причина заключается в том, чтобы фактически принудить к написанию тестов.Часто, когда люди проводят модульное тестирование без TDD, они настраивают платформу тестирования, пишут какой-то новый код, а затем завершают работу.Они думают, что код и так работает просто отлично, так зачем же писать тесты?Это достаточно просто, чтобы он не сломался, верно?Но теперь вы вообще потеряли преимущества выполнения модульных тестов (совершенно другое обсуждение).Напишите их первыми, и они уже там.

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

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

Другие советы

Предположительно, вы тестируете написанный вами код перед тем, как поместить его в репозиторий.

Если это неправда, вам нужно решить другие проблемы.

Если это правда, вы можете рассмотреть написание тестов с использованием фреймворка как способ автоматизации тех основных подпрограмм или драйверов, которые вы в данный момент пишете, чтобы вы могли запускать их все автоматически одним нажатием кнопки.Вам не нужно просматривать выходные данные, чтобы решить, прошел тест или нет;вы встраиваете информацию об успехе или неудаче теста в код и сразу же принимаете взвешенное решение.Одновременный запуск всех тестов снижает вероятность возникновения ситуации "подловить крота", когда вы что-то исправляете в одном классе и ломаете что-то еще.Нужно пройти все тесты.

Пока звучит неплохо, да?

Ребята из TDD просто делают еще один шаг вперед, требуя, чтобы вы сначала написали тест, прежде чем писать класс.Конечно, это не удается, потому что вы не написали класс.Это их способ гарантировать, что вы будете писать тестовые классы.

Если вы уже используете тестовый фреймворк, получаете хорошую отдачу от написанных вами тестов и имеете значимое покрытие кода примерно на 70%, то я думаю, у вас все хорошо.Я не уверен, что TDD принесет вам гораздо больше пользы.Вам решать, пройдете ли вы эту лишнюю милю или нет.Лично я этого не делаю.Я пишу тесты после окончания класса и выполняю рефакторинг, если чувствую необходимость.Некоторые люди могли бы счесть полезным сначала написать тест, зная, что он провалится, но я этого не делаю.

(Это скорее комментарий, согласующийся с ответом даффимо, чем ответ сам по себе.)

даффимо отвечает:

Ребята из TDD просто делают еще один шаг вперед, требуя, чтобы вы сначала написали тест, прежде чем писать класс.Конечно, это не удается, потому что вы не написали класс.Это их способ гарантировать, что вы будете писать тестовые классы.

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

Это все то, о чем я обычно думаю, поэтому, как и вы, "сначала протестируйте" мало что добавляет, для меня.И, честно говоря (я знаю, что в некоторых кругах это ересь) Мне нравится "закреплять" основные идеи класса, сначала набрасывая общий интерфейс;таким образом, я могу посмотреть на это, мысленно использовать и посмотреть, действительно ли это так чисто, как я думал.(Класс или библиотека должны быть простыми и интуитивно понятными в использовании клиентскими программистами.)

Другими словами, я делаю то, что TDD пытается обеспечить, сначала написав тесты, но, как и duffymo, я добиваюсь этого другим способом.

И реальный смысл "сначала протестируйте" в том, чтобы заставить программиста сделать паузу и подумать как дизайнера.Глупо делать фетиш из того, как программист входит в это состояние;для тех, у кого это не получается естественно, "сначала тест" служит ритуалом, помогающим им достичь цели.Для тех, кто это делает, "сначала протестируйте" мало что добавляет - и это может помешать программисту привычным способом войти в это состояние.

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

Обратите внимание, что я не говорю, что код не должен тестироваться.Так и должно быть.Это дает нам подстраховку, которая, в свою очередь, позволяет нам сконцентрировать наше внимание на написании хорошего кода, даже дерзкий код, потому что мы знаем, что сеть существует для того, чтобы отлавливать ошибки.

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

* Чтобы быть экуменичным, я отмечу, что и католики, и мусульмане пользуются четками.И опять же, это механический, мышечная память - способ привести себя в определенное состояние ума.Это фетиш (в первоначальном смысле магический предмет, а не "сексуальный фетиш") или талисман на удачу.Как и произнесение "Ом мани падме хум", или сидячая дзадзен, или поглаживание "удачливой" кроличьей лапки (кролику повезло меньше). Философ Джерри Фодор, размышляя о трудных проблемах, придерживается аналогичного ритуала:он повторяет про себя: "Давай, Джерри, ты можешь это сделать!" (Я тоже пробовал это, но поскольку меня зовут не Джерри, у меня это не сработало.;) )

В идеале:

Вы не будете тратить время на написание функций, которые вам не нужны.У вас будет полный набор модульных тестов, который послужит подстраховкой при рефакторинге.У вас будут исполняемые примеры того, как предполагается использовать ваш код.Ваш процесс разработки будет более плавным и быстрым;вы будете тратить меньше времени на работу с отладчиком.

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

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

Я обнаружил, что это отличный способ ознакомиться с документами, предъявляющими требования.Мне приходится думать о поведении , описанном в них , гораздо интенсивнее , чем если бы я просто читал их .Как следствие, я нахожу в них еще много несоответствий и пробелов, которые в противном случае я обнаружил бы только во время реализации.Таким образом, я могу попросить разъяснений раньше и получить лучшие требования, когда начну внедрять.

Затем, во время реализации, тесты - это способ измерить, как далеко мне еще предстоит зайти.И они не дают мне ничего забыть (не смейтесь, это настоящая проблема, когда вы работаете над более масштабными вариантами использования).

А мораль такова:даже если ваш процесс разработки на самом деле не поддерживает TDD, это все равно можно сделать определенным образом и повысить качество и производительность.

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

1) Поговорите с клиентом о том, что должно делать приложение и как оно должно реагировать на различные ситуации.

2) Переведите результаты 1) в модульные тесты, каждый из которых тестирует одну функцию или сценарий.

3) Напишите простой, "неаккуратный" код, который (с трудом) проходит тесты.Когда это будет сделано, вы оправдаете ожидания вашего клиента.

4) Реорганизуйте код, который вы написали в 3) до тех пор, пока не решите, что сделали это наиболее эффективным из возможных способов.

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

И, как говорили другие, каждый раз, когда вы запускаете свои тесты, вы гарантируете, что старый код все еще работает и что вы можете добавлять новые функциональные возможности, не нарушая работу старого.

Большинство людей, с которыми я разговаривал, не используют полную модель TDD.Обычно они находят наилучшую модель тестирования, которая подходит именно им.Поиграйте с TDD и определите, где вы наиболее продуктивны.

Я приложил большие усилия, чтобы изучить TDD для разработки на Ruby on Rails.Прошло несколько дней, прежде чем я по-настоящему вник в суть дела.Я был настроен очень скептически, но приложил усилия, потому что программисты, которых я уважаю, поддерживают это.

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

TDD (разработка/ проектирование на основе тестирования) обеспечивает следующие преимущества

  • гарантирует, что вы узнаете критерии принятия карточки с историей до того, как начнете
  • гарантирует, что вы знаете, когда следует прекратить кодирование (т. е. когда критерии приемлемости выполнены, что предотвращает повторное использование).

В результате вы получаете код, который является

  1. поддающийся проверке
  2. чистый дизайн
  3. способен с уверенностью подвергаться рефакторингу
  4. минимальный код, необходимый для соответствия карточке истории
  5. живая спецификация того, как работает код
  6. способен поддерживать устойчивый темп внедрения новых функций

Общеизвестно, что написание тестов и наличие большого количества автоматизированных тестов - это хорошо.

Однако без TDD это часто просто становится утомительным.Люди пишут тесты, а затем оставляют их, и тесты не обновляются должным образом, и новые функции также не тестируются так часто, как следовало бы.

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

Здесь есть много преимуществ:

  • Более высокое качество кода
  • Меньше ошибок
  • Меньше потраченного впустую времени

Любое из них само по себе было бы достаточным основанием для внедрения TDD.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top