Юнит-тесты в ООП проектах на C++: как покрыть процедурный код


Автор: в

Юнит-тесты для ООП проектов на C++. Как покрыть процедурный код?


Хочу рассказать о проблемах, с которыми я столкнулся при работе с legacy проектами на C++. Эти проекты часто включают в себя множество библиотек с различной архитектурой, что может сделать процесс написания юнит-тестов довольно сложным.

Проблема legacy проектов

Обычно, legacy проекты на C++ состоят из нескольких библиотек, которые имеют различную структуру и архитектуру. Среди них могут быть библиотеки, реализованные в объектно-ориентированном стиле (например, некоторые модули boost, SOCI), а также библиотеки, реализованные в функциональном стиле (например, OpenGL через С API, POSIX).

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

Проблема юнит-тестов

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

Чтобы решить эту проблему, нам нужно рассмотреть несколько подходов к написанию юнит-тестов для таких проектов.

Подходы к написанию юнит-тестов

Существует несколько подходов к написанию юнит-тестов для legacy проектов на C++:

  • Использование фреймворков для юнит-тестов, таких как Google Test или CppUTest
  • Использование mock-объектов для имитации поведения зависимых объектов
  • Использование тестовых двойников для замены зависимых объектов

Каждый из этих подходов имеет свои преимущества и недостатки, и выбор подхода зависит от конкретных потребностей проекта.

Выводы

Написание юнит-тестов для legacy проектов на C++ может быть сложной задачей, но с помощью правильных подходов и инструментов можно добиться хорошего покрытия кода. Важно понимать структуру проекта и использовать соответствующие техники для имитации поведения зависимых объектов.

В будущем, я планирую продолжить исследование этого вопроса и поделиться своими находками с вами.


Источник: Читать оригинал

Предыдущие записи:

Комментариев нет

Отправить комментарий

Топ 5 популярных постов недели