Unit Testing - сколько еще времени это действительно добавляет?

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

Также некоторые последующие вопросы (точки коричневого цвета): Если вы выполняли проект клиента, который вы передали, когда закончили, стоит ли потратить время и силы на модульное тестирование?

Ответ 1

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

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

Ответ 2

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

Письменные тесты определенно медленнее, чем вообще писать тесты, если вы просто посчитаете время ввода кода. Однако, если у вас есть время для нарушения существующей функциональности - отладки-фиксации без безопасности тестов, преимущества, как правило, превышают затраты на что-либо, кроме тривиальных проектов. Тесты помогают вам с дизайном (TDD) + защита (регрессия) + документация (характеристики).

Это правда, особенно для новичков?

Это зависит. Перефразируя Бек (я думаю), если вы дурак, инструменты /meth не помогут вам, если вы кодирующий Бог, вы, вероятно, не нуждаетесь в них. Однако для большинства из нас в середине это помогает. По мере того, как вы двигаетесь направо по этому спектру, вы становитесь второстепенным для вас, вы должны "видеть", что происходит, и принятое время начинает уменьшаться (хотя и не до 0). Чтобы избежать ошибок новобранец, найдите того, кто уже был там (получите помощь из списка рассылки или нанял хорошего тренера на некоторое время).

Также некоторые последующие вопросы (точки коричневого цвета): если вы делали клиентский проект, который вы сдаете, когда закончите, стоит ли потратить время и силы на модульное тестирование?

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

Ответ 3

Нет, если вы используете TDD, потому что:

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

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

  • Затем запишите тесты для краевых случаев (если необходимо) и проверьте, будут ли проблемы.

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

Ответ 4

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

Ответ 5

Я думаю, это зависит от того, на какой уровень охвата вы нацеливаете

Если вы намерены следовать истинному определению TDD, где каждая строка кода проверена с помощью unit test случаев - вы можете искать огромные усилия

Но не обязательно, чтобы

Вы можете найти свой собственный баланс...

В моих переживаниях я не нашел, что это удваивает время, хотя оно добавляет фактор (20-25%?)

Я имею в виду - даже если у вас не было unit test случаев - вы все равно будете делать вручную unit test it-right?

За время проекта вы увидите, что время, затрачиваемое на случаи unit test, довольно легко откликается

Для клиентских проектов - IMHO да. Они, надеюсь, оценят усилия

Ответ 6

Я бы сказал, что время для написания автоматизированных модульных тестов зависит от вашего языка и от того, как вы делаете свое развитие. Например, написание С# с очень процедурным стилем может привести к сложным разработкам тестов. Однако, если вы придерживаетесь другого подхода, скажем, используя некоторые издевательства и рамки IOC, время тестирования модулей может быть значительно сокращено.

Ответ 7

По теме добавленного времени, поскольку вы упомянули, что вы новичок: чем раньше вы сможете найти набор модулей тестирования, соответствующий вашим потребностям, тем лучше. Вы не указали, какой язык вы используете, но если нет поддержки для отражения (например, C, С++), для настройки модулей тестирования обычно требуется намного больше времени, поскольку вам необходимо создать экземпляр TestSuite и Test, и вам нужно зарегистрировать тест и т.д. Чтобы все, что вам нужно, узнать все, что вы хотите сделать, это запустить несколько тестов!

С другой стороны, если вы используете более динамичный язык, такой как Python, например, вы можете в значительной степени настроить модульные тесты, практически не знакомые с модульным тестированием, создав несколько методов testXXX с помощью unittest.

Что касается второго вопроса, поставьте себя на место клиента - разве вы не хотели бы услышать, что продукт, который вы купили, был тщательно протестирован? Они (возможно) любят номера! Скажите им, что вы настроили автоматическое тестирование, было проведено более 500 индивидуальных тестов, более 80% кода было проверено таким образом - ну, только скажите им правду, но вы поняли суть. Это добавляет огромную ценность на пути доверия к коду, и, честно говоря, я предпочитаю заниматься бизнесом с кем-то, кто может продемонстрировать, что они знают, что было проверено и что может быть шелушащимся, а не тем, кто просто что-то мне вручает и говорит "это сделано".

Ответ 8

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

Я программировал этот путь долгое время, и что я использую эти тесты, чтобы помочь мне написать мой код в первую очередь. Учитывая, что время для написания тестов добавляет, в основном, ничего к моему общему времени разработки. Если я пропустил писать тесты, которые я делаю, это может "сэкономить" мне 10% моего времени в целом, если это.

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

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

Ответ 9

То, что вы тестируете, определит, сколько времени потребуется. Например, мне требуется намного больше времени, чтобы написать unit test для TSQL с использованием базы данных unit test из MS, чем потребовалось, чтобы написать хранимую процедуру, поскольку это очень ручной процесс для подготовки теста.

Но если я использую Eclipse или VS2008 для классов Java или С#, и я просто говорю, что это нужно для создания тестов, то довольно быстро выполнить тесты, так как большая часть работы grunt выполняется для меня.

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

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

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

Ответ 11

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