Какую структуру я должен иметь для насмешки над классом встроенных систем для тестирования настольных компьютеров? - PullRequest
2 голосов
/ 06 июня 2019

Я создаю встроенное приложение на C ++, но я хочу проверить его с помощью традиционных методов непрерывной интеграции. Я работаю над библиотекой, которая зависит от функций оборудования, таких как печать, вывод на вывод, чтение аналоговых данных и т. Д. Позволяет вызывать библиотеку lib и ядро ​​аппаратных функций (hardware.h). У меня есть фиктивный класс, который охватывает все эти функции (hardware.h). Проблема в том, что когда я компилирую код для встроенного приложения, мне нужно включить заголовочный файл для определений аппаратного обеспечения, но я хочу поменять его на ложный заголовок, когда я хочу провести тестирование. Есть ли способ заставить Cmake сделать это? Должен ли я делать это по-другому? Мы ценим любые предложения.

Я сделал эту работу в IDE и тому подобном, но никогда не использовал cmake и непрерывную интеграцию.

-Lib
 --src
  ---button.h
  ---button.cpp
 --test
  ---testButton.cpp
-core
 ---hardware.h
-Mock
 ---hardware.h
//button.h
#include hardware.h
setPinMode(Input);

Есть ли способ заставить cmake связать правильный hardware.h с макетом во время отладки и ядром во время выпуска?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Мы обычно имеем дело с этим следующим образом:

--lib
 ---hardware_interface.h
 ---etc
--MCU_TYPE
 ---main.cpp
 ---hardware_mcu_type.h
 ---hardware_mcu_type.cpp
--test
 ---main.cpp
 ---hardware_mock.h

Как видите, у нас есть общая папка с общим кодом. Весь код в библиотеке использует класс интерфейса hardware_interface.h (у нас часто есть несколько интерфейсов для I2C, SPI, UART и т. Д., Все они определены в отдельных файлах). Все классы, использующие определенный интерфейс, имеют функцию для установки указателя или ссылки на интерфейс. Это делается в файлах main.cpp.

Теперь эти интерфейсы чисто виртуальные. При создании приложения, таким образом, требуется заполнить их. Это то, где или hardware_mcu_type.h или hardware_mock.h входят. В основном для фактического mcu используются фактические аппаратные реализации. При тестировании на ПК используются фиктивные объекты.

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

Примечание : пожалуйста, обратите внимание, что доступ к памяти и ее распределение сложно проверить на другой платформе, поскольку это может отличаться. Модульные тесты лучше всего ориентированы на логику тестирования.

0 голосов
/ 07 июня 2019

Объявите макрос «MOCK_TEST», который, когда он определен, вызывает компиляцию вашего ложного кода, а когда он не определен, вызывает компиляцию встроенного уровня аппаратной абстракции. Таким образом, вы можете выборочно скомпилировать макет / HAL.

//------ hardware.cpp ------
#ifdef MOCK_TEST
<Mock code>
#elif
<HAL code>
#endif

Передайте этот макрос, используя опцию компилятора -D (в gcc) при компиляции макета.

$CC -c -DMOCK_TEST hardware.cpp (for compiling mock)

Объедините эти изменения для двух целей, которые вы определяете в CMake.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...