См. Книгу Эффективная работа с устаревшим кодом Майкла Фезерса.
Таким образом, много работы по преобразованию существующего кода в тестируемый и протестированный код; Иногда это слишком много работы, чтобы быть практичным. Это зависит от того, насколько велика кодовая база и насколько различные классы и функции зависят друг от друга.
Рефакторинг без тестов приведет к изменениям в поведении (то есть к ошибкам). И пуристы скажут, что это не совсем рефакторинг из-за отсутствия тестов, чтобы проверить, что поведение не меняется.
Вместо того, чтобы добавлять тест по всем направлениям сразу ко всему вашему приложению, добавляйте тесты, когда вы работаете в области кода. Скорее всего, вам придется снова вернуться в эти «горячие точки».
Добавьте тесты снизу вверх: проверьте правильность небольших независимых классов и функций.
Добавление тестов сверху вниз: тестируйте целые подсистемы как черные ящики, чтобы увидеть, меняется ли их поведение с изменениями в коде. И поэтому вы можете пройти через них, чтобы узнать, что происходит. Такой подход, вероятно, принесет вам наибольшую пользу.
Сначала не беспокойтесь о том, что такое «правильное» поведение, когда вы добавляете тесты, ищите, чтобы обнаружить и избежать изменений в поведении. Большие, непроверенные системы часто имеют внутреннее поведение, которое может показаться неправильным, но от этого зависят другие части системы.
Подумайте об изоляции зависимостей, таких как база данных, файловая система, сеть, чтобы их можно было заменить для провайдеров фиктивных данных во время тестирования.
Если в программе нет внутренних интерфейсов, линий, которые определяют границу между одной подсистемой / слоем и другой, то вам, возможно, придется попытаться ввести их и протестировать на них.
Кроме того, автоматические рамки для насмешек, такие как Rhinomocks или Moq , могут помочь в этом. Я действительно не нашел их в коде, разработанном для тестируемости.