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

时间:2017-07-19 15:30:01

标签: c++ unit-testing embedded abstraction

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

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

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

  • 这是正确的做法吗?
  • 我如何创造这样的抽象? 大多数sources I've found强烈反对在嵌入式系统中使用继承和virtual函数。还有其他什么方法?

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

2 个答案:

答案 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)。这有时是模拟硬件故障或异常情况的唯一方法。