1. 项目整体设计与测试方案规划
搞嵌入式这么久,我越来越觉得“功能测试”这四个字才是项目里最容易被低估的环节。很多人写代码能一版跑通,但要问“你怎么证明这个智能插座在 220V 下可靠工作”,十有八九会愣住。这个项目最初的目标其实很纯粹:基于 ESP32 做一款能远程控制、能统计功耗的智能插座,配套一套调试软件来验证各项功能。但真正动手之后才发现,调试软件本身的设计和测试流程,几乎决定了项目能不能顺利从“跑通”走到“能交付”。
1.1 为什么选 ESP32 做智能插座
先聊选型。智能插座的核心需求就三个:联网、控制、计量。市面上能做这事的芯片不少,比如乐鑫早期的 ESP8266、各种 Cortex-M 内核加外部 Wi-Fi 模块的方案,但我最终选择了 ESP32,而不是更便宜的 ESP8266,原因很直接。
ESP32 是双核处理器,主频最高 240MHz,带 Wi-Fi 和蓝牙双模。做智能插座时,双核的好处非常明显:一个核跑 Wi-Fi 协议栈和 MQTT 通信,另一个核专门处理 ADC 采样、继电器控制和本地逻辑,两边互不干扰。我实测下来,在 Wi-Fi 吞吐比较大的时候,ESP8266 经常出现 GPIO 响应延迟,而 ESP32 用双核分工后几乎感觉不到互相拖累。
再说外设资源。智能插座需要采集电流和电压,ESP32 自带两个 12 位 SAR ADC,采样率最高能到 2MHz,做非正弦波形的功率计量虽然比不上专用计量芯片(比如 HLW8032、BL0940),但做基础的通断检测和过流判断完全够用。另外它内置了霍尔传感器接口、电容触摸传感器,后期想加手势控制或者开盖检测都不用换主控。
最后是开发生态。ESP32 同时支持 Arduino、ESP-IDF、MicroPython 甚至 PlatformIO。这意味着团队里有人习惯 Arduino 快速验证,有人玩 ESP-IDF 深入底层,都能在同一块硬件上干活。项目的调试软件测试就是基于这一层灵活性展开的——我们可以先用最熟悉的工具链把功能跑通,再决定要不要为了性能切换到更底层的框架。
1.2 智能插座的典型功能矩阵与测试维度
在做任何测试之前,我习惯先把“要测什么”掰开揉碎写清楚。智能插座不是“能开灯能关灯”就完事,它至少包含下面几条功能线:
- 本地控制:物理按键、继电器通断、LED 状态反馈
- 远程控制:Wi-Fi 配网、MQTT 订阅/发布、云端指令下发、离线状态处理
- 功率计量:电压/电流/功率采集、数据校准、过载阈值判断
- 安全保护:过流跳闸、高温保护、异常恢复
- OTA 升级:固件远程更新、断线续传、回滚机制
- 配网体验:SmartConfig、蓝牙配网、设备重置
对应到调试软件的功能测试,就不仅仅是“按一下按键看继电器动不动”这么简单了。我把测试分成三个层次:
第一层是通信层测试。ESP32 的 Wi-Fi 连接是否稳定,连上之后 DHCP 是否正常获取 IP,MQTT 连接在弱网环境下是否会频繁断开重连。
第二层是控制逻辑测试。远程发送“开”指令,继电器是否在 100ms 内完成动作,动作之后状态上报是否及时准确,本地按键和远程指令同时操作时优先级怎么处理。
第三层是异常场景测试。这是最能体现调试软件价值的地方。比如 Wi-Fi 断网后,插座处于离线状态,这时候本地按键还能不能控制;恢复网络后,状态会不会自动同步到云端;固件升级到一半断电,重启后能不能自动回滚到旧版本。
这三个层次的测试,光靠人工拿手机点点点是测不完的,所以才需要专门的调试软件来辅助。调试软件在这里承担的角色是:状态可视化、指令可控化、参数可配置化、日志可回溯化。
2. 调试软件选型与环境搭建
调试软件这个说法有点泛,很多新人会问“到底用什么软件调试”。其实一个完整的 ESP32 智能插座调试环境,至少包含三类工具:串口调试工具、MQTT 调试工具、以及代码层面的烧录调试工具。缺了任何一环,你都会在测试中抓瞎。
2.1 三类核心调试工具的功能与选择
串口调试工具是项目里用得最频繁的。ESP32 的日志输出、AT 指令交互、异常堆栈打印,全靠串口。我测试时用的是爱尚电子的串口助手和 SSCOM,两个换着用。SSCOM 是老牌工具,稳定、支持 UTF-8 和 GB2312 转换,看中文日志不乱码;爱尚电子的 UI 更现代,支持波形显示,做 ADC 采样数据观察时很顺手。另外一个推荐是 ESP-IDF 自带的 idf.py monitor,它自带解码功能,能把 ESP32 报错时的寄存器信息和回溯地址翻译成函数名,排查崩溃问题时比普通串口工具高效太多。
MQTT 调试工具是远程控制测试的刚需。智能插座的基本工作模式就是 ESP32 通过 MQTT 协议连上 Broker,订阅一个主题接收控制指令,发布另一个主题上报状态。常见的 MQTT 工具有 MQTTX、MQTT Explorer,还有命令行版本的 mosquitto_pub/mosquitto_sub。我个人的习惯是,如果在 PC 上调试用 MQTTX,因为它的界面可以同时看到主题列表、消息内容和 QoS 级别;如果是跑自动化测试,就用 Python 脚本调用 paho-mqtt 库,批量发包验证并发场景。
烧录调试工具方面,ESP32 官方推荐用乐鑫的 Flash Download Tools,但如果你用的是 Arduino IDE 或 PlatformIO,直接在 IDE 里点烧录就行。我测试时用的是 PlatformIO,因为它自带编译、烧录、串口监视器的一体化流程,而且可以方便地切换开发板环境(esp32dev、esp32-s3-devkitc-1 等)。要特别提一下,ESP32 的烧录按钮(EN 和 BOOT)不是随便按的:先按住 BOOT,再按一下 EN 进入下载模式,松开 BOOT 开始烧录。刚开始不熟的人经常会在下载模式上卡很久。
2.2 开发环境搭建与日志分级策略
我在这个项目里用的是 ESP-IDF v4.4,搭配 VS Code 的 ESP-IDF 插件。为什么不用 Arduino?因为智能插座涉及 Wi-Fi 重连策略、MQTT 心跳保活、OTA 分区表管理这些偏底层的逻辑,ESP-IDF 提供了更直接的 API 和更完整的示例工程,比如 esp-mqtt、wifi_provisioning、esp_ota 组件,拿来改一改就能用,省掉自己造轮子的时间。
环境搭建的完整流程是:
- 安装 ESP-IDF 工具链。官方推荐用 ESP-IDF Windows Installer,它会自动装好 Python、Git、编译工具链和所有依赖。Linux 下可以用 apt 装依赖后手动拉取 esp-idf 仓库,再运行 install.sh 和 export.sh。
- 装 VS Code 插件。搜索“Espressif IDF”插件,安装后在命令面板里执行“ESP-IDF: Configure ESP-IDF extension”,选择 v4.4 版本即可自动配置。
- 创建工程模板。用“ESP-IDF: Show Example Projects”生成一个基于 hello-world 的基础工程,再把智能插座需要的组件(Wi-Fi、MQTT、ADC、GPIO、NVS)添加进 CMakeLists.txt 的 REQUIRES 列表里。
- 验证烧录。连接 ESP32 开发板,选择串口和 target,编译烧录,打开串口监视器,看到“Hello world”和打印的堆信息就说明环境通了。
日志分级是调试软件测试中最容易忽略但又最关键的细节。ESP-IDF 支持 ESP_LOGE(错误)、ESP_LOGW(警告)、ESP_LOGI(信息)、ESP_LOGD(调试)、ESP_LOGV(详细)五级日志。测试时我把日志级别配到 DEBUG,确保能看到每个模块的完整流程;正式发布时切到 INFO,避免大量日志拖慢 Wi-Fi 吞吐。
我踩过的一个坑是:MQTT 库的日志默认走 ESP_LOGW 以下级别,如果你把全局日志等级设成 ERROR,MQTT 断线重连的中间状态就完全看不到,排查问题时等于瞎了一只眼。后来我在 sdkconfig 里单独把 esp_mqtt 组件的日志级别设为 VERBOSE,才把连接过程彻底暴露出来。
3. 智能插座核心功能分模块测试方法
调试软件搭好了,硬件也点亮了,接下来就是重头戏:功能测试。我按模块拆解一下测试步骤和验证方法。注意,这一步不是“点一下看有没有反应”,每项测试都要有明确的输入、预期输出和判定标准。
3.1 继电器控制与 GPIO 逻辑测试
智能插座最基础的执行单元是继电器。ESP32 通过 GPIO 输出高低电平控制三极管或光耦,驱动继电器线圈吸合。测试的第一步是确认 GPIO 逻辑:我用的继电器模块是低电平触发,所以 ESP32 的 GPIO 输出默认置高,收到“关”指令时输出高、继电器断开;收到“开”指令时输出低、继电器吸合。逻辑反了的话,插座会变成“默认开启”,通电瞬间就吸合,这是安全隐患。
测试步骤:
- 在调试软件中手动切换 GPIO 状态,用万用表测继电器输出端电压。开状态应该从 0V 跳到 220V(接入市电时),关状态回 0V。
- 用示波器观察 GPIO 波形,确认上升沿/下降沿时间小于 10ms,避免继电器触点抖动导致电弧。
- 连续快速开关 100 次,每次间隔 300ms,观察继电器是否有异响、是否出现触点粘连。这一项能暴露驱动电路余量不足的问题。
我在测试中发现一个典型问题:如果继电器驱动电路用的三极管放大倍数不够,或者基极电阻太大,继电器会出现“吸合一半又松开”的高频抖动,用示波器看波形是类似 PWM 的杂波。这时候必须加大基极驱动电流或者换成达林顿管,不能靠软件延时规避,否则继电器寿命会急剧缩短。
为了保证测试的确定性,我在代码里给 GPIO 操作加了状态锁:本地按键开关时,先读取当前状态,取反后写入 GPIO,同时上报 MQTT;远程指令开关时,直接解析 payload 后写入 GPIO。如果远程指令和本地操作几乎同时到达,以远程指令为准并记录冲突日志。这个设计看似简单,但避免了外设指令互相覆盖导致的“按键开了、远程却关了”这类蹊跷 Bug。
3.2 ADC 采样与功率校准测试
智能插座除了通断,还要能感知负载功耗。ESP32 的 ADC 采集电流互感器和电压分压电路送来的模拟信号,转换为数字量,再经过校准系数换算成功率。
我用的方案:电压采样通过电阻分压把 220V 降到 1V 以下,接 ADC1 的 GPIO34;电流采样用电流互感器(比如 ZMPT101B 的电压型,或者 SCT-013 的电流型),输出小信号经运放放大后接 GPIO35。ADC 转换精度受参考电压和温漂影响很大,所以必须做两点校准。
校准流程如下:
- 空载状态下采样 100 次,取平均作为零点偏移值(Zero Offset)。
- 接入一个已知功率的负载(我用的是一台 1000W 的电暖器),采样 100 次取平均,计算增益系数(Gain)。
- 把偏移和增益写入 NVS 存储,重启后自动加载。
- 用不同功率的负载(比如 500W/1000W/2000W)验证线性度,误差超过 5% 就要重新检查互感器安装位置和放大电路偏置。
我实测发现 ESP32 的 ADC 在低电压段非线性比较明显,尤其是 0.1V 以下的信号几乎不可信。如果你的设计里电流信号很小(低功率负载时),建议在放大电路上多留一级增益,或者直接在 ESP32-S3 上用内置的 12 位 ADC 并开启衰减(11dB 衰减档位可以测到约 3.1V 范围),让信号尽量工作在 ADC 的线性区。
调试软件在这一环节的作用是把 ADC 原始值和转换后的功率值同时显示出来。我在电脑端做了一个滚动波形窗口,能实时看到电流采样值和计算功率的曲线。一旦发现波形削底或者削顶,基本可以断定运放增益设置不合适。
3.3 Wi-Fi 配网与连接稳定性验证
智能插座必须解决一个现实问题:用户家里没有网线,只有 Wi-Fi,怎么把设备连上网?ESP32 支持多种配网方式,我建议至少实现两种:SoftAP 配网和 SmartConfig(乐鑫的 ESP-TOUCH)配网。
SoftAP 配网的流程是这样的:设备上电后先进入配网模式,ESP32 开启一个名为“SmartSocket_xxxx”的 AP,用户手机连上这个 AP,然后访问 192.168.4.1 页面输入家里的 Wi-Fi 账号密码。设备拿到这些信息后尝试连接路由器,成功后关闭 AP。这种方式的优点是兼容性最好,任何手机都支持,缺点是操作路径长。
SmartConfig 不需要用户手动连 AP,手机 App 通过 UDP 广播把 Wi-Fi 信息加密发给设备。ESP32 进入监听模式抓取广播报文,解析出 Wi-Fi 账号密码。这种方式的体验更顺滑,但部分路由器或手机系统会限制 UDP 广播跨网段传输,导致配网失败。
测试配网时不能只在理想环境测。我搭建了三种网络环境:
- 正常 2.4G Wi-Fi,无密码
- 正常 2.4G Wi-Fi,WPA2 加密
- 手机开启个人热点模拟弱信号环境
测试指标包括:配网成功率(至少 90%)、平均配网耗时(我的目标 < 30s)、配网失败后的重试机制是否生效。
我遇到过最头疼的配网问题是:手机连上设备 AP 后,路由器不在同一网段,导致无法访问 192.168.4.1。解决办法是把配网页面改成在设备自身 AP 下直接响应 HTTP 请求,而不仅仅依赖 DHCP 分配的 IP。具体就是启用 ESP-IDF 的 esp_netif 和 HTTP Server 组件,监听 192.168.4.1:80 的请求。这样用户在浏览器输入 IP 就能打开配置页,不需要额外网络条件。
3.4 MQTT 远程控制与状态上报测试
MQTT 是远程控制的核心协议。ESP32 通过 MQTT 连上 Broker,订阅 topic,例如smart_socket/{device_id}/cmd来接收指令,发布smart_socket/{device_id}/status来上报状态。调试软件的最高频使用场景就在这里。
测试用例我整理了一张速查表,直接照做:
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 正常开机 | 设备上电,等待 5s | 状态上报 topic 发送 JSON:{"state":"off","power":0} |
| 远程开机 | 发布{"cmd":"on"}到 cmd topic | 继电器吸合,状态上报更新为{"state":"on"} |
| 远程关机 | 发布{"cmd":"off"}到 cmd topic | 继电器断开,状态上报更新为{"state":"off"} |
| 非法指令 | 发布{"cmd":"reboot"} | 设备忽略指令,不重启,记录错误日志 |
| QoS 1 测试 | 用 QoS 1 发布指令,模拟 Broker 掉线重连 | 至少收到一次指令,不重复执行 |
| 遗嘱测试 | 用其它客户端订阅遗嘱 topic,然后直接断电设备 | 相关客户端收到遗嘱消息,说明设备离线被感知 |
| 断网重连 | 关闭 Wi-Fi 30s,再恢复 | 设备在 60s 内重新连接 MQTT,并自动上报最新状态 |
这里最容易被忽视的是 QoS 级别的选择。MQTT 的 QoS 0 是尽力而为,可能丢消息;QoS 1 保证至少一次,但可能重复。智能插座这种场景,我建议控制指令用 QoS 1,状态上报用 QoS 0 就行。因为状态上报频率高、允许丢一两次,重复上报反而增加服务器压力;控制指令必须可靠,重复执行一次开关机问题也不大,开销可以接受。
调试软件在这个环节要能清楚显示消息的 QoS、retain 标志和 payload。我实测中发现有些 MQTT 工具默认 retain=true,导致订阅一建立就收到一条之前的旧状态消息,容易让开发人员误以为是当前状态。测试时建议把 retain 关掉,或者特意验证 retain 行为是否符合设计:设备状态变化后,发布一条 retain 消息,新订阅者立刻拿到当前状态。
3.5 OTA 升级与回滚机制测试
智能插座不是一次性产品,固件更新能力在物联设备里是标配。ESP32 的 OTA 升级利用双分区(ota_0 和 ota_1)实现:新固件下载到备用分区,校验完成后切换启动分区,下次重启从新分区启动。如果新固件启动失败,看门狗触发,回退到旧分区。
测试时我用本地搭建的 HTTP 服务器来分发固件。步骤:
- 编译生成新版固件(我故意在代码里加了一行日志标识“v2.0.1”)。
- 将固件放到 HTTP 服务器目录,记为
firmware.bin。 - 在调试软件里触发 OTA 按钮,设备开始下载。
- 观察下载进度和校验结果。
- 自动重启后确认版本号变化。
测 OTA 一定要测两个异常场景:一是下载过程中断网,设备应该继续运行旧固件,下次触发重新下载;二是新固件启动后无法正常联网(相当于启动失败),ESP32 检测到异常后应自动回滚。
我在测试中发现,如果 HTTP 服务器没有设置正确的 Content-Length,或者固件包在传输中被路由器缓存截断,OTA 会在校验阶段失败。排查方法是抓串口日志,看到esp_ota_ops.c: image verification failed之类的报错,基本可以锁定是镜像校验问题。这时候先检查服务器返回的 HTTP 头和文件大小,再检查 bin 文件本身是否用的是idf.py build生成的完整镜像。
OTA 测试还需要注意分区表大小。默认的出厂分区表里 ota_0 和 ota_1 各占 1.5MB,如果你的固件体积超过这个限制,编译时会直接报错。解决办法是调整分区表或者开启压缩选项。我建议开发阶段就用 4MB Flash 的开发板,给 OTA 留够空间。
4. 调试软件实测中的典型问题与排查实录
这一部分的内容来自我在整个测试周期里实际踩过的坑,按频率排序,写出来供大家参考。没有任何手册会告诉你这些,恰恰是它们决定了一个项目测试过程是顺滑还是煎熬。
4.1 设备反复重启或进入下载模式
ESP32 如果出现反复重启,最常见的原因是供电不足。智能插座里同时有继电器线圈、ESP32 模块、Wi-Fi 射频模块,启动瞬间电流可能超过 500mA。很多开发板用 USB 供电没问题,一旦切换到电源适配器供电,压降一大就频繁复位。
我排查这类问题的方法是:先看串口日志,如果能看到rst:0x10 (RTCWDT_RTC_RESET),说明是看门狗复位;如果看到rst:0x3 (SW_RESET),可能是代码主动重启;如果直接黑屏没日志,大概率是供电问题。另外一个技巧是,在串口日志里开启动机原因打印,ESP-IDF 默认会打出来,这样可以快速区分是硬件复位还是软件复位。
对了,还有一个小坑:ESP32 的 EN 引脚如果悬空,容易被周围电路干扰导致复位。建议在 EN 和 GND 之间接一个 10uF 电容,延迟上电复位时间,能解决很多“莫名重启”的烦恼。
4.2 MQTT 掉线频繁与心跳机制调优
调试软件测 MQTT 时我最常看到的报错是MQTT_CLIENT: MQTT connection failed, rc=5。这个报错的意思是服务器没有收到正常的 CONNACK,原因往往是 Broker 不响应或者网络不通。
我遇到过一个诡异的场景:在家测试 MQTT 连接正常,换到办公室网络后频繁掉线。后来发现是公司的路由器启用了 IGMP snooping,导致组播报文被过滤,而 ESP32 的 MQTT 默认使用了某种 Keep Alive 方式,连接保活报文在特定链路上被丢弃。
解决办法是调整 MQTT Keep Alive 时间戳策略。我把 keepalive 从默认的 120s 改成 45s,同时在应用层增加一个hbtopic,每 30s 发一条心跳消息。如果 Broker 连续 3 次没收到心跳,就主动断开重连。这套机制上线后掉线率明显下降。
4.3 串口日志中文乱码与时间戳缺失
ESp32 的日志默认编码是 UTF-8,但很多 Windows 串口工具默认按 GBK 解码,中文注释就变成了乱码。解决方案有两个:一是所有日志尽量用英文关键词加数字参数,方便调试;二是在串口工具里手动把解码方式改成 UTF-8。
时间戳缺失是个隐性坑。如果没有时间戳,你就无法判断某条日志是多久之前打出来的,尤其是定位“设备 10 分钟后自动关机”这类延时问题时会非常痛苦。在 ESP-IDF 里可以启用系统时间戳,用esp_timer_get_time()打印微秒级时刻,串口助手里勾选“显示时间戳”选项,两者配合就能精确定位时序问题。
4.4 继电器误动作的电磁干扰问题
还有一个测试中容易被忽略的:继电器通断瞬间会产生电磁干扰,导致 ESP32 的 ADC 读数跳变,甚至引起 Wi-Fi 断线。我实测下来,当继电器驱动的是阻性负载(比如电暖器)时,干扰相对可控;但如果驱动的是感性负载(比如电机、风扇),反电动势会通过电源线传导回控制板,严重时把 ESP32 直接复位。
解决手段有三个层级:硬件上在继电器触点两端并联 RC 吸收电路(阻容吸收),或者在感性负载两端并联续流二极管;PCB 布局上让继电器驱动电路和 ESP32 的电源走线分开,避免共地干扰;软件上在继电器动作前后加 50ms 的延时滤波,忽略这段时间内的 ADC 采样值。
我在调试软件里专门加了一个“继电器动作期检测”的功能:记录每次继电器切换的时间点,之后 50ms 内标记为“不可信数据窗口”,ADC 采样值在这个窗口内不参与功率计算。这个小功能看起来不起眼,但直接让功率计量的稳定性上了一个台阶。
4.5 小程序/App 控制端与设备状态不同步
最后聊一个纯软件层面的问题。很多人在测试时发现手机 App 上显示的设备状态和设备实际状态不一致。最常见的原因是 App 端没有处理 retain 消息,或者设备上报状态的时序和 App 界面刷新时序不一致。
我建议测试时在调试软件里同时订阅状态上报 topic 和控制指令 topic,并以设备上报的状态为准。出现状态不同步时,先看设备串口日志里最后一条上报是什么时间,再对比 App 最后刷新时间,基本能定位是设备没上报,还是 App 没刷新。
另一个策略是让智能插座在每次 MQTT 连接成功时强制上报一次完整状态,而不是只上报变化值。这样即使用户重启了 App,也能在连接后立刻拿到设备的最新状态,而不是拿着一个旧的界面数据瞎猜。
5. 测试流程规范与效率提升技巧
聊完了具体模块的测试方法,再来说说怎么把整个测试流程规范化。没有规矩不成方圆,智能插座这种涉及强电和联网的硬件设备,测试不做规范化,后期量产和售后会非常痛苦。
5.1 测试用例文档与回归测试策略
我建议每个智能插座项目都建立一份测试用例表,至少包含用例编号、模块、测试步骤、预期结果、实际结果、是否通过、备注这几列。刚开始写的时候可能觉得繁琐,但一旦进入正式验证阶段,它的价值会立刻体现出来——你可以清楚地知道哪些功能已经验证过、哪些改动可能影响哪些既有功能。
回归测试的思路是:每次代码改动后,跑一遍全量测试用例比较费时,但至少要跑“P0 级”用例,也就是和用户核心路径直接相关的用例。比如远程开关机、本地按键开关、离线状态恢复、OTA 回滚,这四条必须全过。功率精度、信号强度等“P1 级”可以在版本稳定后再细测。
5.2 版本管理、日志采集与故障复现机制
测试过程中发现的 Bug,如果不把日志保存下来,之后复现就很困难。我的习惯是:在串口助手里开启日志自动保存,每次测试结束把日志文件按日期和功能命名归档。遇到无法稳定复现的 Bug,把这些日志连同触发条件一起发给同事,大家找规律。
还有一个更实用的技巧:在 ESP32 固件里加一个“错误日志缓存”功能,把最近的 50 条关键日志循环写入 NVS。设备正常运行时不占用网络,一旦发生异常,用户反馈后可以通过远程指令把所有缓存日志上报到调试软件,做到“事后复盘”。这个功能让我在排一个“凌晨 3 点设备自己重启”的 Bug 时少熬了好几个通宵。
6. 从功能测试到量产验证的延伸思考
功能测试不是终点。模块在开发板上验证通过了,距离真正的智能插座产品还有很长一段路。外壳开模对传感器位置的影响、电源适配器纹波对 ADC 采样的干扰、不同品牌路由器对 Wi-Fi 兼容性的差异,这些都是功能测试阶段接触不到的。
我在这个项目里最深的一个体会是:调试软件本身也要持续迭代。一开始它的作用只是看日志、发指令,后来我给它加了状态机展示、消息流记录、自动回归脚本的功能,它才从“测试工具”变成了“产品质量的守护者”。尤其是消息流记录,可以回放一段时间内所有 MQTT 交互,复现“用户点了开、但设备没开”这种客户投诉问题时,简直是救命稻草。
智能插座这种产品,消费者买回去会插各种奇奇怪怪的负载,会放在各种信号不好的角落,会用各种手机系统去控制。你可能觉得功能测试已经做得非常全面了,但实际上总会有意想不到的使用场景跳出你的用例清单。唯一能做的就是尽量完善调试手段,快速响应问题,持续迭代固件和测试方案。
这个项目后来还有一个收获:我把调试软件里积累的测试数据和设备行为日志脱敏后,整理成了一份“智能插座调试常见问题速查”,既给团队内部用,也分享给了几个做智能家居的朋友。大家都觉得比单纯看芯片手册效率高得多。所以说,功能测试不只是为了交付前找 Bug,它也是在积累项目最宝贵的故障知识库。