Как убедиться, что код продолжает работать после рефакторинга (динамический язык) - PullRequest
7 голосов
/ 27 марта 2009

Как убедиться, что код все еще работает после рефакторинга (т.е. после изменения имени переменной)?

В статическом языке, если класс переименован, а другой ссылающийся класс - нет, тогда я получу ошибку компиляции.

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

Как решить эту проблему?

Ответы [ 4 ]

17 голосов
/ 27 марта 2009

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

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

10 голосов
/ 27 марта 2009

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

Другими словами, у вас должен быть какой-то способ убедиться, что внешнее функциональное поведение не повреждено после рефакторинга. Не имея божественного понимания, я считаю, что модульные тесты очень полезны для этого. В своей книге «Рефакторинг» Мартин Фаулер подчеркивает использование автоматических тестов для этой проверки.

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

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

1 голос
/ 27 марта 2009

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

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

EDIT:

Вы ответили и сказали, что используете PHP и Python.

Если это веб-приложение, используйте selenium для создания тестов в браузере. Сначала вам просто нужна Selenium IDE. Поместите все свои тесты в один набор тестов, чтобы вы могли легко выполнить их все. По мере роста списка вы можете начать изучать Selenium RC и Selenium Grid.

0 голосов
/ 28 ноября 2009

1) Для Python используйте PyUnit для PHP phpunit. 2) Подход TDD хорош, но также приемлемо выполнение тестов после написания кода. 3) Также используйте инструменты рефакторинга, доступные для вашей IDE, они выполняют только безопасный рефакторинг. В Python у вас есть веревка (это библиотека, но есть плагины для большинства IDE). 4) Хорошие книги это: «Опытно-ориентированная разработка на примере» Best «Эксперт по программированию на Python» Тарек Зиаде (объясните как TDD, так и рефакторинг)

Google TDD и базы данных, чтобы найти хорошую книгу о подходе TDD для разработки баз данных.

Добавить информацию о том, что вы используете. AFAIK макеты нужны только тогда, когда задействована база данных или сеть. Но обычно модульный тест должен охватывать небольшие кусочки кода (только один класс), иногда два класса, поэтому макет не требуется !!

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