第1章 绪论 1
1.1 软件危机和软件生存期 1
1.2 软件测试的意义 4
1.3 什么是软件测试 8
1.4 应该怎样认识软件测试 10
1.5 软件测试发展的历史回顾 19
1.5.1 历史回顾 19
1.5.2 与软件测试相关课题的发展 21
习题 22
第2章 软件测试策略 23
2.1 测试的生命周期 23
2.2 测试步骤 26
2.2.1 单元测试 27
2.2.2 集成测试 30
2.2.3 确认测试 32
2.2.4 系统测试 33
2.3 静态方法与动态方法 34
2.4 黑盒测试与白盒测试 36
2.4.1 黑盒测试 36
2.4.2 白盒测试 37
2.4.3 黑盒测试与白盒测试的比较 37
2.5 回归测试方法 39
2.6 人工测试与自动测试 40
2.6.1 人工测试技术概述 40
2.6.2 软件审查 41
2.6.3 软件审查的作用 42
2.6.4 自动测试 45
习题 48
第3章 黑盒测试 49
3.1 等价类划分 49
3.1.1 方法简介 49
3.1.2 应用等价类划分方法进行测试用例设计的实例 50
3.2 因果图 54
3.3 正交实验设计法 57
3.3.1 提取功能说明,构造因子——状态表 57
3.3.2 加权筛选,生成因素分析表 58
3.3.3 利用正交表构造测试数据集 59
3.3.4 方法评价 62
3.4 边值分析 63
3.4.1 单变量边界值的选取 63
3.4.2 多个变量组合情况下边界值的选取 64
3.5 判定表驱动测试 66
3.5.1 什么是判定表 66
3.5.2 判定表在功能测试中的应用 69
3.6 功能测试 70
3.6.1 功能测试的系统化 70
3.6.2 模块功能的分解测试 73
习题 76
第4章 白盒测试 77
4.1 程序结构分析 77
4.1.1 控制流分析 77
4.1.2 数据流分析 80
4.1.3 信息流分析 84
4.2 逻辑覆盖 85
4.2.1 几种常用的逻辑覆盖测试方法 85
4.2.2 最少测试用例数计算 90
4.2.3 测试覆盖准则 92
4.3 域测试 94
4.4 符号测试 98
4.5 路径分析 101
4.5.1 程序路径表达式 101
4.5.2 程序中路径数的计算 103
4.5.3 程序路径的树表示及路径编码 105
4.5.4 测试路径枚举 109
4.5.5 路径测试系统 110
4.6 程序插装 111
4.6.1 方法简介 111
4.6.2 断言语句 113
4.7 程序变异 115
4.7.1 程序强变异 116
4.7.2 程序弱变异 118
习题 120
第5章 集成测试 123
5.1 集成测试的必要性 123
5.2 程序结构分析 124
5.3 集成的方法 124
5.3.1 一次性集成 125
5.3.2 自顶向下集成 126
5.3.3 自底向上集成 129
5.3.4 协作集成 131
5.3.5 基于集成 133
5.3.6 层次集成 135
5.3.7 客户/服务器集成 136
5.3.8 分布服务集成 137
5.3.9 高频集成 139
5.3.10 基于调用图集成 141
习题 143
第6章 系统测试 145
6.1 非功能测试 146
6.1.1 安装测试 146
6.1.2 兼容性测试 147
6.1.3 安全性测试 149
6.1.4 恢复测试 151
6.2 性能测试 153
6.2.1 负载测试 154
6.2.2 压力测试 154
6.2.3 容量测试 155
6.3 其他测试 157
6.3.1 α测试 158
6.3.2 β测试 158
6.3.3 文档测试 158
6.3.4 界面测试 160
习题 161
第7章 测试组织和管理 163
7.1 测试准备 163
7.1.1 测试需求分析和计划 164
7.1.2 测试环境搭建 167
7.1.3 测试用例 170
7.2 测试实施 172
7.2.1 测试用例执行 173
7.2.2 测试数据记录 174
7.2.3 测试沟通 174
7.2.4 测试用例验证 174
7.3 测试总结 175
7.3.1 测试数据整理 175
7.3.2 测试用例修订 175
7.3.3 用例库的维护 175
7.3.4 配置管理 176
7.4 缺陷管理 177
7.4.1 缺陷描述 177
7.4.2 测试缺陷追踪 178
7.4.3 缺陷统计分析 180
7.4.4 寻找薄弱环节 181
7.5 测试成熟度模型 182
7.6 测试度量 184
习题 186
第8章 测试工具 187
8.1 测试工具综述 187
8.1.1 白盒测试工具 188
8.1.2 黑盒测试工具 189
8.1.3 测试管理工具 190
8.1.4 其他测试工具 192
8.2 JUnit(白盒测试工具) 193
8.2.1 JUnit简介 193
8.2.2 JUnit测试过程 194
8.2.3 JUnit断言设置 194
8.2.4 JUnit测试用例 195
8.3 LoadRunner(黑盒测试工具) 196
8.3.1 创建Vuser脚本 197
8.3.2 定义方案场景 197
8.3.3 运行方案场景 198
8.3.4 分析负载结果 199
8.4 TestDirector(测试管理工具) 199
8.4.1 测试需求定义 200
8.4.2 测试计划 201
8.4.3 测试执行 202
8.4.4 缺陷跟踪 202
8.5 WAST(专用测试工具) 203
8.5.1 准备测试脚本 203
8.5.2 设置测试脚本 204
8.5.3 运行测试脚本 205
8.5.4 应用侧重点 205
8.6 Introscope(测试辅助工具) 205
8.6.1 Introscope工作模式 206
8.6.2 Introscope测试策略 206
8.6.3 Introscope测试过程 208
8.6.4 Introscope监控指标 208
8.7 开源测试工具解决方案 209
习题 210
第9章 软件评审 211
9.1 软件评审方法 211
9.1.1 软件评审方法概述 211
9.1.2 软件项目评审应用举例 212
9.1.3 软件评审的定义 217
9.1.4 相关国际标准及能力成熟度模型中对软件评审的要求 218
9.2 软件评审的作用 222
9.2.1 软件评审的意义 222
9.2.2 代码评审的成功实例 226
9.2.3 评审与其他验证方法的比较 226
9.3 软件评审的实施 228
9.3.1 正式评审 228
9.3.2 需求评审 230
9.3.3 设计评审 234
9.3.4 代码评审 235
9.4 如何做好软件评审 236
9.4.1 软件评审中经常出现的问题 236
9.4.2 做好软件评审工作的建议 236
9.4.3 一个软件需求规格说明书的评审用检查单 236
习题 238
第10章 软件质量与软件质量管理 239
10.1 软件质量问题的挑战 239
10.1.1 软件质量问题引发的系统事故屡见不鲜 239
10.1.2 软件质量事故问题分析 240
10.1.3 解决软件质量问题的途径 241
10.2 软件错误类型分析 242
10.3 程序中隐藏错误数量估计 246
10.3.1 撒播模型 246
10.3.2 回归模型 248
10.4 软件质量特性 249
10.5 与软件质量管理相关的若干过程 251
10.5.1 软件质量保证过程 252
10.5.2 软件验证过程 253
10.5.3 软件确认过程 254
10.5.4 软件评审过程 255
10.5.5 软件审核过程 256
10.5.6 软件问题解决过程 257
10.6 软件质量因素和质量特性 258
10.7 软件质量保证的任务 261
10.8 程序排错 262
10.8.1 排错工作概述 262
10.8.2 排错方法 263
10.8.3 排错策略 264
习题 266
第11章 测试可靠性与软件可靠性 267
11.1 测试可靠性理论 267
11.1.1 测试可靠性的奠基性理论 267
11.1.2 路径测试可靠性理论 268
11.1.3 暴露子域理论 270
11.1.4 测试的数学符号系统 272
11.2 软件可靠性概念 274
11.3 软件可靠性模型 279
11.4 软件可靠性在软件测试中的应用 286
11.5 近几年的发展状况 292
习题 293
第12章 程序正确性证明 294
12.1 程序正确性证明概述 294
12.2 以公理语义学为基础的正确性证明技术 296
12.2.1 程序规范 296
12.2.2 程序及其运行状态 297
12.2.3 程序正确性与部分正确性 297
12.2.4 公理正确性证明 298
12.2.5 FLOY D的归纳断言法 299
12.2.6 HOARE的公理方法 305
12.2.7 E.W.Dijkstra的最弱前置条件法 307
12.2.8 程序正确性证明技术存在的问题 310
12.3 程序综合 311
12.3.1 面向目标的程序推导 311
12.3.2 不变式推导技术 313
12.4 进一步研究的方向 314
习题 315
参考文献 316