嵌入式系统的Google测试

问题描述 投票:0回答:2

我想使用Google测试为嵌入式应用程序软件编写单元测试。

这些测试将在用C ++编写的应用程序软件上执行。应用软件正在使用的驱动程序(例如I2CSPI),故障断言都用C编写。我的问题是:

  1. 什么地方是开始的好地方?我的意思是我可以阅读参考资料,以了解有关在嵌入式环境中使用Google Test的更多信息。
  2. 我该如何模拟驱动程序文件?例如,如果我在I2C库中有一个void read(uint8_t address)函数,该如何模拟该函数,以便在我的C ++类中调用此特定函数?
  3. 这些用C编写的驱动程序文件也包含在我的C ++文件中。我尝试编译仅包含我的C ++类标头的裸露的Test文件,但是由于编译器找不到驱动程序标头,因此出现了编译问题。如何避免此问题?
  4. 使用代码管理失败的断言-驱动程序库中的失败断言,要求系统重置。如何在测试中模拟?
c++ c unit-testing embedded googletest
2个回答
0
投票
  1. 什么会是一个很好的起点?

示波器存储:)您根本无法使用某些PC编程测试套件来测试硬件的行为。这样做将是毫无意义和人为的。

  1. 我该如何模拟驱动程序文件?

通常不通过模拟来测试驱动程序,而是通过使用测试用例轰炸它们。您需要到底要测试什么?重要的是您要有一个适当的规范,而不仅仅是“一般地测试”。

在理想的嵌入式乌托邦中,规范中的每个功能要求都对应一个软件,而软件又对应一个测试。测试的目的是查看软件是否符合要求。

在现实世界中,事情很少像那样理想,您需要测试的东西不在规范中。例如,在SPI中,您肯定要使用示波器测试波特率,时钟极性和时钟相位。并从以下开始:根本没有实时数据吗?

  1. 这些用C编写的驱动程序文件也包含在我的C ++文件中。我尝试编译仅包含我的C ++类标头的裸露的Test文件,但是由于编译器找不到驱动程序标头,因此出现了编译问题。如何避免此问题?

不可能说,可以是任何东西。缺少包括,缺少构建中的文件,链接器设置和打ic。不过,最好还是将测试作为一个单独的固件项目进行。

  1. 使用代码管理失败的断言-驱动程序库中的失败断言,要求系统重置。如何在测试中模拟?

嵌入式系统应避免类似assert和C ++异常的情况。相反,应该实现一个自定义的错误处理程序,该错误处理程序通过恢复到安全/操作前的状态以有意义的方式处理错误,然后在某些总线上或对特定硬件有意义的任何地方使用记录/发送错误代码。

从测试人员的角度来看,我会将包含断言或异常的所有内容发送回程序员,并告诉他们取消对代码的处理。当然,这应该通过公司编码规则解决。


0
投票
  1. 我不知道将Gtest用于裸机目标测试,但总体而言,一个好的起点被读取Gtest Primer甚至取决于您的软件架构Gmock documentation。当测试应用程序相关事件类而不仅仅是低级驱动程序时,后者可能会很有用。
  2. 有几种选择。到目前为止,我看到的最常见的是针对目标和运行测试的平台有两种不同的实现。所以例如您可能有两个文件

    • ic2.c
    • i2c_x86.cpp并根据您当前是针对目标平台还是测试平台进行编译,可以使用其中之一。

    [另一种选择是将C实现提升为C ++,并在驱动程序周围编写类包装器。这将使您受益于C ++功能并使用诸如依赖注入,继承,CRTP等功能。]]

  3. 不确定我了解您的要求。

  4. Gtest具有ASSERT_DEATH测试,例如我当前的代码库包含以下测试

  5.       // 2 byte message does not fit 14bit, assertion triggered
          ASSERT_DEATH(encode_datagram(make_datagram(0, 64, 0)), ".*");
    
© www.soinside.com 2019 - 2024. All rights reserved.