本文是《STM32 模块化开发实战指南》第 6 篇,专注于“裸机项目的单元测试设计”。我们将从为什么 STM32 项目也需要测试出发,设计一个简洁的
tests/
结构和测试驱动模型,并结合前文模块(如 RingBuffer、UART)示例演示如何验证模块正确性,提升项目质量。
一、STM32 裸机项目为什么要写测试?
很多人觉得 STM32 是硬件驱动代码,不需要测试。但真实场景中:
-
新增代码后旧功能异常,不知原因
-
中间件逻辑复杂,无法确认边界条件
-
BLE、AT 等协议难以调试,是否栈错?是否数据乱序?
✅ 测试代码不只是验证功能,更是“避免返工”和“提升信心”的工具。
二、测试策略建议:先中间件,后硬件依赖
对于 STM32 项目来说,模块测试应优先考虑:
模块类型 | 是否适合写测试 | 原因说明 |
---|---|---|
RingBuffer | ✅ 非常适合 | 纯内存逻辑,无硬件依赖 |
List/Queue | ✅ 很适合 | 接口清晰,逻辑可验证 |
UART | ⚠️ 需要 Mock | 需封装硬件层做模拟 |
FSM 状态机 | ✅ 非常适合 | 可以输入事件 → 验证状态 |
BLE 协议封装 | ✅ 可单元测试 | 可模拟连接、断开等事件 |
GPIO/Timer | ❌ 不建议 | 强硬件绑定,建议手动验证 |
三、测试目录结构推荐
project_root/
├── tests/
│ ├── test_ring_buffer.c
│ ├── test_fsm_ble.c
│ └── test_uart_mock.c
每个模块对应一个测试文件,测试文件需具备以下结构:
-
main()
:可独立编译运行 <