Ответ 1
Я бы написал Perl/Ruby/Python script для чтения в исходном исходном дереве и выкинул издеваемое исходное дерево в другом каталоге. Вам не нужно полностью анализировать С++, чтобы заменить определение функции.
Я довольно новый разработчик программного обеспечения, который в настоящее время работает над добавлением модульных тестов к существующему проекту С++, который начался несколько лет назад. Из-за нетехнической причины мне не разрешено изменять какой-либо существующий код. Базовый класс всех моих модулей содержит множество методов для настройки/получения данных и общения с другими модулями.
Поскольку я просто хочу тестировать каждый отдельный модуль, я хочу иметь возможность использовать консервированные значения для всех моих методов взаимодействия между модулями. То есть для метода 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 для меня новичок, так что использовать макет объектов даже правильный подход?
Я бы написал Perl/Ruby/Python script для чтения в исходном исходном дереве и выкинул издеваемое исходное дерево в другом каталоге. Вам не нужно полностью анализировать С++, чтобы заменить определение функции.
Существуют несколько способов замены не виртуальных функций. Один из них состоит в том, чтобы повторно объявить их и скомпилировать новый тестовый исполняемый файл для каждого другого набора не виртуальных функций, которые вы хотите протестировать. Это вряд ли возможно.
Второй вариант - сделать их виртуальными для тестирования. Большинство компиляторов позволяют вам определить что-то в командной строке, поэтому скомпилируйте свой код с помощью -DTEST_VIRTUAL = virtual или -DTEST_VIRTUAL, чтобы сделать их виртуальными или нормальными в зависимости от того, тестируется ли это или нет.
Третий вариант, который может быть полезен, - использовать фальшивую фреймворк, которая позволяет вам фальсифицировать не виртуальные функции. Я автор HippoMocks (отказ от нейтралитета и т.д.), И мы недавно добавили способность имитировать простые функции C на платформах X86. Это может быть расширено для не виртуальных функций-членов с небольшим количеством работы и будет тем, что вы ищете. Имейте в виду, что если ваш компилятор может одновременно увидеть как использование, так и определение функции, чтобы она могла встроить его и что издевательство может завершиться неудачно. Это относится, в частности, к функциям, определенным в заголовках.
Если для вас достаточно регулярной функции C, вы можете использовать ее так, как она есть сейчас.
Одним из подходов будет указание различных источников для тестирования. Скажем, ваша производственная цель использует rootModule.h
и rootModule.cpp
. Используйте разные источники для вашей цели тестирования. Вы можете указать другой заголовок, изменив ваш путь включения, так что #include "rootModule.h"
действительно загружает unittest/rootModule.h
. Затем смоделируйте rootModule для вашего сердца.