"Недостатком в обоих случаях является то, что производительность нашей команды в бизнесе может либо значительно снизиться, либо полностью испариться во время любого тестирования".
Это распространенное неверное истолкование фактов. Прямо сейчас у вас есть код, который вам не нравится, и вам трудно его поддерживать. «адский граф зависимостей» и т. д.
Итак, разработка "хруста", которую вы делали, привела к дорогостоящей переделке. Реконструкция настолько дорогая, что вы не рискуете ее попробовать. Это говорит о том, что ваша хрустальная разработка не очень эффективна. В то время это кажется дешевым, но, оглядываясь назад, вы замечаете, что вы действительно тратите деньги на разработку, потому что вы создали проблемное, дорогое программное обеспечение вместо того, чтобы создавать хорошее программное обеспечение.
TDD может изменить это, так что вы не производите программное обеспечение, которое стоит дорого в обслуживании. Он не может все исправить, но он может дать понять, что смена фокуса с «хруста» может привести к созданию более качественного программного обеспечения, которое в конечном итоге будет менее дорогим.
Из вашего описания некоторые (или все) из вашей текущей кодовой базы являются пассивом, а не активом. Теперь подумайте, что сделает TDD (или любая другая дисциплина), чтобы снизить стоимость этого обязательства. Вопрос о «производительности» не применяется, когда вы предъявляете ответственность.
Золотое правило TDD: Если вы прекратите создавать код, являющийся обязательством, у организации будет положительный ROI.
Будьте осторожны, спрашивая, как сохранить текущий темп производительности. Некоторая часть этой «производительности» создает стоимость без стоимости.
«Почти ни один из наших компонентов не может быть протестирован изолированно; мы не знаем всех вариантов использования»
Правильно. Модернизация модульных тестов для существующей кодовой базы действительно сложна.
«Существует риск привести команду к ложному чувству безопасности, из-за которого незаметно появятся тонкие ошибки, и никто не заметит»
Ложь. Там нет "ложного чувства безопасности". Все знают, что тестирование в лучшем случае непросто.
Кроме того, теперь у вас есть ужасающие ошибки. У вас проблемы настолько плохие, что вы даже не знаете, что это такое, потому что у вас нет тестового покрытия.
Торговля несколькими незначительными ошибками все еще является огромным улучшением по сравнению с кодом, который вы не можете протестировать. Я буду принимать тонкие ошибки за неизвестные ошибки в любой день.
«Метод (2) более привлекателен»
Да. Но.
Ваши предыдущие попытки тестирования были подорваны культурой, которая вознаграждает программирование хруста.
Что-нибудь изменилось? Я сомневаюсь. Ваша культура все еще вознаграждает программирование хруста. Ваша инициатива по тестированию все еще может быть подорвана.
Вы должны смотреть на середину. Нельзя ожидать, что «фанатично придерживается принципов TDD» в одночасье. Это требует времени и значительных культурных изменений.
Что вам нужно сделать, это разбить ваши приложения на куски.
Рассмотрим, например, уровни Модель - Услуги - Представление .
У вас есть базовая модель приложения (постоянные вещи, базовые классы и т. Д.), Которая требует тщательного тщательного и заслуживающего доверия тестирования.
У вас есть прикладные сервисы, которые требуют некоторого тестирования, но подвержены «случаям использования, которые могут измениться во время тестирования из-за требований бизнеса или как реакция на непредвиденные проблемы». Испытайте как можно больше, но не сходите с ума от необходимости вовремя отправлять вещи в следующем сезоне.
У вас есть материалы для просмотра / презентации, которые требуют некоторого тестирования, но не обрабатывают ядро. Это просто презентация. Он будет постоянно меняться, так как людям нужны разные варианты, представления, отчеты, анализ, RIA, GUI, glitz и sizzle.