Добавление модульных тестов к устаревшему коду

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

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

Итак, если вы собираетесь коснуться кода, исправления ошибок или рефакторинга, сначала напишите модульные тесты. Для тестирования модhive ошибок поможет доказать, где проблема, так как вы можете ее дублировать.

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

Нет простого способа сделать это.

Этот вопрос может помочь в дополнительных предложениях. Как вы вводите модульное тестирование в большую, устаревшую (C / C ++) кодовую базу?

Книга Майкла Перса «Эффективная работа с устаревшим кодом» – это целая книга, посвященная этой теме. Майкл утверждает, что часто бывает сложно вводить тесты для устаревшего кода, поскольку он не структурирован для проверки. То, что я выбрал из книги, – это несколько паттернов, названных «Функции Sprout» и «Sprout classes». Функция прорастания – это та, которая инкапсулирует изменения, которые необходимо внести в код. Затем вы тестируете только эти функции. Класс sprout – это та же идея, за исключением того, что новая функциональность содержится в classе.

Да, и это вообще больно. Мне часто приходилось писать интеграционные тесты.

В книге The Art of Unit Testing есть несколько хороших советов по этому поводу. Он также рекомендует книгу « Эффективная работа с устаревшим кодом» ; Я еще не прочитал последнее, но это в моем стеке.

EDIT: Но да, даже минимальное покрытие кода было полезным. Это дало мне уверенность и безопасность для рефакторинга кода.

EDIT: Я действительно читал «Эффективно работаю с Legacy Code», и это отлично.

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


Структуру единичного тестирования, такую ​​как семейство xUnit, можно использовать для написания тестов характеристик.

В таких тестах, написанных после фактов, утверждения проверяют текущее поведение кода. В отличие от модульных тестов, они не доказывают правильность кода, они просто фиксируют (характеризуют) текущее поведение кода.

Процесс аналогичен процессу TDD:

  • написать тест для части кода
  • выполнить его – сбой
  • исправить тест из наблюдаемого поведения кода
  • выполнить его – пройти
  • повторение

Если вы измените внешнее поведение кода, тесты потерпят неудачу. Внешнее поведение кода? звучит знакомо ? Да, это мы. Теперь вы можете реорганизовать код.

Очевидно, что риск зависит от охвата тестов характеристик.

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

Как упоминалось в подходе ApprovedTests в этой статье :

Часто у вас есть огромный проект кода устаревшего кода, в котором у вас вообще нет тестов, но вам нужно изменить код для реализации новой функции или рефакторинга. Интересная вещь о устаревшем коде – это работает! Он работает годами, независимо от того, как это написано. И это очень большое преимущество этого кода. С одобрениями, только с одним тестом вы можете получить все возможные выходы (HTML, XML, JSON, SQL или любой другой вывод, который может быть) и одобрить, потому что вы знаете – он работает! После того, как вы завершили такой тест и одобрили результат, вы действительно намного безопаснее с рефакторингом, так как теперь вы «заблокировали» все существующее поведение.

Инструмент Asis – это точно о сохранении устаревшего кода, автоматически создавая и запуская тесты характеристик.

Для получения дополнительной информации смотрите

  • подробный README в реестре github проектов
  • обсуждение хакерских новостей
  • обсуждение reddit.com/r/php
  • обсуждение reddit.com/r/programming

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

Я не буду вам врать, переоснащение модульных тестов на устаревший код сложно – но это того стоит.

Взгляните на бесплатную библиотеку утилиты для тестирования модhive с открытым исходным кодом, ApprovedTests . Если вы являетесь разработчиком .NET, создатель Llewellyn Falco сделал серию видеороликов, показывающих, как он использует ApprovedTests для улучшения модульного тестирования как для нового, так и для устаревшего кода.

Я уже некоторое время говорил об идее «Пирамида с проверенными испытаниями» в «Legacy Code» в XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/

Эта презентация должна отвечать на вопрос, почему так важно иногда начинать с интеграционных / функциональных или даже приемочных тестов высокого уровня при работе с устаревшим кодом. А затем медленно, шаг за шагом вводя модульные тесты. Нет примеров кода – извините, но вы можете найти их в книге Михаэля Перса «Эффективно работать с Legacy Code».

Также вы можете проверить Legacy Code Retreat http://www.jbrains.ca/legacy-code-retreat и искать эту встречу в своей области.

Interesting Posts

NoSuchElementExeption, selenium, неспособный найти элемент

Четкие элементы управления не распоряжаются им – какой риск?

Как добавить Stacktrace или вариант отладки при создании проекта Android Studio

Какова фактическая скорость SATA 3?

Как использовать тот же код на C ++ для Android и iOS?

Как установить порядок репозиториев в Maven settings.xml

Синхронизация и System.out.println

Диаграмма Google Bar не может изменить индивидуальный цвет панели

Каким детерминированным является неточность с плавающей запятой?

Невозможно загрузить альтернативную ОС или Live CD

Инициализация полей в конструкторе – список инициализаторов и тело конструктора

Анализатор дискового пространства, который может считывать выходные данные

Как написать книгу Excel в MemoryStream в .NET?

Есть что-то вроде Command Substitution в WIndows CLI?

Каков рекомендуемый способ передачи URL-адресов в качестве параметров URL-адреса?

Давайте будем гением компьютера.