【问题标题】:Unit Test a C function with HW interaction使用硬件交互对 C 函数进行单元测试
【发布时间】:2022-02-04 08:55:17
【问题描述】:

您好,我正在使用 platformio 环境为 ESP32 开发 C 项目。 我正在使用 platformio env 提供的统一测试框架。 我想对以下函数进行单元测试

float reading_board_temp(void)
{
    uint32_t adc_reading = 0;
    float board_temp = 0;
    
    for (int i = 0; i < NO_OF_SAMPLES; i++) 
    {
        
        adc_reading += adc1_get_raw((adc1_channel_t)adc_1_ch_board_temp);
        vTaskDelay(TEN_TICKS_DELAY);
  
    }
    adc_reading /= NO_OF_SAMPLES;
    uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars_board_temp);
    board_temp = (voltage - MCP9700AT_OFFSET)/TEMP_DIVIDER; 
    return board_temp;
    
}

这是我一直在platformio中创建的测试文件

#include <Arduino.h>
#include <unity.h>
#include <gpioa_module.h>

void test_board_temp() 
{
     float expected_temp  = 35; 
     float risult_reading = 0;

     risult_reading =  reading_board_temp ();  

     TEST_ASSERT_EQUAL(expected_temp, risult_reading);
}

void setUp(void)
{

}
void tearDown(void)
{

}
void setup() 
{
    // NOTE!!! Wait for >2 secs
    // if board doesn't support software reset via Serial.DTR/RTS
    delay(2000);

    UNITY_BEGIN();
    RUN_TEST(test_board_temp);
    RUN_TEST(test_example2);
    UNITY_END();
}

void loop() 
{

}

当我尝试在 esp32 中进行测试时,它似乎冻结了。

如何测试删除或伪造硬件依赖项的功能?

非常感谢您的热情回复。

【问题讨论】:

  • 只在评论中回答,因为我不知道你的硬件平台及其库。 C 不允许像我们在 Java 程序中使用的那样使用简单的 mocks。我年轻时所做的是构建一个与硬件具有相同功能的存根库(但硬编码响应......),然后我将测试应用程序与那个存根库链接起来。不确定它是否与您的实际用例相关...
  • 同意@SergeBallesta——你想用非常具体的输入来测试那个函数——试图在附加硬件的情况下产生那个会出现问题,除非你可以在某种模拟模式下激发特定的值(这是相当不太可能...)。
  • 顺便说一下,如果您更喜欢商业四舍五入,您可以改用adc_reading = (adc_reading + NO_OF_SAMPLES / 2) / NO_OF_SAMPLES;...

标签: c++ unit-testing esp32 platformio


【解决方案1】:

所以你们建议做这样的事情

#include <stdlib.h>
#include <stdint.h>
#include "gpioa_module_test.h"


float reading_board_temp_test(void)
{

    uint32_t adc_reading = 0;
    float board_temp = 0;
    uint32_t raw_vaue = 34;
    
    for (int i = 0; i < 10; i++) 
    {
        
        adc_reading += raw_vaue;
       
  
    }

    adc_reading /= 10;
    uint32_t voltage = adc_reading / 10;
    board_temp = (voltage - 500)/10; 
    return board_temp;
        
}

现在测试部分变成了

#include <Arduino.h>
#include <unity.h>
#include <gpioa_module_test.h>

void test_board_temp() 
{
     float expected_temp  = 35; 
     float risult_reading = 0;

     risult_reading =  reading_board_temp_test ();  

     TEST_ASSERT_EQUAL(expected_temp, risult_reading);
}

【讨论】:

  • 正确 - Serge Ballesta
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2019-04-06
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多