Работа над устаревшим Rails-приложением - PullRequest
7 голосов
/ 23 декабря 2011

У меня очень старое и плохо написанное приложение на Rails.Есть около 9000 строк кода и ноль тестов.Большая часть кода находится в контроллерах, и, что еще хуже, существует множество внешних API-вызовов, системных вызовов случайных сценариев и т. Д.

Среды разработки также нет, все настроено для работы против производства.базы данных.Ну, не только одна база данных, есть около 10 различных баз данных, так как приложение является своего рода административным бэкэндом для более крупного сайта.

Моя первая идея состояла в том, чтобы получить хотя бы несколько приличное тестовое покрытие для частей, которые яЯ собираюсь работать, но я не могу заставить его работать где-то еще, кроме как на производственных серверах.

Также есть тонны старых драгоценных камней и устаревших предупреждений, но я даже не могу думать об обновлениидрагоценные камни, пока есть тесты.Переписать все вверх не вариант, и мне скоро придется добавлять / изменять материал.

Я не совсем уверен, как подходить к тестированию такого приложения, так как есть так много всегоэто может пойти не так.Что я действительно хотел бы сделать, так это написать несколько интеграционных тестов, а затем начать рефакторинг, но я не могу этого сделать в производственной среде.

Написание модульных тестов с кучей заглушек и макетов не кажется полезным, поскольку код, над которым я собираюсь работать, в основном должен быть переписан с нуля.

Какие шагиЯ могу в основном дублировать огромную сложную производственную среду на моей машине разработки, чтобы я мог делать вещи изолированно?

edit: Немного забавного факта о приложении.Когда я попытался запустить его в первый раз, он продолжал зависать без каких-либо сообщений об ошибках ... пока примерно через полчаса я не обнаружил, что время ожидания для подключения к базе данных (которая была недоступна) было установлено на 90 минут !

Ответы [ 4 ]

9 голосов
/ 23 декабря 2011

Так что это относительно новый / редкий случай, потому что рельсовые приложения "LEGACY" пока не слишком популярны (все еще довольно молоды).

Однако я натолкнулся на несколько разных статей о том, как тестировать (не проверенные) устаревшие приложения rails. Вот некоторые из них, которые я рекомендую:

  1. Этот слайдшер
  2. Глава 18 « Испытательных предписаний Rails » от Pragmatic Programmers.

Конечная и самая важная вещь - заставить работать НЕКОТОРЫЙ вид испытательного жгута. Это означает, что фабрики должны работать, работать с тестовой базой данных, запускать рейк (даже если это означает удаление поврежденных тестов). С этого момента вы вернетесь и протестируете модули так, как вам нужно, а также УБЕДИТЕСЬ, что вы тестируете все новые фрагменты кода, добавляемые в проект.

Это чрезвычайно болезненная задача, и я приветствую вас за то, что вы пытаетесь сделать это правильно.

Ура!

3 голосов
/ 23 декабря 2011

Я работал над несколькими миссиями по спасению, в основном PHP-проектами, которые были действительно плохими, но не только - отчаянные владельцы продуктов, оставленные плохими 80% программистами, платили за то, что закончили свои заброшенные проекты :).Мой подход состоит в том, чтобы использовать грубую силу.

Запустите его в разработке и исправляйте, пока не запустите, с помощью мощной силы - исправьте, попробуйте, исправьте, попробуйте. У вас будет , в конце концов, все заработает. 9000 строк кода - это не большой код, я бы сказал, что это разумный размер для плохого унаследованного кода, он мог бы быть намного хуже. Медленно начните рефакторинг постепенно. Для выполнения этой задачи потребуется время, поэтому не ожидайте, что это произойдет сразу.
2 голосов
/ 23 декабря 2011

Добро пожаловать на этот ужасный катер.

В прошлый раз, когда это случилось со мной, я написал несколько тестов с Капибарой и:

  • Я проверил, что должно было быть создано или нет в БД ...

  • ... потом по крупицам, я рефакторинг

В этом случае я не вижу никаких других средств, кроме приближения кприложение на самом высоком уровне и проверить результат на самом низком, без каких-либо заглушек / макетов.

0 голосов
/ 23 декабря 2011

Какая версия

Rails,
Ruby,
Mysql socket,

это использует?

Мне приходилось работать над таким приложением. Вот что я должен был сделать:

Copy DB over, 
do not run the migrations, 
installed gems as production environment, 
do not update gems. 

Мое приложение использовало очень специфическую версию гема (gettext v = 1.10)

...