标题：测试驱动的JavaScript开发
基本信息
  测试驱动的JavaScript开发作　　者：（美）Christian Johansen著 赵勇等 译 
出 版 社：机械工业出版社
ISBN：9787111362746 
出版时间：2012-02-01 
版　　次：1 
页　　数：396 
装　　帧：平装 
开　　本：16开 
编辑推荐
《测试驱动的JavaScript开发》是一本完整的、基于最佳实践的JavaScript敏捷测试指南
本书涵盖了将最先进的自动化测试用于JavaScript开发环境的方方面面
本书将带领读者走过整个应用程序开发的生命周期，从项目启动到应用程序部署 
内容简介
《测试驱动的JavaScript开发》是一本完整的、基于最佳实践的JavaScript测试指南，同时又有着测试驱动开发方法所带来的质量保证。本书涵盖了将最先进的自动化测试用于JavaScript开发环境的方方面面，带领读者走过整个开发的生命周期，从项目启动到应用程序部署。
本书面向的是JavaScript开发人员。无论您是一位Ruby开发人员，主要关注Ruby on Rails；或者是一名Java或.NET开发人员，忙于构建Web应用；又或者是一名前端Web开发人员，以JavaScript、CSS和HTML为首要工具；甚至是一名后端开发人员，对JavaScript知之甚少，本书将对您非常有用。 
作者简介
Christian Johansen居住在挪威奥斯陆，就职于当地的Shortcut AS公司，这是一家专注于开源技术、Web应用和移动应用的软件企业。在学校里，他学习了信息学、数学和数字信息处理。Christian在职业生涯中，专门从事Web应用程序和前端技术，如JavaScript、CSS和HTML，这些技术他在HTML 4.01规格定稿的时代就充满激情地参与了。
作为一名顾问，Christian在挪威曾与许多高端的公司合作，包括金融和电信行业的领头公司，他在那里开发从小到大的Web应用程序，内容涉及从普通的CMSbacked电子商务企业网站到自助服务的应用程序。
最近几年，Christian一直是一名活跃的博客写手。出于和无偿给予了他如此巨大收获的社区相同的分享和贡献的愿望，Christian参与了相当数量的开源项目并为它们做了不少贡献。
参与了多个JavaScript代码数量少到可以忽略不计的项目之后，Christian感受到了“牛仔风格”的开发之痛。为了提高代码质量、开发者的信心，以及修改和维护代码的能力，并大大地简化这个过程，他在过去的几年中花费了大量的工作和业余时间来研究JavaScript中的单元测试和测试驱动开发。作为一个铁杆的TDD支持者，同时又使用传统的服务器端的开发语言，那么牛仔风格的JavaScript开发手段自然也就呼之欲出了。这种激情的集大成之作，就是你现在你手中的这本书。 
媒体评论
“这是一本将应用程序生命周期中最易轻视的部分深入浅出地解释到位的书。Christian Johansen采用了现实世界中的例子，由浅入深，提供了一个有用的代码库。我简直无法为本书找到更多赞美之词了。它带给我们如此之多的教益，又是那么的琅琅上口。”
——Andrea Giammarchi，开发部主管，诺基亚 Gate 5 GmbH
“一本伟大的书，它的伟大之处在于将理论与实际例子相结合，它既适合于JavaScript/TDD新手，也适合于那些久经沙场却还想向他们的技能库中添砖加瓦的JavaScript高手。”
——Jacob Seidelin，自由Web开发人员，Nihilogic 
目录
译者序
前言
致谢
关于作者
第一部分　测试驱动开发
第1章　 自动化测试 
1.1　 单元测试 
1.1.1　 单元测试框架 
1.1.2　 JavaScript日期函数strftime 
1.2　 断言 
1.3　 测试函数、用例和套件 
1.4　 集成测试 
1.5　 单元测试的好处 
1.5.1　 回归测试 
1.5.2　 重构 
1.5.3　 跨浏览器的测试 
1.5.4　 其他的一些好处 
1.6　 单元测试中的陷阱 
1.7　 小结 
第2章　 测试驱动开发的过程 
2.1　 测试驱动开发的目的与目标 
2.1.1　 开发顺序的颠倒 
2.1.2　 测试驱动开发中的设计 
2.2　 过程 
2.2.1　 步骤1：编写一个测试 
2.2.2　 步骤2：观看测试失败 
2.2.3　 步骤3：使测试通过 
2.2.4　 步骤4：重构以消除冗余 
2.2.5　 打肥皂、冲洗、重复 
2.3　 让测试驱动开发简便易行 
2.4　 测试驱动开发的好处 
2.4.1　 有效的代码 
2.4.2　 遵循单一职责原则 
2.4.3　 强制有意识的开发 
2.4.4　 提高生产效率 
2.5　 小结 
第3章　 行业工具 
3.1　 xUnit测试框架 
3.1.1　 行为驱动开发 
3.1.2　 持续集成 
3.1.3　 异步测试 
3.1.4　 xUnit测试框架的特点 
3.1.5　 断言 
3.1.6　 依赖关系 
3.2　 浏览器内的测试框架 
3.2.1　 YUI Test 
3.2.2　 其他浏览器内的测试框架 
3.3　 无头测试框架 
3.3.1　 交叉检查 
3.3.2　 Rhino与env.js 
3.3.3　 无头测试框架的缺点 
3.4　 一个掌管一切的测试运行器 
3.4.1　 JsTestDriver是怎样工作的 
3.4.2　 JsTestDriver的缺点 
3.4.3　 安装 
3.4.4　 在IDE里使用JsTestDriver 
3.4.5　 提高命令行效率 
3.4.6　 断言 
3.5　 小结 
第4章　 从测试中学习 
4.1　 用单元测试探索JavaScript 
4.1.1　 观察法编程的缺陷 
4.1.2　 学习测试的最佳点 
4.2　 性能测试 
4.2.1　 基准和相对性能 
4.2.2　 性能评测和定位瓶颈 
4.3　 小结 
第二部分　开发人员的JavaScript
第5章　 函数 
5.1　 定义函数 
5.1.1　 函数声明 
5.1.2　 函数表达式 
5.1.3　 Function构造器 
5.2　 调用函数 
5.2.1　 arguments对象 
5.2.2　 形参和arguments 
5.3　 作用域和执行上下文 
5.3.1　 执行上下文 
5.3.2　 变量对象 
5.3.3　 活动对象 
5.3.4　 全局对象 
5.3.5　 作用域链 
5.3.6　 再访函数表达式 
5.4　 this关键字 
5.4.1　 隐式地设置this 
5.4.2　 显式地设置this 
5.4.3　 使用原初类型当做this 
5.5　 小结 
第6章　 函数和闭包的应用 
6.1　 绑定函数 
6.1.1　 this被丢弃：一个Lightbox的例子 
6.1.2　 通过一个匿名函数解决this问题 
6.1.3　 Function.prototype.bind 
6.1.4　 绑定参数 
6.1.5　 局部套用 
6.2　 被立即调用的匿名函数 
6.2.1　 Ad Hoc作用域 
6.2.2　 命名空间 
6.3　 状态函数 
6.3.1　 生成唯一的标识符 
6.3.2　 迭代器 
6.4　 记忆 
6.5　 小结 
第7章　 对象和原型继承 
7.1　 对象和属性 
7.1.1　 属性访问 
7.1.2　 原型链 
7.1.3　 通过原型链实现对象扩展 
7.1.4　 可枚举属性 
7.1.5　 属性的特性 
7.2　 使用构造器创建对象 
7.2.1　 prototype和[[Prototype]] 
7.2.2　 使用new创建对象 
7.2.3　 构造器原型 
7.2.4　 构造器的问题 
7.3　 伪经典结构的继承 
7.3.1　 继承函数 
7.3.2　 访问[[Prototype]] 
7.3.3　 实现super 
7.4　 封装和信息隐藏 
7.4.1　 私有方法 
7.4.2　 私有成员和特权方法 
7.4.3　 函数式继承 
7.5　 对象组合和混搭体 
7.5.1　 Object.create方法 
7.5.2　 tddjs.extend方法 
7.5.3　 混搭体 
7.6　 小结 
第8章　 ECMAScript 
8.1　 JavaScript不远的未来 
8.2　 对象模型的更新 
8.2.1　 属性的特性 
8.2.2　 原型继承 
8.2.3　 Getter和Setter 
8.2.4　 使用属性的特性 
8.2.5　 作为属性标识符的保留关键字 
8.3　 严格模式 
8.3.1　 启用严格模式 
8.3.2　 严格模式带来的改变 
8.4　 各种新内容及改进 
8.4.1　 原生的JSON 
8.4.2　 Function.prototype.bind 
8.4.3　 关于数组 
8.5　 小结 
第9章　 不唐突的JavaScript 
9.1　 不唐突的JavaScript的目标 
9.2　 不唐突的JavaScript的规则 
9.2.1　 唐突的标签式面板 
9.2.2　 简洁的标签式面板标记 
9.2.3　 TDD和渐进增强 
9.3　 不要做任何假设 
9.3.1　 不要假设只有你一个人 
9.3.2　 不要假设标记是正确的 
9.3.3　 不要假设所有用户的需求都一样 
9.3.4　 不要假设支持 
9.4　 规则何时适用 
9.5　 不唐突的标签式面板的例子 
9.5.1　 建立测试 
9.5.2　 tabController对象 
9.5.3　 activateTab方法 
9.5.4　 使用标签控制器 
9.6　 小结 
第10章　 特性检测 
10.1　 浏览器嗅探 
10.1.1　 用户代理嗅探 
10.1.2　 对象检测 
10.1.3　 浏览器嗅探的状态 
10.2　 正确使用对象检测 
10.2.1　 检查对象是否存在 
10.2.2　 类型检查 
10.2.3　 原生和宿主对象 
10.2.4　 使用测试样例 
10.2.5　 何时测试 
10.3　 特性检测DOM事件 
10.4　 特性检测CSS属性 
10.5　 跨浏览器事件处理例程 
10.6　 使用特性检测 
10.6.1　 向前进 
10.6.2　 无法检测到的特性 
10.7　 小结 
第三部分　JavaScript测试驱动开发实践
第11章　 观察者模式 
11.1　 JavaScript中的观察者 
11.1.1　 观察物库 
11.1.2　 设置环境 
11.2　 添加观察者 
11.2.1　 第一个测试 
11.2.2　 重构 
11.3　 检查观察者 
11.3.1　 测试 
11.3.2　 重构 
11.4　 通知观察者 
11.4.1　 确保观察者被调用 
11.4.2　 传递参数 
11.5　 错误处理 
11.5.1　 添加假的观察者 
11.5.2　 有问题的观察者 
11.5.3　 记录调用顺序 
11.6　 观察任意对象 
11.6.1　 让构造器成为过去式 
11.6.2　 用对象来替换构造器 
11.6.3　 重命名方法 
11.7　 观察任意事件 
11.7.1　 支持observe中的事件 
11.7.2　 支持notify中的事件 
11.8　 小结 
第12章　 抽象化浏览器区别：Ajax 
12.1　 以测试驱动来开发一个请求API 
12.1.1　 发现浏览器的不一致 
12.1.2　 开发策略 
12.1.3　 目标 
12.2　 实现请求接口 
12.2.1　 项目布局 
12.2.2　 选择接口风格 
12.3　 创建一个XMLHttpRequest对象 
12.3.1　 第一个测试 
12.3.2　 XMLHttpRequest背景知识 
12.3.3　 实现tddjs.ajax.create 
12.3.4　 更强的特性检测 
12.4　 编写Get请求 
12.4.1　 需要一个URL 
12.4.2　 为XMLHttpRequest对象创建桩 
12.4.3　 处理状态的变化 
12.4.4　 处理状态变化 
12.5　 使用Ajax API 
12.5.1　 集成测试 
12.5.2　 测试结果 
12.5.3　 微妙的麻烦 
12.5.4　 本地请求 
12.5.5　 测试状态 
12.6　 发出POST请求 
12.6.1　 为POST做准备 
12.6.2　 发送数据 
12.6.3　 设置请求头信息 
12.7　 重审请求API 
12.8　 小结 
第13章　 使用Ajax和Comet将数据流式化 
13.1　 数据轮询 
13.1.1　 项目结构 
13.1.2　 轮询器：tddjs.ajax.poller 
13.1.3　 定时器测试 
13.1.4　 可配置的头和回调 
13.1.5　 单行接口 
13.2　 Comet 
13.2.1　 永不消失的框架 
13.2.2　 流式化XMLHttpRequest 
13.2.3　 HTML5 
13.3　 长轮询的XMLHttpRequest 
13.3.1　 实现长轮询支持 
13.3.2　 避免缓存问题 
13.3.3　 特性检测 
13.4　 Comet客户端 
13.4.1　 消息格式 
13.4.2　 介绍ajax.cometClient 
13.4.3　 分发数据 
13.4.4　 添加观察者 
13.4.5　 服务器连接 
13.4.6　 跟踪请求和接收到的数据 
13.4.7　 发布数据 
13.4.8　 特性检测 
13.5　 小结 
第14章　 基于Node.js的服务器端JavaScript 
14.1　 Node.js运行时环境 
14.1.1　 环境设置 
14.1.2　 起点 
14.2　 控制器 
14.2.1　 CommonJS规则模块 
14.2.2　 定义模块：首测 
14.2.3　 建立控制器 
14.2.4　 基于POST方式添加消息 
14.2.5　 对请求做出响应 
14.2.6　 将应用程序用于实践 
14.3　 域模型和存储器 
14.3.1　 创建聊天室 
14.3.2　 Node中的输入输出 
14.3.3　 添加聊天信息 
14.3.4　 获取聊天信息 
14.4　 Promises 
14.4.1　 用promise重构addMessage方法 
14.4.2　 使用promise对象 
14.5　 事件产生器 
14.5.1　 让chatRoom对象成为一个事件产生器 
14.5.2　 等待聊天信息 
14.6　 回到控制器 
14.6.1　 完成Post方法 
14.6.2　 通过GET方法输出数据流 
14.6.3　 响应头和响应体 
14.7　 小结 
第15章　 TDD与DOM操作：聊天室客户端程序 
15.1　 客户端的蓝图 
15.1.1　 目录结构 
15.1.2　 选择方法 
15.2　 用户表单 
15.2.1　 视图的设置 
15.2.2　 处理提交事件 
15.2.3　 特征测试 
15.3　 用Node.js后端使用客户端 
15.4　 聊天信息列表 
15.4.1　 设置模型 
15.4.2　 设置视图 
15.4.3　 添加聊天信息 
15.4.4　 来自同一用户的重复内容 
15.4.5　 特征测试 
15.4.6　 动手实验 
15.5　 聊天信息表单 
15.5.1　 建立测试用例 
15.5.2　 设置视图 
15.5.3　 发布聊天信息 
15.5.4　 特征测试 
15.6　 聊天室客户端的最终版本 
15.6.1　 收尾工作 
15.6.2　 部署时的注意事项 
15.7　 小结 
第四部分　测试模式
第16章　 模拟对象和创建桩 
16.1　 测试替身概述 
16.1.1　 特技替身 
16.1.2　 假对象 
16.1.3　 哑对象 
16.2　 测试验证 
16.2.1　 状态验证 
16.2.2　 行为验证 
16.2.3　 验证策略的作用 
16.3　 桩 
16.3.1　 使用桩来避免不方便的接口 
16.3.2　 使用桩让系统通过特定代码路径 
16.3.3　 使用桩来制造麻烦 
16.4　 测试间谍 
16.4.1　 测试间接输入 
16.4.2　 检测调用细节 
16.5　 使用桩库 
16.5.1　 创建桩函数 
16.5.2　 给方法创建桩 
16.5.3　 内建行为验证 
16.5.4　 创建桩和Node.js 
16.6　 模拟对象 
16.6.1　 恢复被模拟的函数 
16.6.2　 匿名的模拟对象 
16.6.3　 多重期望 
16.6.4　 对this值的期望 
16.7　 模拟对象还是桩 
16.8　 小结 
第17章　 编写良好的单元测试 
17.1　 提高可读性 
17.1.1　 清楚地命名测试以表明意图 
17.1.2　 用设置、应用和验证块对测试进行结构化 
17.1.3　 使用更高级的抽象保持测试的简单性 
17.1.4　 减少重复，而不是减少明确性 
17.2　 将测试作为行为规范 
17.2.1　 一次只测试一种行为 
17.2.2　 每个行为只测试一次 
17.2.3　 在测试中隔离行为 
17.3　 与测试中的缺陷做斗争 
17.3.1　 在测试通过之前运行它们 
17.3.2　 首先编写测试 
17.3.3　 搅乱和破坏代码 
17.3.4　 使用JsLint 
17.4　 小结 
参考文献