8 ответов:
лучший способ, который я нашел, - это постепенно добавлять модульные тесты, а не просто прыгать и говорить, что теперь мы будем тестировать приложение.
Итак, если вы собираетесь коснуться кода, для исправления ошибок или рефакторинга, то сначала напишите модульные тесты. Для ошибок модульные тесты помогут доказать, где проблема, так как вы можете ее дублировать.
Если рефакторинг, вы хотите написать модульные тесты, но вы можете обнаружить, что тест невозможно написать, поэтому вам может понадобиться найти высокий уровень, который вызывает функцию, которая будет рефакторинг, и модульный тест этой части. Затем, когда вы рефакторируете наступательную функцию, напишите свои тесты, чтобы вы могли убедиться, что она работает так, как должна.
нет простого способа сделать это.
этот вопрос может помочь с несколькими предложениями. как вы вводите модульное тестирование в большую, устаревшую (C/C++) кодовую базу?
книга Майкла пера "эффективная работа с устаревшим кодом" - это целая книга, охватывающая эту тему. Майкл утверждает, что часто слишком сложно вводить тесты для устаревшего кода, потому что он не структурирован, чтобы быть тестируемым. То, что я получил из книги больше всего, было парой шаблонов под названием "функции Sprout" и "классы Sprout". Функция sprout-это функция, которая инкапсулирует изменения, которые необходимо внести в код. Затем вы тестируете только эти функции. Росток класс та же идея, за исключением новой функции, содержащиеся в классе.
да, и это вообще больно. Мне часто приходилось писать интеграционные тесты вместо этого.
книги искусство модульного тестирования есть несколько хороших советов по этому поводу. Он также рекомендует книгу эффективная работа с устаревшим кодом; Я еще не читал последнее, но это на моем стеке.
EDIT: Но да, даже минимальное покрытие кода стоило того. Это дало мне уверенность и страховочную сеть для рефакторинга код.
EDIT: я читал эффективно работать с устаревшим кодом, и это отлично.
одной из альтернатив модульным тестам, также введенным в эффективную работу с устаревшим кодом, является характеристические тесты. У меня были интересные результаты с такими тестами. Их легче настроить, чем модульные тесты, поскольку вы тестируете из точки, чем можете быть протестированы (так называемый шов). Недостатком является то, что при сбое теста у вас меньше подсказок о местоположении проблемы, поскольку тестируемая область может быть намного больше, чем при модульных тестах. Ведение журнала помогает здесь.
модульный тест рамки, такие как семейство xUnit, могут использоваться для написания тестов характеристик.
в таких тестах, написанных после фактов, утверждения проверяют текущее поведение кода. В отличие от модульных тестов, они не доказывают правильность кода, они просто фиксируют (характеризуют) текущее поведение кода.
процесс похож на TDD,:
- написать тест для части кода
- выполнить - не
- исправьте тест из наблюдаемого поведения кода
- выполнить его-pass
- повторить
тесты не будут выполнены, если вы измените внешнее поведение кода. Внешнее поведение кода ? звучит знакомо ? Да, мы здесь. Теперь вы можете рефакторинг кода.
очевидно, что риск зависит от охвата тестов характеристики.
Посмотрите также на новый подход в области модульного тестирования устаревшего кода - проект Asis, он вдохновлен ApprovalTests проект и разделяет его ключевые концепции.
Как уже упоминалось о подходе ApprovalTests в в этой статье:
часто у вас есть огромный проект устаревшего кода, где у вас нет тестов все, но вы должны изменить код для реализации новой функции, или рефакторинг. Интересная вещь о унаследованный код - это работает! Оно работает годами, как бы ни было написано. И это очень здорово преимущество этого кода. С утверждениями, с только одним тестом вы можете получить все возможные выходные данные (HTML, XML, JSON, SQL или любой другой вывод быть) и утвердить, потому что вы знаете - это работает! После того, как вы закончите такой тест и одобрил результат, вы действительно гораздо безопаснее с a рефакторинг, так как теперь вы "заблокировали" все существующее поведение.
инструмент Asis именно о содержании унаследованного кода путем автоматического создания и запуска тестов характеристик.
для получения дополнительной информации посмотрите на
- полная README в репо GitHub проектов
- обсуждение hacker news
- обсуждение на reddit.com/r/php
- обсуждение на reddit.com/r/programming
Если вы планируете рефакторинг устаревшего кода, то создание этих модульных тестов является обязательным. Не беспокойтесь о насмешках или заглушках - беспокойтесь о тестировании входов и выходов системы, чтобы ваши изменения или усилия по рефакторингу не нарушали текущую функциональность.
Я не буду лгать вам, переоснащение модульных тестов на устаревший код сложно-но оно того стоит.
взгляните на бесплатную библиотеку утилит модульного тестирования с открытым исходным кодом,ApprovalTests. Если вы разработчик .NET, создатель, Llewellyn Falco, сделал
некоторое время назад я говорил об идее перевернутой пирамиды тестов в устаревшем коде на XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/
эта презентация должна ответить на вопрос, почему так важно иногда начинать с интеграционных/функциональных или даже приемочных тестов высокого уровня при работе с устаревшим кодом. А затем медленно, шаг за шагом вводя модульные тесты. Нет примеров кода - извините, но вы можете найти их можно в книге Майкла пера "эффективная работа с унаследованным кодом".
также вы можете проверить устаревший код Retreat http://www.jbrains.ca/legacy-code-retreat и ищите эту встречу в вашем районе.
Comments