Основным оправданием для разработчика за отсутствие хорошего модульного тестирования является то, что «Код не разработан для тестирования модулем». Я пытаюсь понять, какой тип дизайна и кода не может быть модульным тестированием.
Основным оправданием для разработчика за отсутствие хорошего модульного тестирования является то, что «Код не разработан для тестирования модулем». Я пытаюсь понять, какой тип дизайна и кода не может быть модульным тестированием.
Ответы:
Несколько факторов могут сделать код сложным для модульного тестирования. В этом случае рефакторинг помогает улучшить код, чтобы его можно было тестировать.
Некоторые примеры кода, которые, вероятно, будет сложно протестировать:
function pGetDp_U(int i, int i2, string sText)
.Обратите внимание, что отсутствие четкой архитектуры не делает код сложным для модульного тестирования, поскольку модульные тесты касаются небольших частей кода. Непонятная архитектура все равно будет иметь негативное влияние на интеграцию и тестирование системы.
Есть много вещей, которые делают код сложным для модульного тестирования. По совпадению, многие из них также затрудняют поддержку кода:
Типичные примеры кода, которые люди не хотят тестировать:
Используя макет фреймворка, все эти примеры могут быть проверены модулем. Это просто работа по настройке фиктивных замен для внутренних зависимостей.
Вещи, которые действительно не могут быть проверены модулем:
Вот несколько областей, которые могут затруднить написание модульных тестов. Однако я хотел бы подчеркнуть, что это не означает, что вы должны сбрасывать со счетов полезные методы просто потому, что они могут усложнить тестирование. Как и в случае любого другого кодирования, вы должны проводить собственный анализ, чтобы определить, превышают ли выгоды затраты, а не принимать вслепую то, что некоторые случайные парни публикуют в сети.
Стоимость большинства этих спиралей выходит из-под контроля, если вы не знаете, что делаете. К сожалению, многие часто не знают, как использовать эти методы таким образом, чтобы смягчить такие вещи, как сложность тестирования.
Нет такого понятия, как код, который нельзя протестировать. Однако есть несколько примеров кода, который ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО трудно протестировать (возможно, не стоит затраченных усилий):
Взаимодействие с оборудованием. Если код напрямую управляет оборудованием (например, записывает данные в регистр для перемещения физического устройства), тогда модульное тестирование может быть слишком сложным или дорогостоящим. Если вы используете реальное оборудование для теста, это может стать дорогостоящим, чтобы получить соответствующую обратную связь в тестовом жгуте (еще больше оборудования!), А если вы этого не сделаете, вам придется подражать точному поведению физических объектов - не малый прием в некоторые случаи.
Взаимодействие с часами - это обычно проще, потому что почти всегда можно довольно просто смоделировать функции системных часов. Но когда вы не можете, тогда эти тесты становятся неуправляемыми - тесты, основанные на реальном времени, имеют тенденцию занимать много времени, и по моему опыту они имеют тенденцию быть очень хрупкими, поскольку системные нагрузки заставляют вещи работать дольше, чем они должны , вызывая провал теста фантома.
Мои основные три группы для этого:
код, который опирается на внешние сервисы
системы, которые не позволяют тестерам изменять состояние независимо от приложения.
тестовые среды, которые не повторяют производственную настройку.
Это то, что я испытал больше всего, когда разработчик стал инженером QA.