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