You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP-IDF中使用Unity进行C++组件单元测试未检测到测试用例

解决ESP-IDF C++组件Unity单元测试无法被识别的问题

问题背景

基于ESP-IDF的多组件C++项目中,为switches组件编写的Unity单元测试无法被测试框架识别。测试代码放在组件目录的test子文件夹,已配置组件测试目录的CMakeLists.txt,并生成了unity-app测试项目,但烧录后测试用例未被执行。

核心原因

  1. C++名称修饰(Name Mangling):Unity是C语言框架,无法识别被C++编译器修改后的函数名称,导致测试函数和回调函数(setUp/tearDown)无法被框架找到。
  2. 测试函数未注册到Unity测试集合:原测试代码手动调用RUN_TEST,但unity-app的主入口使用unity_run_all_tests(),需要测试函数通过Unity宏自动注册。
  3. CMake配置未明确启用C++支持:组件测试目录的CMake可能未正确配置C++编译选项,导致测试代码未被正确编译。

解决步骤

1. 为测试函数和回调函数添加C语言链接

修改test_switches.cpp,将setUp、tearDown和测试函数用extern "C"包裹,避免C++名称修饰:

#include "unity.h"
#include "driver/gpio.h"
#include "switches.hpp"

Switches* switches = nullptr;

extern "C" {
    void setUp(void) {
        switches = Switches::get_instance();

        switches->set_switch_m1_state(SWITCH_M1_A);
        switches->set_switch_m2_state(SWITCH_M2_D);
        switches->set_switch_m3_state(SWITCH_M3_D);
        switches->set_switch_m4_state(SWITCH_M4_GO);
        switches->set_switch_m5_state(SWITCH_M5_F);
    }

    void tearDown(void) {
        // 若Switches类有销毁实例的方法,在此调用避免内存泄漏
        // switches->destroy_instance();
        switches = nullptr;
    }

    TEST_CASE("Verify Switch M1 state transitions", "[switches]") {
        switches->set_switch_m1_state(SWITCH_M1_B);
        TEST_ASSERT_EQUAL(SWITCH_M1_B, switches->get_switch_m1_state());
        // 若需要测试GPIO,确保已模拟或硬件连接正常
        // TEST_ASSERT_EQUAL(1, gpio_get_level(SWITCH_M1_PIN1));
        // TEST_ASSERT_EQUAL(0, gpio_get_level(SWITCH_M1_PIN2));
    }
}

注意:使用TEST_CASE宏替代手动RUN_TEST,该宏会自动将测试函数注册到Unity的测试集合中,供unity_run_all_tests()调用。

2. 确保组件测试目录的CMake启用C++支持

修改switches/test/CMakeLists.txt,添加C标准配置,确保CMake用C编译器编译测试代码:

idf_component_register(SRCS "test_switches.cpp"
                    INCLUDE_DIRS "."
                    REQUIRES unity switches)

# 启用C++17支持(根据项目需求调整版本)
set_target_properties(${COMPONENT_LIB} PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON)

3. 验证switches组件本身的CMake配置

确保components/switches/CMakeLists.txt正确配置C++编译,示例:

idf_component_register(SRCS "switches.cpp"
                    INCLUDE_DIRS "."
                    REQUIRES driver)

set_target_properties(${COMPONENT_LIB} PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON)

4. 清理构建缓存并重新编译

在unity-app目录下执行以下命令清理缓存,避免旧编译产物干扰:

idf.py clean
idf.py build flash monitor

验证结果

烧录后,串口终端应输出类似如下内容,表明测试用例被识别并执行:

#### Unity test runner #####

Total test count: 1

Running test: Verify Switch M1 state transitions...PASS

-----------------------
1 Tests 0 Failures 0 Ignored
OK

内容的提问来源于stack exchange,提问作者Lucas Schaffner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:57:25