Должен ли я использовать TDD? - PullRequest
40 голосов
/ 27 мая 2009

Я единственный разработчик в моей (очень маленькой) компании, и я собираюсь начать работу с веб-приложением ASP.NET среднего размера для указанной компании.

Я пытаюсь выяснить, стоит ли мне изучать Test Driven Development (TDD) и реализовывать его в этом приложении.

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

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

Ответы [ 15 ]

40 голосов
/ 27 мая 2009

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

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

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

25 голосов
/ 27 мая 2009

Запомните: единственный плохой тест - тот, который вы не выполняете.

Теперь, вам нужно погрузиться прямо в TDD? Возможно, нет. Но вы обязательно должны начать модульное тестирование, сколько сможете. Вы не можете очень хорошо тестировать GUI, и это нормально - сохраните их для UAT.

Но какую-то логику, которую вы могли бы выполнить за кулисами? Да, вы должны проверить это.

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

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

14 голосов
/ 27 мая 2009

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

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

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

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

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

GUI-тестирование сложно, но не невозможно. Рассмотрим технологии тестирования веб-интерфейса, такие как Selenium, WebDriver и Watir, которые могут программно использовать веб-интерфейс. Этими инструментами тоже легко злоупотреблять, выполняя только дорогостоящее сквозное тестирование с их использованием. Гораздо лучший подход - абстрагировать ваш уровень пользовательского интерфейса, чтобы он мог тестироваться изолированно, независимо от вашей бизнес-логики. Вы не хотите, чтобы тестирование пользовательского интерфейса выполнялось и выполняло операции с базой данных.

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

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

10 голосов
/ 27 мая 2009

Обратите внимание, что TDD не о тестировании; это процесс развития. Тестирование не выполняется для замены функции тестирования - это то, что определяет процесс разработки.

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

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

6 голосов
/ 27 мая 2009

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

4 голосов
/ 27 мая 2009

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

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

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

4 голосов
/ 27 мая 2009

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

Мне понравилось все, чему я научился, и настоятельно рекомендую потратить время на изучение TDD.

-мое .02

3 голосов
/ 14 сентября 2009

Я хотел бы обобщить и прокомментировать некоторые из приведенных выше комментариев:

  1. Да, TDD - это дизайн. Речь идет не о тестировании.
  2. Не уверен, почему QA были связаны со стадией дизайна Джорджа. Похоже, они указали автоматизированные тесты. Как отметил Тим, это процесс разработки.
  3. Кевин, ты сказал "пропусти тестирование". Еще раз. TDD - это дизайн, а не тестирование. ОК. Вы можете пропустить дизайн, но готовое приложение будет глючным и не будет работать.
  4. Рошан упомянул: «Исполняемая спецификация того, что должен делать ваш компонент». Это означает, что полностью обновленная документация. Когда вы новичок в проекте, вы можете очень быстро освоиться, вы можете точно увидеть, что задумал первоначальный разработчик. И, как упоминал Джон, вы можете внести изменения в код и убедиться, что ничего не сломано.
3 голосов
/ 27 мая 2009

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

1 голос
/ 01 июня 2009

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

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

Вот пример каждого ...

Выгодно: работа над решением, которое было довольно сложным, имело много зависимостей и вариаций и постоянно развивалось. Разработка с учетом тестирования и наличие регрессионного набора модульных тестов позволили нам быстро адаптироваться к изменениям и иметь возможность реорганизовать код для повышения удобства сопровождения. Мы использовали правило 80/20 при создании модульных тестов и исключили тестовые наборы с низким значением.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...