Опробовать разработку через тестирование
Прочитав этот пост, я чувствовал себя в том же положении, что и парень, который задал вопрос. Я люблю технологии, и придумываю новые идеи для решения проблем реального мира, я просто возбуждаю свои нейроны, но другая часть уравнения - на самом деле добиться цели (быстро) - обычно является проблемой в заднице, особенно когда я Я делаю это для себя.
Иногда мне просто скучно с кодом, а иногда я трачу больше времени, перемещая курсор в текстовом редакторе и глядя на свой код, пытаясь найти решение, которое лучше, чем то, которое у меня уже есть. Я слышал, что это болезнь называется перфекционизмом.
Я читал в том же посте (а также несколько раз здесь, на SO), что TDD на самом деле хорош, чтобы перестать кодировать, как девушка, однако я никогда не давал шансов на TDD - либо потому, что мне лень изучать / настраивать или потому что я не думаю, что мне это нужно, потому что я могу делать все необходимые мне анализы в своей голове.
- Вы также верите, что TDD действительно помогает GTD?
- Что мне нужно знать о TDD?
- А как насчет альтернатив TDD?
- Какова была бы лучшая методология для организации / разработки веб-приложения TDD?
- Какие библиотеки я должен использовать (если есть), чтобы облегчить мою жизнь?
PS: я в основном (но не исключительно) работаю с PHP здесь.
3 ответа
Лично я считаю, что TDD в лучшем случае является излишним, а в худшем - препятствием для творческого процесса программирования. Время, потраченное на кропотливое написание модульных тестов для каждого еще не написанного метода / класса, было бы лучше потрачено на решение исходной проблемы. При этом я большой поклонник юнит-тестов и искренне верю в них. Если у меня есть особенно сложный или проблемный фрагмент кода, я с радостью напишу 20 модульных тестов для одного метода, но, как правило, ПОСЛЕ того, как я решил проблему. TDD, как и любая другая парадигма программирования, не является серебряной пулей. Если это подходит вам использовать его, если не продолжать искать.
Но примите мое мнение с зерном соли. Гораздо более интересный поступает от Кента Бека. Насколько глубоки ваши юнит-тесты?,
Недавно я начал использовать "тонкие контроллеры толстых моделей" http://www.amitshah.in/php/controller-vs-model.html: добавление как можно большего количества кода в модель (и из вида / контроллера), насколько это возможно.,
Я использую PHPUnit (и поддержку Zend Framework для него), чтобы протестировать только несколько сложных моделей в моих веб-приложениях. Написание модульных тестов, которые тщательно проверяют двухстрочную функцию, которая выполняет простой запрос SQL, - это пустая трата времени, IMHO. За последние пару лет я стал ленивее и ленивее в написании тестов, и для большинства веб-приложений это не стоит того, потому что код такой простой.
Но в недавнем проекте (сайт электронной коммерции, который отслеживает уровень запасов по нескольким складам с составными продуктами), я начал делать тестирование в первую очередь, потому что я знал, что будет много тонкой сложности, которую я не мог держать в голове все однажды. Единственный способ, чтобы все работало так, как развивалось мое мышление, - это написать несколько тестов. С некоторыми частями казалось более естественным писать класс, чем тесты, другие части тестировались первыми, но другие части не нуждались в тестах, потому что они были тривиальными. TDD это инструмент, а не религия. Используйте это, когда это работает, остановитесь, если это не так.
Я вижу преимущество в TDD в уменьшении сложности и увеличении скорости (скорость, с которой я могу решать проблемы). Если я напишу несколько тестов, которые доказывают, что мой код работает, то, как только все тесты пройдут, я могу перейти к следующей проблеме. Это возвращает мне удовольствие от программирования.
Вы также верите, что TDD действительно помогает GTD? Моя самая большая проблема была просто неспособность проверить код. Это было слишком сложно. Наши основные библиотеки не были построены вокруг легко тестируемого интерфейса. Поэтому мы написали тесты для всего, что могли. В итоге мы закончили рефакторинг наших основных библиотек, чтобы облегчить жизнь. Кроме того, это изменение мышления, и я бы определенно рассмотрел вопрос о том, чтобы выделить больше времени на ваш первый проект TDD, просто чтобы устранить некоторые проблемы, которые могут возникнуть на этом пути.
Что мне нужно знать о TDD? TDD не является заменой методологии. Это выгодное дополнение или, по крайней мере, так должно быть. Если все сделано правильно, TDD значительно улучшает дизайн программного обеспечения. Это также действует как ваша внутренняя документация. Если вы хотите, чтобы кто-то посмотрел на ваш API и понял, как он работает, он может просто посмотреть на ваши хорошо названные сформированные тесты.
А как насчет альтернатив TDD? Как я уже сказал, я не считаю это заменой методологии. Существует альтернатива, и это не использовать его:)
Какова была бы лучшая методология для организации / разработки веб-приложения TDD? Мы были довольно успешны с Scrum/ Agile, если это то, что вы спрашиваете.
Какие библиотеки я должен использовать (если есть), чтобы облегчить мою жизнь? Мои знания PHP истекли 5 лет назад, и я позволю кому-то другому ответить на это.
В любом случае, только мои 2 цента. Если вы чувствуете, что читаете здесь, хороший обзор: http://www.agiledata.org/essays/tdd.html