第1章 测试驱动开发 1
1.1为什么我们需要TDD 2
1.2什么是测试驱动开发 3
1.3 TDD的机理 4
1.4 TDD的微循环 5
1.5 TDD的好处 7
1.6对于嵌入式开发的益处 7
第一部分 开始 9
第2章 测试驱动开发的工具和约定 9
2.1什么是自动化单元测试框架 9
2.2 Unity:一个全部用C实现的自动化测试框架 10
2.3 CppUTest:一个用C++实现的自动化单元测试框架 16
2.4单元测试也会崩溃 19
2.5“四阶段”模式 19
2.6我们到哪里了 19
第3章 开始一个C语言模块 21
3.1具有可测性的C模块的那些元素 21
3.2 LED驱动都做些什么 22
3.3写一个测试列表 23
3.4写第一个测试 23
3.5先测试驱动接口再测试驱动内部实现 29
3.6增量式前进 34
3.7测试驱动开发者的状态机 36
3.8测试要做到FIRST 37
3.9我们到哪里了 37
第4章 一路测试直到完成 39
4.1从简单入手“生长”出解决方案 39
4.2保持代码整洁——边做边重构 53
4.3重复直到完成 55
4.4声明完成之前先向回走一步 61
4.5我们到哪里了 61
第5章 嵌入式系统TDD策略 63
5.1目标硬件的瓶颈 63
5.2双目标开发的好处 64
5.3双目标测试的风险 65
5.4嵌入式的TDD循环 65
5.5双目标的不兼容性 67
5.6和硬件一起测试 71
5.7欲速则不达 74
5.8我们到哪里了 74
第6章 是的,但是 75
6.1我们没那个时间 75
6.2为什么不在写了代码之后再写测试 77
6.3测试也需要维护 78
6.4单元测试不能发现所有的bug 78
6.5我们的构建时间太长 79
6.6我们有现存的代码 79
6.7我们的内存有约束 79
6.8我们不得不和硬件交互 80
6.9为什么要用C++的测试框架来测试C 81
6.10我们到哪里了 81
第二部分 测试有合作者的模块 83
第7章 测试替身 83
7.1合作者 83
7.2脱离依赖关系 84
7.3何时使用测试替身 86
7.4用C来仿冒,下一步 88
7.5我们到哪里了 89
第8章 监视产品代码 90
8.1灯光调度测试列表 90
8.2对于硬件和操作系统的依赖 91
8.3链接时代换 92
8.4监视被测试代码 93
8.5控制时钟 97
8.6先0后1 98
8.7处理多个的情况 110
8.8我们到哪里了 115
第9章 运行时绑定的测试替身 116
9.1测试随机性 116
9.2冒仿函数指针 118
9.3外科手术般地插入间谍 120
9.4用间谍来校验输出 124
9.5我们到哪里了 127
第10章 仿制对象 129
10.1闪存驱动程序 129
10.2 MockIO 136
10.3测试驱动开发驱动程序 138
10.4模拟设备超时 142
10.5这值得吗 144
10.6用CppUMock来仿制 144
10.7生成仿制对象 147
10.8我们到哪里了 148
第三部分 设计与持续改进 149
第11章 SOLID、灵活并可测试的设计 149
11.1 SOLID设计原则 150
11.2 C语言中的SOLID模型 152
11.3演进的需求和有问题的设计 154
11.4用动态接口来改进设计 160
11.5更灵活的基于类型的动态接口 168
11.6做多少设计才是足够的 171
11.7我们到哪里了 173
第12章 重构 174
12.1软件的两个价值 174
12.2三项关键技能 175
12.3代码中的坏味道以及如何改进它们 176
12.4转化代码 184
12.5那性能和大小怎么办 199
12.6我们到哪里了 201
第13章 为遗留代码加测试 203
13.1遗留代码改动准则 203
13.2童子军原则 204
13.3遗留代码改动步骤 205
13.4测试点 206
13.5两步结构体初始化 209
13.6崩溃直到通过 211
13.7鉴别测试 216
13.8为第三方代码做学习测试 219
13.9测试驱动缺陷修正 220
13.10增加策略测试 221
13.11我们到哪里了 221
第14章 测试的模式与反模式 223
14.1“喋喋不休”测试反模式 223
14.2“拷贝一粘贴一调整一重复”反模式 224
14.3“格格不入的测试用例”反模式 225
14.4“测试组之间的重复”反模式 227
14.5“不尊重测试”反模式 228
14.6“行为驱动开发”测试模式 228
14.7我们到哪里了 229
第15章 结束语 230
第四部分 附录 233
附录A 开发系统的测试环境 233
附录B Unity快速索引 237
附录C CppUTest快速索引 241
附录D 开始之后的LedDriver 245
附录E 操作系统隔离层的例子 248
附录F 参考书目 255