首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对嵌入式代码进行单元测试?

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

Stack Overflow用户
提问于 2017-07-19 15:30:00
回答 2查看 2K关注 1票数 6

我正在为C++中基于Cortex-M4的微控制器开发软件。我有很多代码(司机等等)这是高度依赖机器的。并且我有更高级别的代码,直接使用驱动程序,这与底层代码密切相关。一个低级的部分是例如。UART驱动程序是一种基于UART的通信协议,它是一个硬件专用的驱动程序,是一个高级的部分。(这个软件运行于“裸金属”,即。(下面没有操作系统。)

此代码目前是紧密耦合的,因此无法进行单元测试。

我想让它更易测试。

所以我想,我应该创建一个低级别部件的抽象,并使高级别部件只依赖于抽象。然后,我可以创建将由单元测试使用的抽象的模拟,以及在微控制器上运行的真正的实现。

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-07-19 16:06:22

对于C++,我建议使用一个接口,因此假设我们有一个HAL.hpp,在这里我们定义了我们想要实现的纯虚拟函数:

代码语言:javascript
运行
复制
class HAL
{
    virtual void func1() = 0;
    virtual void func2() = 0;
};

然后,您可以让您的Mock.cpp实现这一点,并且您可以使用相同的Real.cpp实现:

代码语言:javascript
运行
复制
Mock.cpp:
class Mock : HAL
{
        virtual void func1(){ }
        virtual void func2(){ }
}

现在,另一种方法是使用HAL.h like定义函数,并在这里不提供任何实现:

代码语言:javascript
运行
复制
void func1();
void func2();

然后创建一个HAL.cpp,并在目标上添加您希望看到的功能。将所有这些创建为名为HAL的库。将此库链接到您的主项目。

现在是嘲笑和测试。为测试创建一个单独的项目。添加要测试的源,但不要链接HAL库。相反,创建另一个源文件Mock.cpp包括HAL.h并为其提供实现。这样,将调用Mock的实现,而不是从HAL库中调用您的功能。

票数 6
EN

Stack Overflow用户

发布于 2017-07-19 16:51:21

在模拟HAL中单独创建微控制器HAL。对于微控制器,在您的项目中包括微控制器HAL源。对于单元测试系统,请在项目中包含模拟HAL源。

您还可以使用编译器宏定义来切换模拟HAL的片段,并切换出微控制器HAL的各个部分,从而对目标进行测试。

您甚至可以使用调试器强制在接口点处的值触发所有路径;使用代码覆盖工具进行此操作将使您知道是否已经使用了所有路径(如果需要,还可以使用MC/DC )。这有时是模拟硬件故障或异常情况的唯一方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45195006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档