🖥️ 硬件层测试
硬件层测试是嵌入式MCU测试的基础,验证芯片、电路板及外设接口的电气特性与通信稳定性。
🔹 电源与复位测试
进行多次开关电源操作,测试MCU系统在上电和掉电过程中的可靠性。验证上电复位时序是否符合要求——MCU有上电复位(冷启动)与信号复位(热启动)之分,需分别测试。通过可编程电源模拟电压跌落、过压等场景,验证MCU在供电异常时能否正常工作或安全复位。分别测试MCU运行功耗(通常mA级别)和休眠功耗(通常μA级别),验证低功耗模式切换是否正常。
🔹 接口电气特性测试
使用示波器检测UART、SPI、I2C、CAN、USB等接口的信号时序、电平幅值是否符合规格。测试各接口的驱动能力、信号完整性及抗干扰能力。
🔹 外设功能验证
逐个验证GPIO输入输出、ADC/DAC转换精度、PWM输出、定时器计数等外设功能。测试外部中断触发是否及时、中断优先级配置是否正确。
💻 软件层测试
嵌入式软件测试遵循“静态测试在先、动态测试在后”的原则,分为静态分析和动态分析两大类。
🔸 静态分析
🔹 代码静态检查
在不执行程序的情况下检查源码、设计文件与依赖关系。检查编码规范(如MISRA C/C++)、编译警告(最好做到0警告)。进行代码走查、数据流分析、控制流分析,发现潜在的逻辑缺陷和安全隐患。评估软件架构的合理性,进行代码冗余度测试,要求代码尽量简练。
🔸 动态测试——单元测试
🔹 单元测试
验证函数、模块、驱动的逻辑正确性、边界条件和异常处理。使用轻量级测试框架(如Unity、CppUTest)进行单元测试。采用桩函数(Stub)和模拟函数(Mock)隔离硬件依赖——为硬件访问函数创建桩函数,模拟硬件行为。统计代码覆盖率,目标通常要求行覆盖率达90%以上、分支覆盖率达80%以上。
🔹 边界值与异常处理测试
重点测试极端情况:内存不足、通信中断、电压异常等边界条件——这些往往是bug的高发区。测试模块在极限条件下的表现:如数据位宽极限、计数器溢出、缓冲区满/空等。验证模块能否妥善处理异常情况(如非法参数、超时、硬件故障)。
🔸 动态测试——集成测试
🔹 模块间集成测试
验证各模块组合后的接口数据传递、同步机制、错误处理是否正确。采用增量集成方式(自底向上或自顶向下),先集成核心模块再逐步加入其他模块。重点测试任务间通信:消息队列的发送接收、优先级处理、队列满/空处理。
🔹 中断与实时性测试
验证中断响应延迟是否满足毫秒/微秒级要求。测试任务切换时间、最坏执行时间(WCET)。测试高优先级中断频繁触发时低优先级任务是否被“饿死”。
📟 系统层测试
🔹 系统功能测试
将完整软件部署到目标硬件平台,验证系统所有功能是否满足设计需求,采用黑盒测试方法验证输入输出。
🔹 系统资源监控测试
监测内存使用(RAM/Flash)、CPU占用率、堆栈深度等指标。测试长时间运行稳定性(7×24小时压力测试),检查是否存在内存泄漏、任务死锁等问题。
🔹 硬件兼容性测试
嵌入式软件的集成测试需与目标机硬件环境集成,做硬件兼容性测试。测试系统与不同批次硬件、不同外设型号的兼容性。
📱 端到端测试(Android控制端 ↔ MCU设备端)
针对Android App + MCU控制设备的典型架构,需进行端到端全链路验证。
🔹 移动端SDK功能测试
验证每个SDK接口(如 device.turnOn()、device.getTemperature())能否按设计正确工作。测试操作序列组合(如“开机→设置温度→调整风速→开启扫风”)。测试边界值和非法参数——参数范围16-30度时,要测15、31甚至字母输入,验证SDK返回明确错误码而非崩溃。
🔹 通信协议一致性测试
验证Android端与MCU端之间的蓝牙/WiFi/Zigbee等通信协议实现是否正确。测试指令下发→设备响应→状态回传的完整闭环。
🔹 异常与稳定性测试(端到端)
模拟App退出、手机断电、蓝牙信号边缘等场景。测试乱序操作、高频操作下设备是否发疯乱跑或死机。验证通信中断后设备的错误处理与自动恢复能力。
🐧 嵌入式Linux控制设备专项测试
针对运行嵌入式Linux的MCU/MPU控制设备(如基于ARM Linux的工业控制器),需增加以下测试:
🔹 设备驱动测试
验证设备树(Device Tree)配置是否正确——确认UART/SPI/I2C等端口的status、GPIO、时钟配置。测试驱动加载是否成功(分阶段验证)。使用Linux标准工具进行测试:如用evtest测试input子系统驱动。
🔹 Linux系统层测试
验证文件系统挂载、进程调度、内存管理、网络协议栈的正确性。测试系统调用的返回值与错误码是否符合预期。验证系统在资源紧张(内存不足、CPU过载)情况下的稳定性。
🔹 内核与驱动交互测试
测试SPI核心层、SPI控制器驱动、GPIO子系统、pinctrl子系统、Runtime PM等多个内核子系统的协同工作。
🔬 硬件在环(HIL)测试
硬件在环测试是嵌入式系统测试的特色,也是最接近真实使用场景的测试方法。
🔹 传感器信号模拟
用信号发生器、可编程电源、环境舱模拟各种传感器信号和环境条件。如测试温度控制器时用环境舱产生不同温度验证控制算法。
🔹 故障注入测试
人为制造故障条件:断开传感器连接、中断通信链路、降低电源电压等。验证系统在硬件故障或通信中断后的恢复能力。HIL系统支持无物理损耗的短路/开路等故障模拟。
🔹 环境适应性测试
在高低温、振动、电磁干扰等真实物理环境下验证系统功能。验证EMC、防水等环境适应性指标。
🛡️ 安全与可靠性测试
🔹 安全功能测试
重点测试通信模块、电源管理、安全相关功能。验证固件加密、安全启动、访问控制等安全机制。
🔹 容错与恢复测试
验证看门狗定时器是否能在系统死锁时正确复位。测试系统在异常复位后能否恢复至安全状态。
🔹 长期稳定性测试
7×24小时连续运行,监测系统是否存在内存泄漏、资源耗尽、任务死锁等问题。
🤖 自动化与持续集成
🔹 自动化测试框架
搭建持续集成环境,每次代码提交自动触发编译检查、静态分析、单元测试、集成测试。使用测试管理工具组织测试用例的编写、执行、结果记录。
🔹 回归测试
每次版本更新后执行全量或增量回归测试。
📝 总结
嵌入式MCU软件测试区别于通用软件测试的核心在于:资源受限(内存/CPU/存储远低于通用计算机)、实时性要求高(响应延迟超过阈值可能导致设备失控)、与硬件强耦合(需结合真实硬件或硬件仿真器完成测试)。针对Android控制端设备,重点在端到端SDK接口测试、通信协议一致性、异常场景模拟;针对嵌入式Linux控制设备,重点在设备驱动验证、内核子系统交互、Linux系统层稳定性。测试维度需覆盖硬件层、软件层、系统层三层,结合专用工具(示波器、逻辑分析仪、Unity测试框架、HIL仿真平台等)和真实/仿真硬件完成,最终保障嵌入式系统在物理环境中稳定、可靠、实时地完成核心功能。
