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

Есть ли такая вещь, как слишком много модульных испытаний?

Я пробовал просматривать все страницы об модульных тестах и ​​не мог найти этот вопрос. Если это дубликат, сообщите мне, и я удалю его.

Недавно мне было поручено выполнить модульное тестирование в моей компании. Я понял, что могу unit test весь код Oracle PL/SQL, код Java, HTML, JavaScript, XML, XSLT и т.д.

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

4b9b3361

Ответ 1

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

Когда у вас много тестов, вероятно, у вас будут ошибки в тестах. Добавление к вашим головным болям.

проверьте, что нужно тестировать, оставьте то, что не, которое часто оставляет довольно простые вещи.

Ответ 2

Код модульного тестирования и код выхода, открытый с помощью тестов, имеют стоимость.

Стоимость исключения кода из модульного тестирования может включать (но не ограничивается):

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

Затраты на запись unit test включают (но не ограничиваются ими):

  • Написание оригинала unit test
  • Поддержание unit test по мере развития вашей системы.
  • Очистка unit test, чтобы охватить больше условий, когда вы обнаружите их при тестировании или производстве.
  • Рефакторинг единиц тестирования, как базовый код под тестированием реорганизуется
  • Потерянный доход, когда вам требуется больше времени, чтобы приложение попало на рынок.
  • Возможная стоимость реализации функций, которые могут стимулировать продажи.

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

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

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

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

Ответ 3

Кент Бек из JUnit и JUnitMax fame ответил аналогичным question моим. Вопрос имеет немного другую семантику, но ответ определенно релевантен.

Ответ 4

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

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

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

Для HTML я имел тенденцию проверять, что требуемые данные были там (с использованием запросов XPath), но не проверяли весь HTML. Аналогично для XSLT и XML. В JavaScript, когда я мог тестировать библиотеки, но оставил основную страницу (за исключением того, что я переместил большинство кодов в библиотеки). Если JavaScript особенно сложный, я бы тестировал больше. Для баз данных я бы рассмотрел тестирование хранимых процедур и, возможно, просмотров; остальное является более декларативным.

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Как сказал EJD, вы не можете проверить отсутствие ошибок.

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

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

Некоторые тесты гораздо более ценны, чем другие.

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

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

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

Что я должен проверить?

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

Pragmatic Unit Testing рекомендует использовать Right-BICEP, чтобы выяснить, что тестировать. "Правильно" для счастливого пути, а затем B, а затем проверьте любые I обратные отношения, используйте другой метод (если он существует) до C ross-check results, force E rror и, наконец, принять во внимание любые P соображения эргованса, которые должны быть проверены. Я бы сказал, если вы думаете о тестах, чтобы написать таким образом, вы, скорее всего, выясните, как достичь адекватного уровня тестирования. Вы сможете выяснить, какие из них более полезны и когда. Более подробную информацию см. В книге.

Тест на правильном уровне

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

Не обескураживайте

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

Ответ 9

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

Ответ 10

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

Например, если вам была предоставлена ​​библиотека с функцией добавления, вы не должны тестировать, что добавляет (1,2) возвращает 3. Теперь, если у вас есть ПИСЬМЕННЫЙ код, то да, вы должны тестировать он.

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

Ответ 11

Ну, вы, конечно, не должны unit test все, но, по крайней мере, сложные задачи или те, которые, скорее всего, содержат ошибки/случаи, о которых вы не думали.

Ответ 12

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

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

Ответ 13

Когда вы проверили единицы измерения вашего устройства, подумайте, что вы предоставили 200% -ный охват.

Ответ 14

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

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

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

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