Рефакторинг для тестируемости в существующей системе - PullRequest
5 голосов
/ 21 августа 2008

Я присоединился к команде, которая работает над продуктом. Этот продукт существует уже около 5 лет и использует ASP.NET WebForms. Его оригинальная архитектура со временем исчезла, и во всем решении все стало относительно неорганизованным. Это ни в коем случае не ужасно, но определенно может использовать некоторую работу; Вы все знаете, что я имею в виду.

Я провел несколько рефакторингов с тех пор, как пришел в проектную команду около 6 месяцев назад. Некоторые из этих рефакторингов являются простыми: метод извлечения, метод подтягивания вверх и т. Д. Некоторые из рефакторингов являются более структурными. Последние изменения заставляют меня нервничать, так как нет комплексного набора юнит-тестов для сопровождения каждого компонента.

Вся команда готова внести структурные изменения посредством рефакторинга, но наш менеджер проекта выразил некоторые опасения, что у нас нет адекватных тестов для проведения рефакторинга с уверенностью, что мы не вводим ошибки регрессии в система. Он хотел бы, чтобы мы сначала написали больше тестов (против существующей архитектуры), а затем провели рефакторинг. Мой аргумент заключается в том, что структура классов системы слишком тесно связана для написания адекватных тестов, и что лучше использовать подход, основанный на тестировании, пока мы выполняем наши рефакторинги. Под этим я подразумеваю не написание тестов для существующих компонентов, а написание тестов для конкретных функциональных требований, а затем рефакторинг существующего кода для удовлетворения этих требований. Это позволит нам писать тесты, которые, вероятно, будут иметь больший срок службы в системе, чем писать кучу «выброшенных» тестов.

Есть ли у кого-нибудь опыт относительно того, как лучше всего действовать? У меня есть свои мысли, но я хотел бы услышать мнение сообщества.

Ответы [ 5 ]

5 голосов
/ 21 августа 2008

Проблемы с вашим менеджером PM действительны - убедитесь, что вы тестируете свою систему, прежде чем проводить какой-либо серьезный рефакторинг.

Я бы настоятельно рекомендовал получить копию книги Майкла Фезера Эффективная работа с устаревшим кодом (под «Устаревшим кодом» «Перья» означает любую систему, которая не охвачена модульными тестами). Здесь полно хороших идей о том, как сломать те связи и зависимости, о которых вы говорите, безопасным способом, который не рискует привести к ошибкам регрессии.

Удачи с программой рефакторинга; по моему опыту, это приятный и катарсический процесс, из которого вы можете многому научиться.

2 голосов
/ 21 августа 2008

Можете ли вы пересчитать параллельно? Я имею в виду переписать фрагменты, которые вы хотите реорганизовать с использованием TDD, но оставьте существующую кодовую базу на месте. Затем прекратить существующий код, когда ваши новые тесты удовлетворят потребности вашего PM?

1 голос
/ 17 сентября 2008

Я также хотел бы добавить предложение о посещении веб-сайта Refactoring Мартина Фаулера. Он буквально написал книгу об этом материале.

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

Модульное тестирование ASP.Net может быть сложным, но есть много фреймворков, которые облегчают его выполнение. ASP.Net MVC и WCSF и многие другие.

0 голосов
/ 18 января 2009

Полностью согласен с ответом Ян Нельсон . Кроме того, я бы начал получать некоторые «высокоуровневые» тесты (функциональные или компонентные тесты) для сохранения поведения с точки зрения пользователя. Этот момент может быть самой важной проблемой для вашего премьер-министра.

0 голосов
/ 23 августа 2008

Просто выкину вторую рекомендацию по эффективной работе с Legacy Code, отличную книгу, которая действительно открыла мне глаза на тот факт, что практически любой старый / дрянной / непроверяемый код может быть подвергнут сомнению!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...