我正在使用C ++的基于Cortex-M4的微控制器软件。我有很多代码高度依赖于机器的代码(驱动程序等)。我有更高级别的代码,它通过直接使用驱动程序密切依赖于低级代码。示例:低级别部分是例如。 UART驱动程序,它是非常特定于硬件的,而高级部分是基于UART的通信协议。 (该软件运行在"裸机",即下面没有操作系统。)
此代码目前紧密耦合,因此无法进行单元测试 我想让它变得可测试。
所以我想我会创建一个低级部分的抽象,并使高级部分仅依赖于抽象。然后,我可以创建抽象的模拟,这些模拟将由单元测试使用,并且可以在微控制器上运行。
virtual
函数。还有其他什么方法?因此,总而言之,我想创建一个硬件抽象层(HAL),但我想问怎么做?我应该在C ++中使用virtual
继承,还是有另一种更好的方法?
答案 0 :(得分:5)
对于C ++,我建议使用一个接口,所以说我们有一个HAL.hpp
,在那里我们定义了我们想要实现的纯虚函数:
class HAL
{
virtual void func1() = 0;
virtual void func2() = 0;
};
然后你可以让你的Mock.cpp
实现这个,你可以让Real.cpp实现同样的目的:
Mock.cpp:
class Mock : HAL
{
virtual void func1(){ }
virtual void func2(){ }
}
现在另一种方式是你在HAL.h
中定义你的函数并在这里不提供任何实现:
void func1();
void func2();
然后,您创建一个HAL.cpp
并添加您希望在目标上看到的功能。将所有这些创建为名为HAL的库。将此库链接到您的主项目。
现在进行模拟和测试。为测试创建一个单独的项目。添加要测试的源但不链接HAL库。而是创建另一个源文件Mock.cpp包括HAL.h并为其提供实现。这样就可以调用Mock的实现来代替HAL库中的功能。
答案 1 :(得分:3)
在模拟HAL的单独文件中创建微控制器HAL。对于微控制器,请在项目中包含微控制器HAL源。对于单元测试系统,在项目中包含模拟HAL源。
您还可以使用编译器宏定义来测试on-target,以切换模拟HAL的各个部分,并切换出微控制器HAL的各个部分。
您甚至可以使用调试器强制接口点的值来触发所有路径;使用代码覆盖工具执行此操作将告诉您是否已执行所有路径(如果需要,还可以使用MC / DC)。这有时是模拟硬件故障或异常情况的唯一方法。