如何对嵌入代码进行单元测试?

Ven*_*emo 4 c++ embedded unit-testing abstraction

我正在为C++中基于Cortex-M4的微控制器开发软件.我有很多代码高度依赖于机器的代码(驱动程序等).我有更高级别的代码,它通过直接使用驱动程序密切依赖于低级代码.示例:低级别部分是例如.UART驱动程序,它是非常特定于硬件的,而高级部分是基于UART的通信协议.(该软件在"裸机"上运行,即下面没有操作系统.)

此代码目前紧密耦合,因此无法进行单元测试.
我想让它变得可测试.

所以我想我会创建一个低级部分的抽象,并使高级部分仅依赖于抽象.然后,我可以创建抽象的模拟,这些模拟将由单元测试使用,并且可以在微控制器上运行.

  • 这是正确的方法吗?
  • 我怎样才能创建这样的抽象?我发现的
    大多数资源 强烈反对virtual在嵌入式系统中使用继承和函数.还有其他什么方法?

总而言之,我想创建一个硬件抽象层(HAL),但我问的是如何做到这一点?我应该virtual在C++中使用继承,还是有另一种更好的方法?

Sam*_*ail 5

对于C++,我建议使用一个接口,所以说我们有一个HAL.hpp并且在那里我们定义了我们想要实现的纯虚函数:

class HAL
{
    virtual void func1() = 0;
    virtual void func2() = 0;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以使用你的Mock.cpp实现,你可以有一个Real.cpp实现相同:

Mock.cpp:
class Mock : HAL
{
        virtual void func1(){ }
        virtual void func2(){ }
}
Run Code Online (Sandbox Code Playgroud)

现在另一种方式是你在HAL.h类似的地方定义你的函数并在这里不提供任何实现:

void func1();
void func2();
Run Code Online (Sandbox Code Playgroud)

然后HAL.cpp,您可以在目标上创建并添加要在其中查看的功能.将所有这些创建为名为HAL的库.将此库链接到您的主项目.

现在进行模拟和测试.为测试创建一个单独的项目.添加要测试的源但不链接HAL库.而是创建另一个源文件Mock.cpp包括HAL.h并为其提供实现.这样就可以调用Mock的实现来代替HAL库中的功能.