第1部分 基础
第1章 软件质量
1.1 外部质量
1.2 内部质量
1.3 技术债务
1.4 结构性质量保证
1.5 整洁代码
1.5.1 显式、最小的依赖
1.5.2 责任明确
1.5.3 不可复制
1.5.4 尽可能少的执行分支、尽可能简短的方法
1.6 软件度量
1.6.1 圈复杂度与npath复杂度
1.6.2 CRAP
1.6.3 non-mockable total recursive cyclomatic complexity
1.6.4 全局可变状态
1.6.5 聚合与耦合
1.7 工具
1.7.1 PHP Unit
1.7.2 phplOC
1.7.3 PHP Copy-Paste-Detector
1.7.4 PHP Dead Code Detector
1.7.5 PHP Depend
1.7.6 PHP Mess Detector
1.7.7 PHP Code Sniffer
1.7.8 bytekit-cli
1.7.9 PHP-Code Browser
1.7.10 Cruise Control与PHP Under Control
1.7.11 HUd SOn
1.7.12 Arbic
1.8 本章小结
第2章 软件测试
2.1 黑盒测试与白盒测试
2.2 需要多少次测试
2.3 系统测试
2.3.1 浏览器测试
2.3.2 自动测试
2.3.3 孤立测试
2.3.4 验收测试
2.3.5 系统测试的局限
2.4 单元测试
2.4.1 返回值
2.4.2 依赖性
2.4.3 副作用
2.5 案例探究
2.5.1 分析待测试代码
2.5.2 创建测试环境
2.5.3 避免全局依赖性
2.5.4 独立于数据源的测试
2.5.5 异步事件测试
2.5.6 数据库变化的存储
2.5.7 意外的结果
2.5.8 封装输入数据
2.5.9 问题的进一步研究
2.6 本章小结
第II部分 最佳实践
第3章 TYP03:呆板项目之敏捷未来
3.1 简介
3.1.1 TYP03的历史:13个春秋
3.1.2 敢于重新开始
3.1.3 我们的测试经验
3.2 方法和技术
3.2.1 苦甜参半的“大块头”
3.2.2 测试驱动开发
3.2.3 文档式测试
3.2.4 持续集成
3.2.5 整洁代码
3.2.6 代码重构
3.2.7 编程向导
3.2.8 领域驱动设计
3.3 开发过程中的行动方向
3.3.1 开发新代码
3.3.2 扩展和调试代码
3.3.3 优化代码
3.3.4 寻找并修复漏洞
3.3.5 处理旧代码
3.4 测试处方
3.4.1 无意的功能性单元测试
3.4.2 文件系统入口
3.4.3 接口处的构造函数
3.4.4 测试抽象类
3.4.5 测试受保护方法
3.4.6 回调函数的使用
3.5 迈向未来
第4章 单元测试的糟糕实践
4.1 为什么测试质量很重要
4.2 糟糕实践和测试味道
4.2.1 测试代码重复
4.2.2 断言复杂和测试试图
4.2.3 脆弱测试
4.2.4 模糊测试
4.2.5 谎言测试
4.2.6 慢测试
4.2.7 测试中的条件逻辑
4.2.8 自行验证测试
4.2.9 Web冲浪测试
4.2.10 模拟过度杀伤
4.2.11 跳过蔓延
4.3 本章小结
第5章 Digg公司的质量保证
5.1 面临的问题
5.1.1 遗留基本代码
5.1.2 如何解决这些问题
5.1.3 选择测试框架
5.1.4 引进专家
5.1.5 会议室内的一周
5.2 训练团队
5.3 编写可测试代码
5.3.1 规避静态方法
5.3.2 依赖注入
5.4 模拟对象
5.4.1 综述
5.4.2 数据库
5.4.3 松散耦合依赖
5.4.4 测试类内部构件的试验对象观察者
5.4.5 分布式缓存
5.4.6 模拟服务型架构
5.5 Digg的质量保证过程
5.5.1 测试
5.5.2 益处
5.6 本章小结
第III部分 服务器与服务
第6章 服务型API测试
6.1 问题
6.2 解决方案
6.2.1 API证书
6.2.2 API限制
6.2.3 服务协议的脱机测试
6.2.4 具体服务的脱机测试
6.3 本章小结
第7章 测试Web DAV服务器
7.1 关于eZ Web DAV组件
7.1.1 Web DAV
7.1.2 体系结构
7.2 开发过程中的挑战
7.2.1 需求分析
7.2.2 RFC之后的TDD
……