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

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

Другие вопросы по тегам