Во-первых, добро пожаловать в клуб плохих хороших программистов, которые должны исправлять преступления, совершенные их худшими коллегами. (
У меня был такой опыт. В этом случае одним из рекомендуемых методов является разработка тестов для новых функций. Вы не можете сейчас остановиться и разработать тесты для всего приложения. Что вы можете сделать, так это каждый раз, когда вам нужно написать новую функцию, разработайте тесты для этой функции. Если эта функция требует изменений в некоторых уязвимых местах, начните тестирование для этих мест.
Рефакторинг - большая проблема. В идеале, если вы хотите разделить класс из 5k строк на 10 классов нормального размера, вы должны сначала разработать контрольные примеры для большого класса, затем выполнить рефаторинг и затем снова запустить тесты, чтобы убедиться, что вы ничего не сломали. Это очень сложно на практике, потому что, когда вы меняете дизайн, вы меняете интерфейс, и поэтому вы не можете запускать точно такие же тесты. Таким образом, каждый раз вы должны принять трудное решение, каков наилучший способ и каков минимальный тестовый пример, который охватывает вашу задницу.
Например, иногда я выполнял 5-фазный рефаторинг:
1. разработаны тесты для плохого большого класса
2. разработал новый хорошо разработанный код и изменил старый класс, чтобы он стал фасадом для моего нового кода.
3. запустил тестовый пример, разработанный в # 1, чтобы проверить, что все работает
4. разработаны новые тесты, которые проверяют, что каждый новый (маленький) субмодуль работает хорошо
5. рефакторинг кода, то есть удалены все ссылки на большой старый класс (который стал легковесным фасадом)
5. убрал старый класс и его тесты.
Но это худший вариант развития событий. Я должен был использовать это, когда код, который я изменяю, чрезвычайно чувствителен.
Вскоре, удачи в вашей тяжелой работе. Подготовьтесь к работе в одночасье, а затем получите 20 отчетов об ошибках от QA и гневное электронное письмо от вашего босса. :( Будь сильным. Ты на правильном пути!