Подтвердить что ты не робот

Является ли модульное тестирование плохой идеей во время бета/прототипирования?

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

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

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

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

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

4b9b3361

Ответ 1

Короткий ответ: TDD очень ценен для бета-версий, но может быть менее полезен для прототипирования.

Я думаю, что очень важно различать бета-версии и прототипирование.

Бета-версия beta, по сути, является рабочей версией, которая только находится в разработке, поэтому вам обязательно следует использовать TDD в этом сценарии.

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

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

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

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

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

Лично я считаю, что модульное тестирование новой технологии является отличным инструментом обучения.

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

Книга xUnit Test Patterns описывает сверхспецифический тестовый антипаттерн и предоставляет множество рекомендаций и шаблонов, которые могут помочь вам написать более поддерживаемые тесты.

Ответ 2

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

Проверьте, что нужно тестировать, а не строку кода. Когда вы выясните, что это такое, дайте мне знать.

Ответ 3

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

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

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

Ответ 4

Кто-нибудь из вас также обнаружил, что TDD может быть проблемой, если вы прототипируете что-то/создаете бета-версию?

У меня есть.. Тонны раз:)

Разве TDD гораздо более естественно сочетается с чем-то, где спецификации более фиксированы или где разработчики имеют больше опыта в языке и технологиях?

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

Или я сделал что-то принципиально неправильное?

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

Ответ 5

"Однако со временем эти постоянные изменения в дизайне, по-видимому, означали, что я проводил намного больше времени, меняя свои тесты, чем я сам писал сам код"

Хорошо. Вы должны потратить много времени на тестирование. Это важно, и как вы демонстрируете, что ваш код прав. "Меньше кода, чем тест" является хорошим эталоном.

Это означает, что вы пишете эффективные тесты, которые продемонстрировали ваши ожидания в отношении базовой технологии.

Возможно, вам захочется сделать это.

  • Некоторые тесты являются "существенными" или "основными" или "прочными" функциями приложения независимо от любых технологических решений. Сфокусируйтесь на них. Это никогда не должно меняться.

  • Некоторые тесты подтверждают выбор технологии или реализации. Они все время меняются. Возможно, вы должны выделить их так, чтобы изменения в технологии приводили к целенаправленным изменениям здесь.

Ответ 6

  • Дать дорожную карту с движущимся X разочаровывает. TDD или нет TDD.. "вынуждены проводить большую часть времени, изменяя тесты вместо кода", указывает либо на то, что спецификации были изменены радикально, либо вы просто перехитрили себя a.k.a "хрупкие тесты". Мне нужно больше информации от вас, чтобы комментировать дальше.
  • Спайк/Прототипирование означает попытку построить что-то в качестве доказательства концепции или проверки дизайна. С этим определением я бы сказал, что вам не нужно TDD вашего прото, потому что ваша основная цель - изучать/уменьшать неизвестные. Как только вы это сделаете, вы должны выбросить свой прото и создать свою производственную версию с помощью автоматических тестов (теперь используйте TDD). Вы отправляете их клиенту, а не "проверенные прототипы".
  • Однако, если ручное тестирование работает хорошо для вас, продолжайте с ним. Мне нравится доказывать себе и другим, что мой код работает при нажатии кнопки - избегайте человеческой скуки повторяющихся задач и тщательно анализируйте.

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

Ответ 7

Прототипирование предназначено для использования в качестве "Будет ли это работать". -exploration.
Таким образом, нет необходимости в тестировании. НО! Всегда отбрасывайте прототип и код из нуля!

Ответ 8

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

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

Ответ 9

У меня нет рецепта для вас, но у меня есть диагноз:

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

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

Ответ 10

Что я обычно делаю для этого кода прототипирования, так это пишу его без тестов (или не многих), но делаю работу под моим src/test/java или там, где я помещаю свой тестовый код. Таким образом, я не буду случайно запускать его в производство. Если у меня есть что-то, что мне нравится, то я создам что-то в src/main/java (мой программный код) и TDD, вытягивая код из прототипа по одному фрагменту за раз, когда я добавляю тесты.

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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

Таким образом, я могу проверить предположения (что происходит, когда я сохраняю пустую строку в базе данных? DB2 вернет пустую строку, Oracle вернет NULL) и убедитесь, что они не меняются во время работы над прототипом.

Подумайте об этой работе, как и многие крошечные прототипы, которые влились в пару модульных тестов.

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

Ответ 14

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

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

Ответ 15

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

В JavaOne на TDD была хорошая презентация. Одним из очень приятных результатов было то, что вы, как правило, хорошо понимали свои фактические требования, намного лучше, когда вам приходилось отвечать на тесты, чтобы удовлетворить их. Это в дополнение ко всем преимуществам рефакторинга и качества кода, которые пришли вместе с подходом.