Сведения о вопросе

DED

10:34, 27th August, 2020

Теги

Рефакторинг для тестируемости в существующей системе

Просмотров: 497   Ответов: 5

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

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

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

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



  Сведения об ответе

ASSembler

17:06, 14th August, 2020

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

Я бы настоятельно рекомендовал получить копию книги Майкла пера, эффективно работающую с устаревшим кодом (под "Legacy Code" перьями подразумевается любая система, которая недостаточно охвачена модульными тестами). Это битком набито хорошими идеями о том, как разбить эти связи и зависимости, о которых вы говорите, безопасным способом, который не рискует вводить ошибки регрессии.

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


  Сведения об ответе

VCe znayu

13:20, 10th August, 2020

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


  Сведения об ответе

FAriza

21:46, 19th August, 2020

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

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

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


  Сведения об ответе

dumai

18:45, 11th August, 2020

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


  Сведения об ответе

SILA

04:23, 1st August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться