В настоящее время я работаю над проектом с некоторыми довольно важными бизнес-правилами, в которых проблемное пространство «обнаруживается», когда мы пишем решение (довольно типичная хаотичная система управления проектами). У нас приличное тестовое покрытие и мы полагаемся на них, чтобы убедиться, что наши существенные изменения ничего не взорвут. Этот сценарий является той вещью, которую фанаты модульного тестирования выделяют в качестве основного примера тестирования, помогающего программному обеспечению быть легко модифицированным с меньшим количеством дефектов и более быстрым завершением, чем если вы не используете модульные тесты. Мне страшно подумать о том, как бы я справился без набора тестов.
Мой вопрос заключается в том, что, хотя я, конечно, верю в ценность модульного тестирования (этот проект на самом деле является TDD, но это не совсем уместно для вопроса), я, как и другие, задаюсь вопросом о классической проблеме модульного тестирования, связанной с намного больше кода, который нужно обрабатывать и поддерживать (т.е. сами тесты). Снова. я не сомневаюсь, что этот конкретный проект гораздо лучше с модульным тестом, чем без него , я также обеспокоен долгосрочной ремонтопригодностью испытаний.
Есть несколько методов, которые я использовал, следуя советам других, чтобы помочь с этой проблемой. В общем,
-
мы создаем списки тестов, которые находятся либо в «зависимом», либо «независимом» сегменте . независимые тесты не требуют ничего, что не входит в систему контроля версий. Таким образом, любые вызовы нашего уровня доступа к данным являются либо поддельными, либо получают данные из XML-файла вместо реального БД, например. Зависимые тесты, как следует из названия, зависят от чего-то вроде файла конфигурации, базы данных или сетевых данных, которые могут быть неправильно сконфигурированы / недоступны при запуске теста. Разделение тестов на группы, подобные этой, было чрезвычайно ценно, поскольку позволило нам написать зависимые «отбрасываемые» тесты для ранней разработки и независимые критически важные тесты, на которые можно положиться, и не поддаваться тестированию. Это также облегчает управление CI-сервером, поскольку его не нужно настраивать и обслуживать соединениями w / db и т.п.
-
Мы нацелены на разные уровни нашего кода . Например, у нас есть тесты, работающие на main, и тесты на все методы, которые вызовет main. Это дает нам возможность ориентироваться в деталях системы и общих целях. «Основные» тесты трудно отлаживать, если они ломаются, но обычно они не единственные, которые ломаются (детальные тесты также ломаются). Проще следить за подробными тестами и отлаживать их, если они ломаются, но их недостаточно, чтобы знать, убивает ли система рефакторинг (для этого и нужны «основные» тесты).
-
«Основные» тесты были критически важны для того, чтобы чувствовать себя комфортно, потому что рефактор не скрывал кодовую базу. поэтому «главный» тест будет похож на многие тесты для одного метода, вызываемого с разными аргументами, которые сопоставляются с вариантами использования. По сути, это точка входа в наш код на самом высоком уровне, и, возможно, это не совсем «модульные» тесты. Тем не менее, я обнаружил, что мне действительно нужны тесты более высокого уровня, чтобы чувствовать себя комфортно, чтобы рефактор не взорвал кодовую базу . Тесты более низкого уровня (те, которые действительно являются «единицей» работы) недостаточны.
Все это, чтобы добраться до вопроса. По мере продвижения проекта, и я обнаружил, что мне нужно внести изменения (иногда довольно существенные, иногда тривиальные) в кодовую базу, я обнаружил, что когда изменения приводят к сбою тестов, существует соотношение между провалом теста и реальной регрессивной бизнес-логикой Отказ и недействительность юнит-теста . Другими словами, иногда сбой теста происходит из-за ошибки регрессии в фактической базе кода, а иногда это потому, что утверждения модульного теста больше не действительны, и это утверждения, которые необходимо изменить. Примерно кажется, что когда тесты не пройдены, это было примерно на 50% для этого конкретного проекта.
Кто-нибудь отслеживал это соотношение в своих проектах, и если да, что вы узнали (если таковые имеются) относительно этого соотношения? Я не уверен, что это вообще что-то указывает, но я заметил, что примерно половина времени, когда неудачные тесты приводят меня к корректировке тестовых утверждений, а не к исправлению ошибок регрессии в реальной базе кода. Всякий раз, когда это происходит, у меня возникает ощущение, что я просто потратил впустую x часов своего дня, и мне интересно, смогу ли я как-то повысить эффективность своего подхода к тестированию. Часто для устранения ошибок проверки утверждения требуется больше времени, чем для фактических ошибок регрессии, что является одновременно противоречивым и разочаровывающим.
РЕДАКТИРОВАТЬ
Обратите внимание, что этот вопрос касается изучения того, что означает это соотношение, и вашего опыта работы с этим соотношением. Когда это "вонючий" ??