如何对嵌入式代码进行单元测试?
How to make unit tests for embedded code?
我正在为C++的基于Cortex-M4的微控制器开发软件。我有很多高度依赖机器的代码(驱动程序等(。我有更高级的代码,它通过直接使用驱动程序紧密依赖于低级代码。示例:低级部分是例如。一个非常特定于硬件的UART驱动程序,一个高级部分是基于UART的通信协议。(该软件在"裸机"上运行,即下面没有操作系统。
此代码当前是紧密耦合的,因此不可进行单元测试。
我想让它可测试。
所以我想我应该创建一个低级部分的抽象,并使高级部分只依赖于抽象。然后,我可以创建单元测试将使用的抽象的模拟,以及在微控制器上运行的真实实现。
- 这是一种正确的方法吗?
- 如何创建这样的抽象?
我发现的大多数来源都强烈反对在嵌入式系统中使用继承和virtual
函数。还有什么其他方法?
所以,总而言之,我想创建一个硬件抽象层(HAL(,但我问怎么做?我应该在C++中使用virtual
继承,还是有其他更好的方法?
对于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 库的功能。
在模拟 HAL 的单独文件中创建微控制器 HAL。对于微控制器,请在项目中包括微控制器 HAL 源。对于单元测试系统,请在项目中包括模拟 HAL 源。
您还可以使用编译器宏定义在模拟 HAL 的各个部分切换,并切换出微控制器 HAL 的各个部分,从而在目标上进行测试。
您甚至可以使用调试器强制接口点上的值触发所有路径;使用代码覆盖率工具执行此操作会让您知道您是否已经执行了所有路径(如果需要,还可以使用 MC/DC(。这有时是模拟硬件故障或异常情况的唯一方法。
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 如何对嵌入式代码进行单元测试?
- 类型擦除代码的依赖注入单元测试
- 单元测试模板代码
- 对C++代码中的嵌入式 Mono 脚本进行单元测试
- 提升单元测试似乎跳过了应执行的代码
- 在单元测试(Nunit或MSTest)中从C#中调用的C 函数的原因是从控制台应用程序中运行的同一代码的不同结果
- 为c++代码提供单元测试
- 使用Visual Studio对本机VSC++的gtest单元测试进行代码覆盖
- 如何从.exe项目导入代码进行单元测试
- 无法对托管代码运行非托管 CPP 单元测试
- 我们应该在C++单元测试中测试src代码断言(NOT异常)吗
- 对本机C++代码进行单元测试
- 提升单元测试框架:包括我的代码库的主要功能
- 具有大量相互依赖条件的单元测试代码
- 忽略两个C++宏之间的代码(防止创建静态单元测试对象)
- 单元测试失败,异常代码为c0000005
- visual studio是否有任何扩展来优化C++代码单元测试
- 使用Java单元测试c++代码
- 用cpp编写的单元测试代码