第1章 软件测试的基本概念 1
1.1 软件质量 1
1.1.1 软件质量的概念 1
1.1.2 软件质量的属性 1
1.1.3 软件质量的模型 3
1.1.4 软件质量的量度 4
1.2 软件测试的概念 5
1.2.1 软件测试的定义与目的 5
1.2.2 软件测试的原则 5
1.3 软件的缺陷与错误 6
1.3.1 软件缺陷的定义和类型 6
1.3.2 软件缺陷的级别 6
1.3.3 软件缺陷产生的原因 7
1.3.4 软件缺陷的分类 7
1.3.5 修复软件缺陷的代价 8
1.4 软件测试的经济学与心理学 8
1.4.1 软件测试的心理学 8
1.4.2 软件测试的经济学 8
1.5 软件质量保证 9
1.5.1 软件质量保证概要 9
1.5.2 软件质量保证活动的实施 9
1.5.3 SQA与软件测试的关系 10
1.6 本章小结 10
第2章 软件测试类型及其在软件开发过程中的地位 11
2.1 软件开发阶段 11
2.1.1 软件生存周期 11
2.1.2 软件测试的生存周期模型 11
2.1.3 测试信息流 12
2.2 规划阶段的测试 12
2.2.1 目标阐述 12
2.2.2 需求分析 12
2.2.3 功能定义 13
2.2.4 规划阶段进行的测试 13
2.3 设计阶段的测试 13
2.3.1 外部设计 13
2.3.2 内部设计 13
2.3.3 设计阶段的测试 13
2.3.4 伪代码分析 14
2.4 编程阶段的测试 14
2.4.1 白盒测试与黑盒测试 14
2.4.2 结构测试与功能测试 14
2.4.3 路径测试:覆盖准则 14
2.4.4 增量测试与大突击测试 14
2.4.5 自顶向下测试与自底向上测试 15
2.4.6 静态测试与动态测试 15
2.4.7 性能测试 15
2.5 回归测试 15
2.6 运行和维护阶段的测试 15
2.7 本章小结 15
第3章 代码检查、走查与评审 16
3.1 桌上检查 16
3.1.1 桌上检查的检查项目 16
3.1.2 对程序代码做静态错误分析 16
3.2 代码检查 16
3.2.1 特定的角色和职责 16
3.2.2 代码检查过程 17
3.2.3 用于代码检查的错误列表 17
3.3 走查 18
3.3.1 特定的角色和职责 18
3.3.2 走查的过程 18
3.3.3 走查中的静态分析技术 19
3.4 同行评审 19
3.4.1 为什么需要评审 19
3.4.2 同行评审的角色和职能 19
3.4.3 同行评审的内容 20
3.4.4 评审的方法和技术 20
3.5 本章小结 21
第4章 覆盖率测试 22
4.1 覆盖率概念 22
4.2 逻辑覆盖 22
4.2.1 语句覆盖 22
4.2.2 判定覆盖 22
4.2.3 条件覆盖 23
4.2.4 条件/判定覆盖 23
4.2.5 条件组合覆盖 23
4.2.6 路径覆盖 23
4.2.7 ESTCA覆盖 23
4.2.8 LCSAJ覆盖 24
4.3 路径测试 24
4.3.1 分支结构的路径测试 24
4.3.2 循环结构的路径测试 24
4.3.3 Z路径覆盖与基本路径测试 26
4.4 数据流测试 28
4.4.1 定义/使用测试的几个定义 28
4.4.2 定义/使用路径测试覆盖指标 29
4.5 基于覆盖的测试用例选择 29
4.5.1 如何使用覆盖率 29
4.5.2 使用最少测试用例来达到覆盖 29
4.6 本章小结 30
第5章 功能测试 31
5.1 等价类测试 31
5.1.1 等价类的概念 31
5.1.2 等价类测试的类型 31
5.1.3 等价类测试的原则 31
5.1.4 等价类方法测试用例设计举例 32
5.2 边界值分析 34
5.2.1 边界值分析的概念 34
5.2.2 选择测试用例的原则 34
5.2.3 边界值方法测试用例设计举例 34
5.3 基于判定表的测试 35
5.3.1 判定表的概念 35
5.3.2 基于判定表的测试用例设计举例 35
5.4 基于因果图的测试 36
5.4.1 因果图的适用范围 36
5.4.2 用因果图生成测试用例 36
5.4.3 因果图法测试用例设计举例 36
5.5 基于状态图的测试 37
5.5.1 功能图及其符号 37
5.5.2 功能图法设计测试用例举例 37
5.6 基于场景的测试 38
5.6.1 基本流和备选流 38
5.6.2 场景法设计测试用例举例 39
5.7 其他黑盒测试用例设计技术 39
5.7.1 规范导出法 39
5.7.2 内部边界值测试法 40
5.7.3 错误猜测法 40
5.7.4 基于接口的测试 40
5.7.5 基于故障的测试 40
5.7.6 基于风险的测试 40
5.7.7 比较测试 41
5.8 本章小结 41
第6章 单元测试和集成测试 42
6.1 单元测试的基本概念 42
6.1.1 单元测试的定义和目标 42
6.1.2 单元测试与集成测试、系统测试的区别 42
6.1.3 单元测试环境 43
6.2 单元测试策略 43
6.2.1 自顶向下的单元测试策略 43
6.2.2 自底向上的单元测试策略 43
6.2.3 孤立测试 44
6.2.4 综合测试 44
6.3 单元测试分析 44
6.3.1 模块接口 44
6.3.2 局部数据结构 44
6.3.3 独立路径 44
6.3.4 出错处理 45
6.3.5 边界条件 45
6.3.6 其他测试分析的指导原则 45
6.4 单元测试的测试用例设计原则 45
6.4.1 单元测试的测试用例设计步骤 45
6.4.2 单元测试中的白盒测试与黑盒测试 45
6.5 集成测试的基本概念 46
6.5.1 集成测试的定义 46
6.5.2 集成测试与系统测试的区别 46
6.5.3 集成测试与开发的关系 46
6.5.4 集成测试重点 47
6.5.5 集成测试层次 47
6.5.6 集成测试环境 47
6.6 集成测试的策略 48
6.6.1 基于分解的集成策略 48
6.6.2 基于功能的集成 48
6.6.3 基于调用图的集成 48
6.6.4 基于路径的集成 49
6.6.5 基于进度的集成 49
6.6.6 基于风险的集成 49
6.7集成测试分析 49
6.7.1 体系结构分析 49
6.7.2 模块分析 49
6.7.3 接口分析 49
6.7.4 可测试性分析 50
6.7.5 集成测试策略的分析 50
6.7.6 常见的集成测试故障 50
6.8 集成测试的测试用例设计 51
6.9 本章小结 51
第7章 系统测试 52
7.1 系统测试概念 52
7.1.1 什么是系统测试 52
7.1.2 系统测试与单元测试、集成测试的区别 52
7.1.3 集成测试的组织和分工 52
7.1.4 系统测试分析 53
7.1.5 系统测试环境 53
7.2 系统测试的方法 53
7.2.1 功能测试 53
7.2.2 协议一致性测试 54
7.2.3 性能测试 54
7.2.4 压力测试 54
7.2.5 容量测试 54
7.2.6 安全性测试 55
7.2.7 失效恢复测试 55
7.2.8 备份测试 55
7.2.9 GUI测试 55
7.2.10 健壮性测试 56
7.2.11 兼容性测试 56
7.2.12 易用性测试 56
7.2.13 安装测试 56
7.2.14 文档测试 56
7.2.15 在线帮助测试 56
7.2.16 数据转换测试 57
7.3 系统测试的实施 57
7.3.1 确认测试 57
7.3.2 α测试和β测试 57
7.3.3 验收测试 57
7.3.4 回归测试 57
7.3.5 系统测试问题总结、分析 58
7.4 如何做好系统测试 58
7.5 本章小结 58
第8章 面向对象软件的测试 59
8.1 面向对象软件测试的问题 59
8.1.1 面向对象的基本特点引起的测试问题 59
8.1.2 面向对象程序的测试组织问题 60
8.2 面向对象软件的测试模型及策略 60
8.2.1 面向对象软件的测试模型 60
8.2.2 面向对象分析的测试 60
8.2.3 面向对象设计的测试 60
8.2.4 面向对象编程的测试 61
8.2.5 面向对象程序的单元测试 61
8.2.6 面向对象程序的集成测试 61
8.2.7 面向对象软件的系统测试 61
8.3 面向对象程序的单元测试 62
8.3.1 方法层次的测试 62
8.3.2 类层次的测试 62
8.3.3 类树层次的测试 62
8.4 面向对象程序的集成测试 63
8.4.1 面向对象程序的集成测试策略 63
8.4.2 针对类间连接的测试 64
8.5面向对象软件的系统测试 64
8.5.1 功能测试 65
8.5.2 其他系统测试 65
8.6 本章小结 65
第9章 软件性能测试基础理论 66
9.1 软件性能定义 66
9.1.1 用户眼中的软件性能 66
9.1.2 运维人员眼中的软件性能 66
9.1.3 开发人员眼中的软件性能 67
9.1.4 Web前端性能 67
9.2 性能测试 67
9.2.1 性能测试的定义 67
9.2.2 性能测试的目标 67
9.3 性能测试术语 68
9.3.1 响应时间 68
9.3.2 并发用户数 68
9.3.3 吞吐量 69
9.3.4 吞吐率 70
9.3.5 TPS 70
9.3.6 点击率 70
9.3.7 资源利用率 70
9.3.8 性能计数器 70
9.3.9 思考时间 71
9.4 软件性能测试方法论 71
9.4.1 SEI负载测试计划过程 71
9.4.2 RBI方法 72
9.4.3 性能下降曲线分析法 72
9.4.4 LoadRunner的性能测试过程 73
9.4.5 Segue提供的性能测试过程 73
9.4.6 敏捷性能测试 74
9.5 性能测试过程中的常见风险 75
9.5.1 识别风险 75
9.5.2 规避风险 75
9.6 本章小结 75
第10章 性能测试的应用领域 76
10.1 性能测试的方法分类 76
10.1.1 验收性能测试 76
10.1.2 负载测试 77
10.1.3 压力测试 77
10.1.4 配置测试 78
10.1.5 可靠性测试 78
10.1.6 负载压力测试 79
10.2 性能测试应用领域分析 79
10.2.1 能力验证 79
10.2.2 规划能力 80
10.2.3 性能调优 80
10.2.4 缺陷发现 80
10.2.5 性能基准比较 80
10.3 本章小结 81
第11章 性能测试团队建设 82
11.1 性能测试人员构成 82
11.2 性能测试过程模型 83
11.2.1 测试前期准备 84
11.2.2 测试工具引入 85
11.2.3 测试计划 86
11.2.4 测试设计与开发 88
11.2.5 测试执行与管理 91
11.2.6 测试分析 93
11.3 敏捷性能测试模型 93
11.3.1 APTM的检查表 94
11.3.2 APTM中的活动 95
11.3.3 环境与工具 96
11.4 本章小结 98
第12章 性能测试工具原理 99
12.1 服务器端性能测试工具架构 99
12.2 性能测试脚本录制时的协议类型 102
12.3 性能测试工具的选择与评估 104
12.3.1 创建还是购买 104
12.3.2 测试工具的评估和选择过程 104
12.4 本章小结 107
第13章 性能测试需求分析 108
13.1 制定负载测试的目标 108
13.2 收集系统信息 109
13.3 制订测试计划 109
13.3.1 性能测试需求 110
13.3.2 测试环境 112
13.3.3 数据准备 113
13.3.4 测试策略 114
13.3.5 人力与时间安排 115
13.4 业务流程 115
13.4.1 业务流程介绍与案例 115
13.4.2 业务流程分析 116
13.5 步骤测量 117
13.6 本章小结 118
第14章 测试脚本编写 119
14.1 参数化脚本 119
14.1.1 参数化的目的 119
14.1.2 什么时候进行参数化 121
14.1.3 怎样参数化输入数据 122
14.2 手工关联和自动关联 124
14.3 日志高级应用 128
14.4 高级脚本技术 130
14.4.1 如何将编写的动态链接库嵌入LR中运行 130
14.4.2 如何利用LR编写FTP脚本 131
14.4.3 web_custom_request使用技巧 132
14.4.4 特殊的录制脚本方法 137
14.5 本章小结 142
第15章 测试场景设计与执行 143
15.1 场景设计介绍 143
15.1.1 新建场景 143
15.1.2 负载生成器管理 152
15.2 场景执行 154
15.2.1 场景运行的准备工作 154
15.2.2 有效的场景运行技术要点 156
15.3 性能监控 157
15.3.1 性能参数监控方法 157
15.3.2 根据测试目标添加性能监控参数 158
15.4 本章小结 159
第16章 测试分析技术 160
16.1 分析性能测试结果 160
16.2 挖掘LR中的错误信息 163
16.3 通过LR图表组合挖掘系统缺陷根源 181
16.4 本章小结 187
第17章 Web前端性能 188
17.1 HTTP协议基础理论 188
17.1.1 HTTP协议结构 188
17.1.2 典型的HTTP请求与响应分析 190
17.1.3 与前端性能相关的头信息 191
17.2 浏览器访问URL原理 194
17.2.1 连接到URL服务器 194
17.2.2 获取页面对应的HTML文档 194
17.2.3 解析文档并获取所需要的资源 194
17.2.4 onload事件 195
17.3 如何提高Web前端的性能 195
17.3.1 减少网络时间 196
17.3.2 减少发送请求的数量 196
17.3.3 提高浏览器下载的并发度 197
17.3.4 让页面尽早开始显示 198
17.3.5 其他 199
17.4 单机前端性能工具介绍 199
17.4.1 Firebug工具 199
17.4.2 HttpWatch 工具 201
17.4.3 Chrome自带的开发工具 202
17.4.4 Page Speed工具 203
17.4.5 DynaTrace AJAX Edition工具 204
17.5 雅虎团队经验:网站页面性能优化的34条黄金守则 205
17.5.1 尽量减少HTTP请求次数 205
17.5.2 减少DNS查找次数 206
17.5.3 避免跳转 207
17.5.4 可缓存的Ajax 208
17.5.5 推迟加载内容 208
17.5.6 预加载 209
17.5.7 减少DOM元素数量 209
17.5.8 根据域名划分页面内容 210
17.5.9 使iframe的数量最小 210
17.5.10 不要出现404错误 210
17.5.11 使用内容分发网络 211
17.5.12 为文件头指定Expires或Cache-Control 211
17.5.13 Gzip压缩文件内容 212
17.5.14 配置ETag 213
17.5.15 尽早刷新输出缓冲 214
17.5.16 使用GET来完成Ajax请求 214
17.5.17 把样式表置于顶部 215
17.5.18 避免使用CSS表达式 215
17.5.19 使用外部JavaScript和CSS 216
17.5.20 削减JavaScript和CSS 216
17.5.21 用〈link〉代替@import 217
17.5.22 避免使用滤镜 217
17.5.23 把脚本置于页面底部 217
17.5.24 剔除重复脚本 217
17.5.25 减少DOM访问 218
17.5.26 开发智能事件处理程序 218
17.5.27 减小cookie体积 219
17.5.28 对于页面内容使用无cookie域名 219
17.5.29 优化图像 219
17.5.30 优化CSS Spirite 220
17.5.31 不要在HTML中缩放图像 220
17.5.32 favicon.ico要小而且可缓存 220
17.5.33 保持单个内容小于25KB 221
17.5.34 打包组件成复合文本 221
17.6 本章小结 221
参考文献 222