Ceedling/CMock: как сделать части файла .h видимыми только для Cmock
В моем модуле есть функции вроде макросов. Это не препятствие для тестирования модуля, но препятствие для других модулей, которые включают этот модуль.
Мой вопрос: есть ли способ сделать часть файла.h видимой только для CMock?
например:
Module_1.h:
#ifdef MODULE_TEST_CMOCK
void FunctionLikeMacro_1(unsigned int x);
unsigned int FunctionLikeMacro_2(void);
#else
#define FunctionLikeMacro_1(x) (HWREGISTER_1 = (unsigned int)x)
#define FunctionLikeMacro_2 ((unsigned int)HWREGISTER_2)
#endif
Я бы предпочел именно так. Но где мне определить MODULE_TEST_CMOCK? Я не могу определить его в Project.yml, потому что с этим изменением мои модульные тесты для Module_1 не будут работать. Но, с другой стороны, в моих модульных тестах для Module_2, для которых требуется фиктивная версия Module_1.h, я не могу ожидать вызовов FunctionLikeMacro_1 и FunctionLikeMacro_2.
Спасибо за ваше время.:)
2 ответа
Согласно с docs/CeedlingPacket.md
, вы можете добавить определенные определения в каждый тестовый файл, который должен быть скомпилирован в :defines:
раздел в project.yml
:
определяет: определения командной строки, используемые при компиляции теста и выпуска настроенными инструментами
...
<test_name>
:Добавить определения препроцессора для указанного. Например:
:defines: :test_foo_config: - FOO_SPECIFIC_FEATURE
Итак, в вашем случае вам нужно будет добавить MODULE_TEST_CMOCK
для всех тестовых файлов, в которых нужно имитировать Module_1.h для :defines:
секитон в project.yml
.
Я попробовал это, используя ваш пример файла заголовка двух тестовых файлов: test/test_module1.c
который включал Module_1.h
прямо и test/test_module2.c
который включал mock_Module_1.h
. Я добавил это в свойproject.yml
:
:defines:
:test_module2:
- MODULE_TEST_CMOCK
И это вроде нормально работало. Я мог бы использоватьFunctionLikeMacro_2_IgnoreAndReturn()
от test/test_module2.c
и тесты вели себя так, как ожидалось, в то время как макросы использовались непосредственно для тестов в test/test_module1.c
.
Когда Ceedling компилирует и строит ваши тесты, он делает это с определенным набором TEST, поэтому вы можете писать файлы заголовков, чтобы изменить их характер при компиляции для тестирования. Так, например, если вы выполняете встроенную работу и все операции ввода-вывода в регистр выполняете с помощью макросов, вы можете преобразовать их в функции для модульного тестирования, а затем просто имитировать их.
// my_reg_io.h
#ifndef TEST // production code
#define WRITE_REG(add, val) *(add) = (val)
#define READ_REG(add) *(add)
#else // test code
// mockable prototypes
void _my_fake_write(void *add, int val);
int _my_fake_read(void *add);
#define WRITE_REG(add, val) _my_fake_write((add), (val))
#define READ_REG(add) _my_fake_read(add)
#endif
В случае чтения вы можете использовать макет заглушки, чтобы внедрить поведение в свой код для тестирования аппаратных интерфейсов без необходимости в оборудовании. Супер полезно.