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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:30