在Gitlab CI中用Native平台测试Arduino ESP8266单元测试时头文件缺失
问题分析与解决方案
核心原因
ArduinoFake仅模拟标准Arduino核心的基础API,没有内置ESP8266专属库(如ESP8266WiFi)的模拟实现。当业务代码引入这些ESP8266特有的头文件时,Native测试平台找不到对应的库文件,因此编译报错。
解决方案
1. 自定义ESP8266WiFi模拟桩(Mock)
为业务代码中用到的ESP8266WiFi功能手动编写模拟实现,让Native平台能找到对应的头文件和逻辑:
- 在测试目录下新建
mocks文件夹,创建ESP8266WiFi.h文件,只实现业务代码用到的类和方法:// test/mocks/ESP8266WiFi.h #ifndef ESP8266WIFI_H #define ESP8266WIFI_H class WiFiClass { public: int begin(const char* ssid, const char* pass) { // 模拟WiFi连接成功,返回值可根据测试场景调整 return 1; } bool isConnected() { return true; } // 补充业务代码用到的其他WiFi方法 }; extern WiFiClass WiFi; #endif - 在
platformio.ini的native测试环境中,添加mock头文件的搜索路径,让编译器优先加载模拟文件:[env:native] platform = native test_framework = unity lib_deps = ArduinoFake build_flags = -I test/mocks # 指向mock文件目录
2. 用条件编译隔离环境代码
在业务代码中通过宏定义区分测试环境与ESP8266实际运行环境,避免测试时加载真实的ESP8266库:
#ifdef TEST_ENV // 测试环境加载mock头文件 #include "ESP8266WiFi.h" #else // 实际环境加载真实库 #include <ESP8266WiFi.h> #endif
同时在platformio.ini的native环境中添加宏定义:
build_flags = -I test/mocks -D TEST_ENV # 定义测试环境宏
3. 替代方案:直接在ESP8266平台测试
若不想编写mock,可直接在ESP8266硬件或模拟器上运行测试,修改platformio.ini添加ESP8266测试环境:
[env:esp8266_test] platform = espressif8266 board = esp12e test_framework = unity lib_deps = ESP8266WiFi
运行测试时执行pio test -e esp8266_test,但Gitlab CI中需配置ESP8266硬件或支持的模拟器,复杂度较高。
内容的提问来源于stack exchange,提问作者Asi
相关产品推荐
相关产品推荐

