第Ⅰ部分 软件测试介绍 3
第1章 软件工程:一种与众不同的原则 3
1.1 年轻而动荡的原则 3
1.2 压力下的行业 6
1.3 规模庞大的复杂产品 7
1.4 昂贵的产品 10
1.5 缺乏重用实践 12
1.6 容易出错的设计 13
1.7 矛盾的经济学 14
1.7.1 劳动力密集的产业 15
1.7.2 缺少自动化 15
1.7.3 质量控制手段有限 16
1.7.4 不平衡的生命周期成本 16
1.7.5 不平衡的维护成本 17
1.8 本章小结 19
1.9 参考书目注释 19
第2章 软件质量属性 21
2.1 功能属性 22
2.1.1 布尔属性 22
2.1.2 统计属性 23
2.2 操作属性 25
2.3 可用性属性 27
2.4 业务属性 28
2.5 结构属性 30
2.6 本章小结 32
2.7 练习 32
2.8 参考书目注释 33
第3章 软件测试生命周期 35
3.1 软件工程生命周期 35
3.2 软件测试生命周期 41
3.3 软件测试的V模型 48
3.4 本章小结 51
3.5 参考书目注释 51
第Ⅱ部分 软件测试基础 55
第4章 软件规约 55
4.1 坚实可靠规约的原则 57
4.2 关系数学 58
4.2.1 集合与关系 58
4.2.2 关系操作 59
4.2.3 关系的属性 61
4.3 简单的输入输出程序 63
4.3.1 表达规约 63
4.3.2 对规约排序 67
4.3.3 规约生成 69
4.3.4 规约确认 75
4.4 可靠性和安全性 83
4.5 基于状态的系统 86
4.5.1 关系模型 86
4.5.2 公理表达 89
4.5.3 规约确认 98
4.6 本章小结 101
4.7 练习 101
4.8 问题 106
4.9 参考书目注释 109
第5章 程序正确性和验证 111
5.1 正确性的定义 113
5.2 正确性:命题 117
5.2.1 正确性和精化 118
5.2.2 集合论的特征 120
5.2.3 解释 121
5.3 验证 124
5.3.1 公式样例 126
5.3.2 推理系统 128
5.3.3 用于解释的示例 133
5.4 本章小结 138
5.5 练习 139
5.6 问题 141
5.7 参考书目注释 141
第6章 失效、错误和缺陷 143
6.1 失效、错误和缺陷 143
6.2 缺陷和相对正确性 146
6.2.1 缺陷,一个含糊的概念 146
6.2.2 相对正确性 148
6.3 视情况而定的缺陷和确定性缺陷 151
6.3.1 视情况而定的缺陷 151
6.3.2 单调的缺陷去除 155
6.3.3 一个单调缺陷去除的框架 161
6.3.4 确定性缺陷 162
6.4 缺陷管理 164
6.4.1 多道防线 164
6.4.2 混合确认 166
6.5 本章小结 171
6.6 练习 172
6.7 问题 174
6.8 参考书目注释 174
第7章 软件测试分类 175
7.1 联合测试存在的问题 175
7.2 分类方案 176
7.2.1 主要属性 178
7.2.2 次要属性 183
7.3 测试分类 190
7.3.1 单元级测试 190
7.3.2 系统级测试 192
7.4 练习 194
7.5 参考书目注释 195
第Ⅲ部分 测试数据生成 199
第8章 测试生成概念 199
8.1 测试生成和目标属性 199
8.2 测试输出 203
8.3 测试生成需求 206
8.4 测试生成准则 211
8.5 基于经验的充分性评价 216
8.6 本章小结 222
8.7 练习 223
8.8 参考书目注释 225
8.9 附录:变异程序 226
第9章 功能准则 229
9.1 域划分 229
9.2 使用表格表达式生成测试数据 237
9.3 基于状态的系统的测试生成 244
9.4 随机测试数据生成 255
9.5 将测试数据选择比喻为一次旅行 260
9.6 本章小结 263
9.7 练习 264
9.8 参考书目注释 267
第10章 结构化准则 269
10.1 路径和路径条件 270
10.1.1 执行路径 270
10.1.2 路径函数 273
10.1.3 路径条件 279
10.2 控制流覆盖 281
10.2.1 语句覆盖 281
10.2.2 分支覆盖 284
10.2.3 条件覆盖 286
10.2.4 路径覆盖 289
10.3 数据流覆盖 296
10.3.1 定义和使用 296
10.3.2 测试生成准则 300
10.3.3 测试准则的层次结构 304
10.4 基于缺陷的测试生成 305
10.4.1 感知缺陷 306
10.4.2 为感知缺陷选择输入数据 311
10.4.3 针对错误传播选择输入数据 313
10.5 本章小结 314
10.6 练习 315
10.7 参考书目注释 319
第Ⅳ部分 测试部署与分析 323
第11章 测试预言设计 323
11.1 测试预言设计的困境 323
11.2 从规约到预言 327
11.3 基于状态的软件产品的测试预言 332
11.3.1 从公理到测试预言 333
11.3.2 从规则到预言 335
11.4 本章小结 342
11.5 练习 343
第12章 测试驱动设计 347
12.1 选择一种规约 347
12.2 选择一种过程 350
12.3 选择一种规约模型 352
12.3.1 随机测试生成 353
12.3.2 预先生成的测试数据 360
12.3.3 缺陷和缺陷检测 365
12.4 使用符号执行进行测试 370
12.5 本章小结 376
12.6 练习 376
12.7 参考书目目注释 383
第13章 分析测试输出 385
13.1 逻辑解释 386
13.1.1 具体测试 386
13.1.2 符号测试 388
13.1.3 具体-符号测试 389
13.2 随机解释:缺陷密度 391
13.3 随机解释:失效概率 395
13.3.1 缺陷与缺陷并不相同 395
13.3.2 定义/量化可靠性 398
13.3.3 软件可靠性建模 400
13.3.4 认证测试 405
13.3.5 可靠性估计和可靠性增长 406
13.3.6 可靠性标准 411
13.3.7 作为经济函数的可靠性 412
13.4 本章小结 422
13.5 练习 423
13.6 问题 425
13.7 参考书目注释 426
第Ⅴ部分 软件测试管理 429
第14章 软件测试的度量 429
14.1 缺陷倾向性 431
14.1.1 圈复杂度 431
14.1.2 规模 433
14.2 缺陷可检测性 434
14.3 错误可检测性 439
14.4 错误可掩盖性 442
14.5 避免失效 445
14.6 容错 447
14.7 解释示例 449
14.7.1 圈复杂度 450
14.7.2 规模 450
14.7.3 状态冗余 450
14.7.4 函数冗余 451
14.7.5 非内射性 452
14.7.6 不确定性 452
14.7.7 小结 453
14.8 本章小结 454
14.9 练习 455
14.10 参考书目注释 456
第15章 软件测试工具 457
15.1 分类方案 457
15.2 脚本工具 459
15.2.1 CppTest 459
15.2.2 SilkTest 460
15.3 录制-回放工具 462
15.3.1 TestComplete 462
15.3.2 Selenium IDE 463
15.4 性能测试工具 465
15.4.1 LoadRunner 465
15.4.2 Grinder 466
15.4.3 QF-Test 467
15.4.4 Appvance PerformanceCloud 468
15.4.5 JMeter 469
15.5 预言设计工具 471
15.5.1 JUnit 471
15.5.2 TestNG 472
15.6 异常检测 473
15.6.1 Rational Purify 473
15.6.2 Astree 474
15.7 协同工具 475
15.8 本章小结 476
第16章 测试产品线 477
16.1 PLE:流水线重用模型 477
16.2 测试问题 482
16.3 测试方法 485
16.4 解释 486
16.4.1 领域分析 486
16.4.2 领域建模 490
16.4.3 参考架构 494
16.4.4 领域实现 496
16.4.5 在领域工程阶段进行测试 503
16.4.6 在应用程序工程阶段进行测试 508
16.5 本章小结 511
16.6 练习 512
16.7 问题 513
16.8 引用的参考书目 513
参考文献 515