第1章 自动化测试让你重获自由 1
1.1变更的挑战 1
1.1.1变更的成本 1
1.1.2变更的影响 2
1.2测试与验证 2
1.3采用自动化验证 3
1.4为什么难以验证 5
1.5如何实现自动化测试 6
1.6小结 6
第一部分 创建自动化测试 10
第2章 测试驱动设计 10
2.1让我们开始吧 10
2.1.1检查npm和Node js的安装 11
2.1.2创建示例项目 11
2.1.3创建测试套件和金丝雀测试 12
2.1.4验证函数的行为 14
2.1.5验证另一个数据 16
2.2正向测试、反向测试和异常测试 18
2.3设计服务器端代码 20
2.3.1从测试列表开始 20
2.3.2回文项目 21
2.3.3编写正向测试 22
2.3.4编写反向测试 26
2.3.5编写异常测试 27
2.4评估服务器端代码覆盖率 29
2.5为测试客户端代码做准备 31
2.5.1切换到客户端项目 31
2.5.2配置Karma 33
2.5.3从金丝雀测试开始 34
2.6设计客户端代码 34
2.7评估客户端代码覆盖率 37
2.8小结 38
第3章 异步测试 39
3.1服务器端回调 39
3.1.1一次天真的尝试 40
3.1.2编写异步测试 41
3.1.3编写一个反向测试 43
3.2客户端的回调函数 44
3.3测试promise 46
3.3.1对promise的简单介绍 46
3.3.2 promise异步测试的类型 47
3.3.3返回promise对象的函数 48
3.3.4使用done()进行测试 49
3.3.5返回promise的测试 49
3.3.6使用chai-as-promised 50
3.3.7结合eventually和done() 50
3.3.8为promise编写反向测试 51
3.4小结 52
第4章 巧妙处理依赖 53
4.1问题以及spike解决方案 53
4.1.1转移到spike项目 53
4.1.2从spike中获得见解 54
4.2模块化设计 55
4.3尽量分离依赖 56
4.3.1结束spike,准备自动化测试 56
4.3.2测试c reatURL 57
4.4使用测试替身 59
4.5依赖注入 61
4.6交互测试 62
4.7使用Sinon清理测试代码 64
4.7.1安装Sinon 65
4.7.2初探Sinon 65
4.7.3使用Sinon的mock测试交互 67
4.7.4使用Sinon的stub 测试状态 68
4.7.5使用Sinon的spy拦截调用 70
4.8回顾与继续 72
4.9小结 75
第二部分 真实的自动化测试 78
第5章 Node.js测试驱动开发 78
5.1从策略设计开始——适度即可 78
5.2深入战略设计——测试优先 79
5.2.1创建初始测试列表 79
5.2.2编写第一个测试 80
5.2.3编写一个正向测试 82
5.3继续设计 85
5.3.1 readTickersFile的反向测试 85
5.3.2设计parseTickers函数 87
5.3.3设计processTickers函数 88
5.4创建spike以获得启发 89
5.4.1为getPrice创建spike 89
5.4.2设计getPrice函数 90
5.5模块化以易于测试 93
5.5.1设计processResponse和processError函数 93
5.5.2设计processHttpError 95
5.5.3设计parsePrice和process-Error 96
5.6分离关注点 97
5.6.1设计printReport 98
5.6.2设计sortData 98
5.7集成和运行 100
5.8回顾代码覆盖率和设计 102
5.8.1评估代码覆盖率 102
5.8.2代码设计 103
5.9提供HTTP访问 104
5.10小结 105
第6章 Express测试驱动开发 106
6.1为可测试性设计 106
6.1.1创建策略设计 107
6.1.2通过测试创建战略设计 108
6.2创建Express应用并运行金丝雀测试 108
6.3设计数据库连接 109
6.4设计模型 113
6.4.1建立数据库连接和测试固件 113
6.4.2设计all函数 114
6.4.3设计get函数 115
6.4.4设计add函数 116
6.4.5处理delete函数 121
6.4.6设计共享的校验代码 123
6.5设计路由函数 126
6.5.1重温路由 127
6.5.2从为Router创建stub开始 128
6.5.3测试路径/的GET方法 129
6.5.4测试路径/:id的GET方法 131
6.5.5处理路径/的P05T方法 133
6.5.6以路径/:id的DELETE方法结束整个测试 135
6.6评估代码覆盖率 136
6.7运行应用 138
6.7.1 使用Curl 139
6.7.2使用Chrome扩展程序 140
6.7.3观察响应 141
6.8小结 141
第7章 与DOM和jQuery协作 142
7.1创建策略设计 142
7.2通过测试创建战略设计 143
7.2.1创建测试列表 143
7.2.2创建项目 144
7.3增量开发 145
7.3.1设计getTasks 146
7.3.2更新DOM 147
7.3.3调用服务 150
7.3.4注册window对象的onload事件 154
7.4运行UI 155
7.5完成设计 156
7.5.1设计addTask 157
7.5.2设计deleteTask 163
7.6使用jQuery进行测试 165
7.6.1准备工作 166
7.6.2使用jQuery选择器 166
7.6.3使用$.ajax验证调用 167
7.6.4 测试document的ready函数 168
7.6.5完整的测试和使用jQuery 的代码实现 170
7.7评估代码覆盖率 170
7.8小结 171
第8章 使用AngularJS 172
8.1测试AngularJS的方式 172
8.2初步设计 175
8.3关注控制器 176
8.3.1准备工作空间 176
8.3.2编写第一个测试 177
8.3.3设计控制器 177
8.4设计服务交互 180
8.5分离关注点,减少mock 182
8.5.1找到合适的地方 183
8.5.2结合经验测试和交互测试 183
8.5.3测试加载顺序 186
8.6继续设计 187
8.6.1设计addTask 188
8.6.2设计deleteTask 192
8.7设计服务 194
8.7.1设计get 函数 194
8.7.2设计add函数 197
8.7.3设计delete 函数 198
8.8评估代码覆盖率 199
8.9运行UI 200
8.10小结 201
第9章 Angular 2测试驱动开发 202
9.1通过spike学习Angular 202
9.1.1管道、服务和组件 203
9.1.2创建项目 203
9.1.3创建管道 204
9.1.4创建服务 205
9.1.5创建组件 207
9.1.6集成 211
9.2通过测试设计Angular应用 213
9.2.1创建项目 214
9.2.2创建测试列表 215
9.3测试驱动组件的设计 215
9.3.1验证是否设置组件属性 215
9.3.2初始化模型 218
9.3.3设计getTasks 219
9.3.4对任务进行排序 222
9.3.5验证依赖注入 224
9.4测试驱动服务的设计 226
9.5测试驱动管道的设计 230
9.6测试驱动启动代码 234
9.7集成 236
9.8完成设计 237
9.8.1设计任务添加功能 238
9.8.2设计任务删除功能 245
9.8.3评估代码覆盖率 248
9.9小结 249
第10章 集成测试和端到端测试 250
10.1认识Protractor 250
10.1.1使用Protractor的理由 251
10.1.2安装Protractor 251
10.1.3使用Protractor进行测试 251
10.1.4为UI层测试做准备 253
10.1.5编写第一个测试 254
10.1.6测试数据发送 255
10.2启动服务器和配置数据库 256
10.2.1为TO-DO应用安装Protractor 257
10.2.2在设置前启动服务器 257
10.2.3为不同的环境创建数据库 259
10.2.4在beforeEach中设置数据 260
10.3测试jQuery UI 261
10.3.1设置Protractor配置文件 261
10.3.2发现必要的测试 261
10.3.3实现集成测试 262
10.4使用页面对象 265
10.5测试AngularJS的UI 268
10.6测试Angular 2的UI 272
10.7小结 275
第11章 测试驱动你自己的应用 276
11.1努力的成果 276
11.2测试的规模和层次 279
11.3测试驱动:程序员指南 280
11.4测试驱动:团队领导、架构师指南 282
11.5测试驱动:项目经理指南 283
11.5.1促进可持续的敏捷开发实践 283
11.5.2优雅地处理遗留应用 283
11.5.3结束新的遗留应用 284
11.6摇滚吧 285
附录 网络资源 286
参考文献 288