摘要:嵌入式软件质量往往依赖于手工测试,回归测试成本极高。一旦底层硬件没就位,软件开发就得停滞。本文将介绍如何通过 接口抽象 和 依赖注入,将业务逻辑与硬件驱动解耦。利用 Google Mock 模拟硬件行为(如模拟 Flash 写入失败、模拟传感器数据),在 PC 上实现自动化的单元测试。
一、痛点:被硬件'绑架'的软件开发
假设你要写一个 '数据记录器' 的逻辑:
- 每隔 1 秒读取传感器。
- 如果数据超过阈值,写入 Flash。
- 如果 Flash 写满了,擦除最旧的一个扇区。
典型的'耦合'代码
// DataLogger.cpp
#include "stm32f4xx_hal.h" // 强依赖硬件库
void LogProcess() {
float val = AD7606_Read(); // 直接调用驱动
if (val > 50.0f) {
if (W25Q_Write(val) != HAL_OK) { // 直接调用驱动
W25Q_EraseSector(0);
}
}
}
问题:
- 无法测试:想测试'Flash 写满擦除'的逻辑,你必须真的把 Flash 写满(可能需要几个小时),或者去改驱动代码造假数据。
- 无法移植:这个代码里全是 STM32 的头文件,换个芯片要重写。
- 开发阻塞:板子还没画回来,你的代码就没法跑。
二、破局:面向接口编程 (Interface-Based Design)
要实现 PC 端测试,必须把**'做什么 (Logic)'** 和 '怎么做 (Driver)' 分开。
1. 定义纯虚接口 (HAL Abstraction)
// IFlash.h
// 定义 Flash 的抽象行为,不包含任何 STM32 代码
class IFlash {
public:
virtual ~IFlash() = default;
= ;
= ;
};
{
:
~() = ;
= ;
};

