ESP-IDF中使用Unity进行C++组件单元测试未检测到测试用例
解决ESP-IDF C++组件Unity单元测试无法被识别的问题
问题背景
基于ESP-IDF的多组件C++项目中,为switches组件编写的Unity单元测试无法被测试框架识别。测试代码放在组件目录的test子文件夹,已配置组件测试目录的CMakeLists.txt,并生成了unity-app测试项目,但烧录后测试用例未被执行。
核心原因
- C++名称修饰(Name Mangling):Unity是C语言框架,无法识别被C++编译器修改后的函数名称,导致测试函数和回调函数(
setUp/tearDown)无法被框架找到。 - 测试函数未注册到Unity测试集合:原测试代码手动调用
RUN_TEST,但unity-app的主入口使用unity_run_all_tests(),需要测试函数通过Unity宏自动注册。 - 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
相关产品推荐
相关产品推荐

