Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌入式系统的谷歌测试_C++_C_Unit Testing_Embedded_Googletest - Fatal编程技术网

C++ 嵌入式系统的谷歌测试

C++ 嵌入式系统的谷歌测试,c++,c,unit-testing,embedded,googletest,C++,C,Unit Testing,Embedded,Googletest,我想使用谷歌测试为我的嵌入式应用软件编写单元测试 这些测试将在C++编写的应用软件上进行。应用软件使用的驱动程序(例如,I2C,SPI),故障断言都是用C编写的。我的问题是: 什么地方是出发的好地方?我指的是我可以阅读的资源,以了解更多关于在嵌入式环境中使用谷歌测试的信息 我如何开始模拟我的驱动程序文件?例如,如果我有一个空白读取(UTI88T地址)< /C>函数,在我的I2C库中,我如何去嘲笑这个函数,以便这个特殊函数在我的C++类中被调用? 这些C++驱动程序文件也包含在我的C++文件中。我

我想使用谷歌测试为我的嵌入式应用软件编写单元测试

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

  • 什么地方是出发的好地方?我指的是我可以阅读的资源,以了解更多关于在嵌入式环境中使用谷歌测试的信息
  • 我如何开始模拟我的驱动程序文件?例如,如果我有一个<代码>空白读取(UTI88T地址)< /C>函数,在我的I2C库中,我如何去嘲笑这个函数,以便这个特殊函数在我的C++类中被调用?<李> 这些C++驱动程序文件也包含在我的C++文件中。我尝试编译一个裸测试文件,只包含C++类头,并且编译问题,因为编译器找不到驱动程序头。我怎样才能避免这个问题
  • 使用驱动程序库中的代码失败断言管理失败断言需要系统重置。我如何在测试中模拟这一点
  • 我不知道使用Gtest进行测试的具体资源 裸金属靶测试,但一般来说是一个良好的起点 要看报纸吗 根据您的软件架构,甚至可能是。后者在测试应用程序相关类而不仅仅是低级驱动程序时可能非常有用
  • 有几种选择。到目前为止,我所看到的最常见的一种是针对目标和运行测试的平台有两种不同的实现。例如,您可能有两个文件

    • ic2.c
    • i2c_x86.cpp

      根据您当前是为目标还是为测试平台编译,您可以使用其中一个。

    另一个选择是将C实现提升到C++,并在驱动程序周围编写类包装器。这将允许您从C++特性中获益,并使用依赖注入、继承、CRTP等……

  • 我不知道你想要什么

  • Gtest有一个断言死亡测试,例如,我当前的代码库包含以下测试


  • 我最近用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,在目标上构建、下载和运行整个应用程序

    回答您的问题:

  • 正如其他人已经说过的,从开始,不要担心嘲笑,只是掌握使用gTest的诀窍。提供一些内存检查(泄漏)的一个好选择是。我稍微偏爱gTest语法来派生设置类。Cpputest可以运行用gTest编写的测试。两者都是很好的框架

  • 我过去常嘲弄和打短棍。它的使用非常简单,并且提供了一个好的模拟框架所期望的一切:设置不同的返回值、传递回调、检查参数调用历史记录等等。我想试一试。到目前为止,FFF非常棒

  • 我不这么做。我用C++编译器(我的G+)编译测试框架和测试,以及用C编译器(GCC)嵌入代码,然后把它们链接在一起。从下面的示例中,您将看到,在C文件中不包含C++头文件。当链接测试时,除了要模拟的函数的C源文件之外,您将链接所有的东西

  • 使用驱动程序库中的代码失败断言管理失败断言需要系统重置。我如何在测试中模拟这一点

    我会模拟reset函数,添加一个回调函数来“reset”你需要的任何东西

    假设您要测试使用
    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());
    }