C++ 嵌入式系统的谷歌测试
我想使用谷歌测试为我的嵌入式应用软件编写单元测试 这些测试将在C++编写的应用软件上进行。应用软件使用的驱动程序(例如,C++ 嵌入式系统的谷歌测试,c++,c,unit-testing,embedded,googletest,C++,C,Unit Testing,Embedded,Googletest,我想使用谷歌测试为我的嵌入式应用软件编写单元测试 这些测试将在C++编写的应用软件上进行。应用软件使用的驱动程序(例如,I2C,SPI),故障断言都是用C编写的。我的问题是: 什么地方是出发的好地方?我指的是我可以阅读的资源,以了解更多关于在嵌入式环境中使用谷歌测试的信息 我如何开始模拟我的驱动程序文件?例如,如果我有一个空白读取(UTI88T地址)< /C>函数,在我的I2C库中,我如何去嘲笑这个函数,以便这个特殊函数在我的C++类中被调用? 这些C++驱动程序文件也包含在我的C++文件中。我
I2C
,SPI
),故障断言都是用C编写的。我的问题是:
- ic2.c
- i2c_x86.cpp
根据您当前是为目标还是为测试平台编译,您可以使用其中一个。
另一个选择是将C实现提升到C++,并在驱动程序周围编写类包装器。这将允许您从C++特性中获益,并使用依赖注入、继承、CRTP等……
我最近用gTest测试了一个Arm Cortex-M3内核的FAT文件系统和引导加载程序实现,所以我留下两分钱 嵌入式软件测试提出了一个问题,即不可能通过模拟来复制硬件环境。我提出了三组测试: A) 在我的PC上运行的单元测试(我在中使用)。我使用这些测试来开发我的应用程序逻辑。这就是我需要嘲弄/存根的地方。我的公司使用硬件抽象层(HAL),这就是我所嘲笑的。如果您想编写可测试代码,最后一位是最基本的
/* this is not testable */
my_register->bit0 = 1;
/* this is also not testable */
*my_register |= BIT0;
不要直接访问寄存器,使用一个简单的HAL包装函数,可以模拟:
/* this is testable */
void set_bit(uint32_t* reg, uint8_t bit)
{
*reg |= bit;
}
set_bit(my_register , BIT0);
后者是可测试的,因为您将模拟set\u bit
函数,从而打破对硬件的依赖
B) 对目标进行单元测试。这是一组比(a)小得多的测试,但它仍然非常有用,特别是在测试驱动程序和HAL函数时。这些测试背后的想法是,我可以正确地测试我将要模拟的函数。因为它在目标上运行,所以我需要尽可能简单和轻量级的,所以我使用,这是一个C头文件。我已经在Cortex-M3内核和专有DSP代码上运行了MinUnit目标测试(没有任何修改)。我在这里也使用了TDD
C) 集成测试。我在这里使用Python和Behave,在目标上构建、下载和运行整个应用程序
回答您的问题:
read
功能的read\u temperature
功能。下面是一个使用FFF进行模拟的gTest示例
hal_i2c.h
/* Low-level driver function */
uint8_t read(uint8_t address);
读取温度.h
/* Reads the temperature from the I2C sensor */
float read_temperature(void);
读取温度c
#include <hal_i2c.h>
float read_temperature(void)
{
unit8_t raw_value;
float temp;
/* Read the raw value from the I2C sensor */
raw_value = read(0xAB);
/* Convert the raw value */
temp = ((float)raw_value)/0.17+273;
return temp;
}
希望这有帮助!干杯 您将如何将嵌入式系统中GoogleTest的输出发送到PC?一个想法是将读取I2C的调用替换为读取文件的函数。这将是一个存根或模拟I2C功能。我强烈建议在PC上执行测试和模拟。我将沿着这些路线进行。测试将在PC机上进行,而不是在微控制器上进行。我正在仔细研究这个资源-。虽然这里的应用程序是用C编写的,但我的例子恰好是C++,所以在我的例子中,它有点混乱。这是一个嵌入式系统吗?听起来像是伪装的个人电脑
#include <hal_i2c.h>
float read_temperature(void)
{
unit8_t raw_value;
float temp;
/* Read the raw value from the I2C sensor */
raw_value = read(0xAB);
/* Convert the raw value */
temp = ((float)raw_value)/0.17+273;
return temp;
}
#include <gtest/gtest.h>
#include <fff.h>
extern "C"
{
#include <hal_i2c.h>
#include <read_temperature.h>
}
DEFINE_FFF_GLOBALS;
// Create a mock for the uint8_t read(uint8_t address) function
FAKE_VALUE_FUNC(uint8_t , read, uint8_t);
TEST(I2CTest, test_read) {
// This clears the FFF counters
RESET_FAKE(read);
// Set the raw temperature value
read_fake.return_val = 0xAB;
// Make sure that we read 123.4 degrees
ASSERT_EQ((float)123.4, read_temperature());
}