第一部分 测试的原则和实践 3
第1章 工程、匠艺和首次优质 3
1.1 工程与匠艺 3
1.2 匠艺在首次优质中的作用 4
1.3 支持软件匠艺的实践 6
1.4 在代码检查器的约束下进行单元测试 9
1.5 针对覆盖率的单元测试 10
第2章 代码的意图 15
2.1 意图都被放到哪里去了 15
2.2 将意图与实现分离 16
2.3 一个能引发思考的简单例子 17
第3章 从哪里开始 20
3.1 一种测试的方法 20
3.1.1 了解范围 21
3.1.2 测试的概念框架 22
3.1.3 状态和行为测试 23
3.1.4 测试还是不测试 24
3.2 攻略 25
3.2.1 测试“正常路径” 26
3.2.2 测试替代路径 26
3.2.3 测试错误路径 26
3.2.4 测试数据的排列组合 27
3.2.5 对缺陷进行测试 31
第4章 设计和可测试性 32
4.1 关于设计范型 32
4.2 封装和可观察性 33
4.2.1 表示性的封装 33
4.2.2 行为的封装 34
4.2.3 测试的灰度 34
4.2.4 封装、可观察性和可测试性 36
4.3 耦合和可测试性 36
第5章 测试的原则 40
5.1 把测试雕琢好 40
5.1.1 将输入关联到输出 41
5.1.2 使用命名约定 42
5.2 避免在生产代码内出现测试代码 43
5.3 通过实现来验证意图 45
5.4 将耦合最小化 45
5.5 要最小的、新的和瞬态fixture 46
5.6 利用现有设施 47
5.7 要完整的验证而不要部分的验证 47
5.8 编写小测试 48
5.9 分离关注点 48
5.10 使用唯一值 49
5.11 保持简单:删除代码 50
5.12 不要测试框架 50
5.13 有时测试框架 52
第二部分 测试与可测试性模式 54
第6章 基础知识 54
6.1 bootstrapping构造器 54
6.2 测试简单的getter和setter 56
6.3 共享常量 58
6.4 在局部重新定义 61
6.5 暂时替换 61
6.6 封装和覆写 62
6.7 调整可见性 65
6.8 通过注入的验证 67
第7章 字符串处理 70
7.1 通过包含关系来验证 70
7.2 通过模式来验证 72
7.3 通过值来精确验证 74
7.4 使用格式化的结果来精确验证 76
第8章 封装和覆写变化 80
8.1 数据注入 80
8.2 封装循环条件 83
8.3 错误注入 84
8.4 替换协作者 86
8.5 使用现有的无操作类 89
第9章 调整可见性 92
9.1 用包来包装测试 92
9.2 将其分解 94
9.3 更改访问级别 96
9.4 仅用于测试的接口 97
9.5 命名那些尚未命名的 98
9.6 变为friend 99
9.7 通过反射来强制访问 100
9.8 声明范围变更 102
第10章 间奏:重温意图 104
10.1 测试单例模式 105
10.2 单例的意图 106
10.3 测试的策略 106
10.3.1 测试单例的性质 107
10.3.2 对类的目的进行测试 108
10.4 独具慧眼的意图 112
第11章 错误条件验证 113
11.1 检查返回值 113
11.2 验证异常类型 114
11.3.验证异常消息 116
11.4 验证异常有效载荷 117
11.5 验证异常实例 121
11.6 有关异常设计的思考 123
第12章 利用现有接缝 128
12.1 直接调用 128
12.1.1 接口 129
12.1.2 实现 129
12.2 依赖注入 130
12.3 回调、观察者、监听者和通告者 133
12.4 注册表 137
12.5 工厂 139
12.6 日志记录与最后一手的其他设施 141
第13章 并行性 146
13.1 线程和竞态条件的简介 147
13.1.1 一些历史 147
13.1.2 竞态条件 147
13.1.3 死锁 149
13.2 一个用于重现竞态条件的策略 150
13.3 直接测试线程的任务 153
13.4 通过常见锁来进行同步 156
13.5 通过注入来同步 161
13.6 使用监督控制 164
13.7 统计性的验证 167
13.8 调试器API 169
第三部分 实例 172
第14章 测试驱动的Java 172
14.1 bootstrapping 173
14.2 首要功能 174
14.3 切断网络连接 175
14.4 转移到处理多个网站的情况 176
14.5 幽灵协议 177
14.5.1 死胡同 177
14.5.2 spy手艺 177
14.6 执行选项 180
14.7 走向下游 181
14.8 回顾 183
第15章 遗留的JavaScript代码 185
15.1 准备开始 186
15.2 DOM的统治 187
15.3 在牙膏与测试之上 189
15.4 向上扩展 190
15.5 软件考古学 193
15.6 回顾 193
参考文献 194
索引 196