[SOP] 2025版嵌入式TDD环境搭建:MSYS2 + CppUTest (重焕《Test-Driven Development for Embedded C》新生)

一、 背景:经典与过时 (The Gap)

最近在研读 James Grenning 的经典著作 《Test-Driven Development for Embedded C》。书中的 TDD (测试驱动开发) 思想和双目标 (Dual-Targeting) 策略非常硬核,是解决嵌入式业务逻辑耦合的良药。

然而,书中的配套源码年代久远(十多年前),直接在现代的 CLion 或 Visual Studio 中打开全是报错,原本的 Makefile 也与现在的 GCC 版本不兼容。为了不被环境问题劝退,我基于 MSYS2 和社区维护的新版仓库,摸索出了一套 2025 年可用的构建方案。

核心目标: 在 Windows 上获得原生 Linux 般的构建体验,跑通书中的 LedDriver 测试用例。

二、 工具链准备 (Prerequisites)

我们抛弃臃肿的 IDE 配置,回归最纯粹的命令行工具链。

1. 源码仓库 (Modern Fork)

不要使用书中的原始链接,推荐使用这个针对现代编译器修复过的版本:

  • GitHub Repo: Mozilla88/tddcode
  • 操作: git clone 到本地(例如 D:\Dev_Workspace\Lab\tddcode)。

2. MSYS2 环境 ( The Environment)

Windows 下最推荐的类 Unix 环境。

  • 下载: MSYS2 官网
  • 安装: 一路下一步即可。
  • 关键点: MSYS2 有很多 Shell 环境(Clang64, Mingw64 等),我们选择 MSYS2 UCRT64 (Universal C Runtime),兼容性最好。

三、 详细搭建步骤 (Step-by-Step)

以下所有命令均在 MSYS2 UCRT64 终端窗口中执行。

Step 1: 安装编译器 (GCC)

打开 UCRT64 终端,执行以下命令安装 GCC 工具链:

1
pacman -S mingw-w64-ucrt-x86_64-gcc

Step 2: 安装构建工具 (Make) —— [易错点]

仅安装 GCC 是不够的,书中的构建依赖 make。很多教程漏了这一步,导致报错 bash: make: command not found

Bash

1
pacman -S make

(或者安装 pacman -S base-devel 以获取更完整的工具集)

Step 3: 编译 CppUTest 框架

我们需要从源码编译最新的 CppUTest,以确保与本地 GCC 版本兼容。

  1. 下载:CppUTest 官网 或 GitHub 下载最新 Release 版本。

  2. 路径: 假设解压在 D:\Dev_Workspace\Lab\cpputest-3.8

  3. 编译: 在终端中切换路径并构建(注意 MSYS2 的路径格式):

Bash

1
2
3
4
5
6
7
# 注意:Windows 的 D:\ 对应 MSYS2 的 /d/
cd /d/Dev_Workspace/Lab/cpputest-3.8

# 配置与检查
./configure
make check
make tdd

如果最后看到 OK 字样,说明测试框架本身编译成功。

Step 4: 配置环境变量 (The Bridge)

书中的 Makefile 依赖 CPPUTEST_HOME 这个变量来找到测试框架。我们需要设置它。

永久生效方案: 将环境变量写入 .bashrc 配置文件:

Bash

1
2
3
4
5
# 注意替换为你自己的实际路径,务必使用 Linux 风格的正斜杠 /d/...
echo 'export CPPUTEST_HOME=/d/Dev_Workspace/Lab/cpputest-3.8' >> ~/.bashrc

# 立即刷新配置
source ~/.bashrc

四、 见证奇迹 (The Moment of Truth)

一切准备就绪,回到我们 Clone 下来的书籍源码目录。

  1. 切换目录:

    Bash

    1
    cd /d/Dev_Workspace/Lab/tddcode
  2. 运行测试: 书中的代码支持 Unity 和 CppUTest,这里我们使用功能更强大的 CppUTest:

    Bash

    1
    make -i -f MakefileCppUTest.mk

🎉 成功输出

如果你看到类似下面的输出,恭喜你,你的 TDD 环境已经打通了!

Plaintext

1
2
3
4
5
6
7
8
compiling LedDriverTest.cpp
...
compiling AllTests.cpp
Linking BookCode_CppUTest_tests
Running BookCode_CppUTest_tests
..................................................
.............................................
OK (95 tests, 95 ran, 484 checks, 0 ignored, 0 filtered out, 3 ms)

五、 常用命令速查 (Cheat Sheet)

为了方便后续练习,这里总结了几个高频命令:

  • 运行 CppUTest 测试: make -i -f MakefileCppUTest.mk

  • 清理构建 (Clean): make -i -f MakefileCppUTest.mk clean

  • 运行 Unity 测试 (前几章): make -i -f MakefileUnity.mk


Engineer’s Note: 虽然现在的 IDE (如 CLion) 也有 GoogleTest 插件,但手动搭建这一套环境能让你更理解 “Host-based Testing” 的底层原理:代码是如何脱离硬件,在 PC 的 GCC 中编译并链接到 Mock 库上的。这才是白盒思维的起点。

📢 懒人福利: > 我已经将配置好环境、剔除干扰项的纯净版练习脚手架上传到了 GitHub。你无需自己修改 Makefile,Clone 下来即可直接开始本书的 TDD 练习: > 👉 lleoeric/embedded-c-tdd-starter: A modern, clean-slate starter kit for James Grenning’s TDD book. MSYS2/GCC ready.