我应该有什么样的结构来模拟用于桌面测试的嵌入式系统类? 我在C++中构建了一个嵌入式应用程序,但是我想通过传统的连续集成技术来测试它。我正在开发一个依赖于硬件功能的库,如打印、输出到引脚、读取模拟数据等。。让我们调用库lib和硬件函数core(hardware.h)。我有一个模拟类,它涵盖了所有这些函数(hardware.h)。问题是,当我为嵌入式应用程序编译代码时,我需要为硬件定义包含一个头文件,但当我想进行测试时,我想将其替换为模拟头文件。有没有办法让Cmake做到这一点?我应该用另一种方式吗?如有任何建议,将不胜感激

我应该有什么样的结构来模拟用于桌面测试的嵌入式系统类? 我在C++中构建了一个嵌入式应用程序,但是我想通过传统的连续集成技术来测试它。我正在开发一个依赖于硬件功能的库,如打印、输出到引脚、读取模拟数据等。。让我们调用库lib和硬件函数core(hardware.h)。我有一个模拟类,它涵盖了所有这些函数(hardware.h)。问题是,当我为嵌入式应用程序编译代码时,我需要为硬件定义包含一个头文件,但当我想进行测试时,我想将其替换为模拟头文件。有没有办法让Cmake做到这一点?我应该用另一种方式吗?如有任何建议,将不胜感激,c++,cmake,mocking,embedded,gmock,C++,Cmake,Mocking,Embedded,Gmock,我已经在IDE中完成了这项工作,但从未使用cmake和持续集成 -Lib --src ---button.h ---button.cpp --test ---testButton.cpp -core ---hardware.h -Mock ---hardware.h 有没有办法让cmake在调试期间将正确的hardware.h链接到mock,并在发布期间将内核链接到mock?声明一个宏“mock_TEST”,它在定义时会导致编译模拟代码,在未定义时会导致编译嵌入式硬件抽象层

我已经在IDE中完成了这项工作,但从未使用cmake和持续集成

-Lib
 --src
  ---button.h
  ---button.cpp
 --test
  ---testButton.cpp
-core
 ---hardware.h
-Mock
 ---hardware.h
有没有办法让cmake在调试期间将正确的hardware.h链接到mock,并在发布期间将内核链接到mock?

声明一个宏“mock_TEST”,它在定义时会导致编译模拟代码,在未定义时会导致编译嵌入式硬件抽象层。通过这种方式,您可以有选择地编译mock/HAL

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

为您在CMake中定义的两个目标整合这些更改。

我们通常通过以下方式处理此问题:

--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\u mcu\u type.h
hardware\u mock.h
的作用。对于实际的mcu,主要使用实际的硬件实现。在pc上进行测试时,将使用模拟对象

您确实需要在
CMakeLists.txt
文件中至少设置一个开关,以便为不同的版本生成不同的文件


旁注:请注意,内存访问和分配很难在不同的平台上测试,因为这可能会有所不同。单元测试最好集中在测试逻辑上。

欢迎访问stackoverflow.com!请分享您尝试使用的cmake命令,以便社区能够帮助解决问题。听起来这是一个合理的计划。我推荐一个调整:使用一个hardware.h来抽象所有的差异,并使用两个hardware.cpp(或其他任何东西),一个用于模拟硬件,另一个用于真实硬件。这样,每个人都包含相同的标题和指向目标的相应hardware.cpp的链接。编译器什么都不知道,链接器处理一切。硬件抽象上的代码保持不变。这使得在模拟上执行的测试更有可能对真实目标有效。非常感谢您的想法!这肯定会奏效,但我不确定我是否理解如何实施它。在头文件中,您将定义一些测试单元测试构建的条件,并添加到相应的头文件中?非常感谢您的想法!如果我理解正确,这将起作用,但需要集成模拟库和HAL库。我想这对我来说可能太难维护了。好吧,我错过了mock和hal是库的细节,而不仅仅是对象文件。如果mock和HAL是两个独立的库,提供相同的api集(相同的头文件),那么应该比这更简单。在链接时,检查是否定义了模拟测试宏。如果是,则链接模拟库,否则链接HAL库。同样,根据这个宏编译库。这正是我想要做的!有没有可能发布一个简短的cmake示例?在Makefile中很容易做到。需要看看如何在CMake中实现。
$CC -c -DMOCK_TEST hardware.cpp (for compiling mock)
--lib
 ---hardware_interface.h
 ---etc
--MCU_TYPE
 ---main.cpp
 ---hardware_mcu_type.h
 ---hardware_mcu_type.cpp
--test
 ---main.cpp
 ---hardware_mock.h