我正在为C++中基于Cortex-M4的微控制器开发软件。我有很多代码(司机等等)这是高度依赖机器的。并且我有更高级别的代码,直接使用驱动程序,这与底层代码密切相关。一个低级的部分是例如。UART驱动程序是一种基于UART的通信协议,它是一个硬件专用的驱动程序,是一个高级的部分。(这个软件运行于“裸金属”,即。(下面没有操作系统。)
此代码目前是紧密耦合的,因此无法进行单元测试。
我想让它更易测试。
所以我想,我应该创建一个低级别部件的抽象,并使高级别部件只依赖于抽象。然后,我可以创建将由单元测试使用的抽象的模拟,以及在微控制器上运行的真正的实现。
virtual函数。还有什么其他方法吗?因此,总之,我想创建一个硬件抽象层(HAL),但是我想问如何做到这一点呢?我是应该在virtual中使用C++继承,还是有其他更好的方法?
发布于 2017-07-19 16:06:22
对于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 like定义函数,并在这里不提供任何实现:
void func1();
void func2();然后创建一个HAL.cpp,并在目标上添加您希望看到的功能。将所有这些创建为名为HAL的库。将此库链接到您的主项目。
现在是嘲笑和测试。为测试创建一个单独的项目。添加要测试的源,但不要链接HAL库。相反,创建另一个源文件Mock.cpp包括HAL.h并为其提供实现。这样,将调用Mock的实现,而不是从HAL库中调用您的功能。
发布于 2017-07-19 16:51:21
在模拟HAL中单独创建微控制器HAL。对于微控制器,在您的项目中包括微控制器HAL源。对于单元测试系统,请在项目中包含模拟HAL源。
您还可以使用编译器宏定义来切换模拟HAL的片段,并切换出微控制器HAL的各个部分,从而对目标进行测试。
您甚至可以使用调试器强制在接口点处的值触发所有路径;使用代码覆盖工具进行此操作将使您知道是否已经使用了所有路径(如果需要,还可以使用MC/DC )。这有时是模拟硬件故障或异常情况的唯一方法。
https://stackoverflow.com/questions/45195006
复制相似问题