我想使用Google测试为嵌入式应用程序软件编写单元测试。
这些测试将在用C ++编写的应用程序软件上执行。应用软件正在使用的驱动程序(例如I2C
,SPI
),故障断言都用C编写。我的问题是:
void read(uint8_t address)
函数,该如何模拟该函数,以便在我的C ++类中调用此特定函数?
- 什么会是一个很好的起点?
示波器存储:)您根本无法使用某些PC编程测试套件来测试硬件的行为。这样做将是毫无意义和人为的。
- 我该如何模拟驱动程序文件?
通常不通过模拟来测试驱动程序,而是通过使用测试用例轰炸它们。您需要到底要测试什么?重要的是您要有一个适当的规范,而不仅仅是“一般地测试”。
在理想的嵌入式乌托邦中,规范中的每个功能要求都对应一个软件,而软件又对应一个测试。测试的目的是查看软件是否符合要求。
在现实世界中,事情很少像那样理想,您需要测试的东西不在规范中。例如,在SPI中,您肯定要使用示波器测试波特率,时钟极性和时钟相位。并从以下开始:根本没有实时数据吗?
- 这些用C编写的驱动程序文件也包含在我的C ++文件中。我尝试编译仅包含我的C ++类标头的裸露的Test文件,但是由于编译器找不到驱动程序标头,因此出现了编译问题。如何避免此问题?
不可能说,可以是任何东西。缺少包括,缺少构建中的文件,链接器设置和打ic。不过,最好还是将测试作为一个单独的固件项目进行。
- 使用代码管理失败的断言-驱动程序库中的失败断言,要求系统重置。如何在测试中模拟?
嵌入式系统应避免类似assert
和C ++异常的情况。相反,应该实现一个自定义的错误处理程序,该错误处理程序通过恢复到安全/操作前的状态以有意义的方式处理错误,然后在某些总线上或对特定硬件有意义的任何地方使用记录/发送错误代码。
从测试人员的角度来看,我会将包含断言或异常的所有内容发送回程序员,并告诉他们取消对代码的处理。当然,这应该通过公司编码规则解决。
有几种选择。到目前为止,我看到的最常见的是针对目标和运行测试的平台有两种不同的实现。所以例如您可能有两个文件
[另一种选择是将C实现提升为C ++,并在驱动程序周围编写类包装器。这将使您受益于C ++功能并使用诸如依赖注入,继承,CRTP等功能。]]
不确定我了解您的要求。
Gtest具有ASSERT_DEATH测试,例如我当前的代码库包含以下测试
// 2 byte message does not fit 14bit, assertion triggered
ASSERT_DEATH(encode_datagram(make_datagram(0, 64, 0)), ".*");