Подтвердить что ты не робот

Вымывание не виртуальных методов на С++ без редактирования производственного кода?

Я довольно новый разработчик программного обеспечения, который в настоящее время работает над добавлением модульных тестов к существующему проекту С++, который начался несколько лет назад. Из-за нетехнической причины мне не разрешено изменять какой-либо существующий код. Базовый класс всех моих модулей содержит множество методов для настройки/получения данных и общения с другими модулями.

Поскольку я просто хочу тестировать каждый отдельный модуль, я хочу иметь возможность использовать консервированные значения для всех моих методов взаимодействия между модулями. То есть для метода Ping(), который проверяет, активен ли другой модуль, я хочу, чтобы он возвращал true или false, основываясь на том, какой тест я делаю. Я изучал Google Test и Google Mock, и он поддерживает насмешливые не виртуальные методы. Однако описанный подход (http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods) требует от меня "templatize" исходных методов для использования в реальных или макетных объектах. Я не могу пойти и templatize мои методы в базовом классе из-за требования, упомянутого ранее, так что мне нужен другой способ издеваться над этими виртуальными методами

В принципе, методы, которые я хочу высмеять, находятся в каком-то базовом классе, модули, которые я хочу использовать unit test, и создают mocks из производных классов этого базового класса. Между базовым модулем модуля и модулями, которые я хочу проверить, есть промежуточные модули.

Буду признателен за любые советы!

Спасибо,

JW

EDIT: более конкретные примеры

Мой базовый класс позволяет сказать rootModule, модуль, который я хочу проверить, - leafModule. Существует промежуточный модуль, который наследует от rootModule, leafModule наследует от этого промежуточного модуля.

В моем модуле leafModule я хочу протестировать метод doStuff(), который вызывает не виртуальный GetStatus (moduleName), определенный в классе rootModule. Мне нужно как-то заставить GetStatus() вернуть выбранное консервированное значение. Mocking для меня новичок, так что использовать макет объектов даже правильный подход?

4b9b3361

Ответ 1

Я бы написал Perl/Ruby/Python script для чтения в исходном исходном дереве и выкинул издеваемое исходное дерево в другом каталоге. Вам не нужно полностью анализировать С++, чтобы заменить определение функции.

Ответ 2

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

Второй вариант - сделать их виртуальными для тестирования. Большинство компиляторов позволяют вам определить что-то в командной строке, поэтому скомпилируйте свой код с помощью -DTEST_VIRTUAL = virtual или -DTEST_VIRTUAL, чтобы сделать их виртуальными или нормальными в зависимости от того, тестируется ли это или нет.

Третий вариант, который может быть полезен, - использовать фальшивую фреймворк, которая позволяет вам фальсифицировать не виртуальные функции. Я автор HippoMocks (отказ от нейтралитета и т.д.), И мы недавно добавили способность имитировать простые функции C на платформах X86. Это может быть расширено для не виртуальных функций-членов с небольшим количеством работы и будет тем, что вы ищете. Имейте в виду, что если ваш компилятор может одновременно увидеть как использование, так и определение функции, чтобы она могла встроить его и что издевательство может завершиться неудачно. Это относится, в частности, к функциям, определенным в заголовках.

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

Ответ 3

Одним из подходов будет указание различных источников для тестирования. Скажем, ваша производственная цель использует rootModule.h и rootModule.cpp. Используйте разные источники для вашей цели тестирования. Вы можете указать другой заголовок, изменив ваш путь включения, так что #include "rootModule.h" действительно загружает unittest/rootModule.h. Затем смоделируйте rootModule для вашего сердца.