子系统测试概述 1
第一部分 基本手段 16
第1章 规格说明 16
1.1 规格说明的要素 16
1.1.1 前提 16
1.1.2 后果 17
1.1.3 定义 18
1.2 检查规格说明 19
1.2.1 不完备 19
1.2.2 模糊 19
第2章 SREADHEX例子介绍 20
2.1 引入 20
2.2 规格说明 21
2.3 代码 23
第3章 构建测试需求检查单 26
3.1.1 前提与后果 27
3.1 查找规格说明中的线索 27
3.1.2 变量 28
3.1.3 操作 28
3.1.4 定义 28
3.2 查找代码中的线索 29
3.2.1 变量 29
3.2.2 模式操作 30
3.2.3 函数调用 31
3.3 找出SREADHEX的线索 32
3.3.1 代码 34
3.3.2 我们现在所处的位置 36
3.4 通过前提、后果和定义获取测试需求 36
3.4.1 简单验证前提 36
3.4.2 使用OR的验证前提 37
3.4.3 使用AND的验证前提 40
3.4.4 AND和OR组合验证前提 41
3.4.5 假设前提 42
3.4.6 后果 43
3.4.7 定义 45
3.5 找出SREADHEX的测试需求 46
3.6 通过大纲确定测试需求 51
3.7 通过SREADHEX说明大纲的使用 52
3.8 我们现在所处的位置 77
3.9 使用测试需求大纲规则小结 78
3.10 集成测试需求 79
3.10.1 集成测试需求的一个例子 81
3.10.2 另一个例子 81
3.10.3 最后一个例子 83
3.11 SREADHEX的集成测试需求 83
3.12 错误猜测 83
3.13 根据规格说明扫描代码 84
第4章 测试规格说明 85
4.1 标记将要使用的规格说明 86
4.2 一般测试规格说明 86
4.3 错误测试规格说明 93
4.4 构建测试规格说明要注意的问题 94
4.5 有关测试形式的规则 95
4.6 有关测试内容的规则 96
4.7 分别测试规格说明和代码 99
4.7.1 通过规格说明处理需求 99
4.7.2 根据代码进行需求的while处理 100
4.8 SREADHEX测试规格说明 100
4.8.1 设计注释 102
4.8.2 测试1 103
4.8.3 测试2 104
4.8.4 测试3 109
4.8.5 测试3(续) 111
4.8.6 测试4 114
4.8.7 测试5、6和7 118
4.8.8 测试8 119
4.9 我们现在所处的位置 122
5.1.2 比较实际结果和预期结果 123
5.1.1 向子系统提供输入 123
5.1 测试驱动器 123
第5章 测试驱动器与套件驱动器 123
5.2 套件驱动器 125
5.3 测试自己的驱动器 126
5.4 SREADHEX驱动器 126
5.4.1 大纲与文件结构 126
5.4.2 驱动器与桩 127
5.4.3 运行测试 128
5.5 我们现在所处的位置 129
第6章 采用问题大纲审查代码 130
6.1 责任 131
6.2 审查SREADHEX 132
第7章 利用覆盖率检验测试套件 134
7.1 覆盖率的类型 134
7.2 不可行的覆盖率 136
7.3 运用覆盖率信息 137
7.3.2 需要小心运用覆盖率的一个例子 139
7.3.1 覆盖率成本的一个例子 139
7.4 一个较大例子 140
7.4.1 程序 140
7.4.2 使用通用覆盖率工具(GCT) 141
7.4.3 覆盖率 142
7.4.4 新测试 145
7.5 SREADHEX的覆盖率 145
7.6 我们现在所处的位置 149
第8章 清理 150
第9章 其他提示 151
9.1 使用优先级较低的需求 151
9.2 不确定的限制 151
第二部分 实施子系统测试 154
第10章 实施 154
10.1 运用覆盖率 154
10.2 改进测试规格说明 154
10.3 改进测试需求 155
10.4 并行改进规格说明分析 156
第11章 完善 157
第三部分 实践中的子系统测试 162
第12章 使用更典型的规格说明 162
12.1 例子:GREPORT 163
12.2 过程 165
12.3 练习 172
12.4 通过代码导出规格说明 175
13.1.1 制订测试进度表 180
13.1 复杂性的应对方案 180
第13章 处理大型子系统 180
13.1.2 例程需求 181
13.1.3 较大子系统中的ERROR需求 183
13.2 大型子系统的危险 185
13.2.1 内部测试驱动器 186
13.2.2 外部调试器 189
13.2.3 没有调试器时的方法 189
13.3 选择子系统 189
第14章 测试错误修改与其他维护变更 191
14.1 一个例子 193
14.2 测试变更的基本过程 193
14.3 传播缺陷 197
14.4 相似性缺陷 200
14.5 测试较大变更 201
14.6 测试套件退化 202
第15章 时间进度压力下的测试 203
15.1 没有足够时间的测试 203
15.2 几乎没有足够时间的测试 204
第四部分 举例与扩展 206
第16章 句法测试 206
16.1 符号 206
16.2 测试需求 208
16.2.1 邻近项 209
16.2.2 序列 209
16.2.3 替换项 209
16.2.4 简单重复 210
16.2.5 重复与替换项 211
16.3 交互 213
第17章 第二个完整例子:MAX 215
17.1 规格说明 215
17.2 通过规格说明导出测试 216
17.2.1 线索 216
17.2.2 来自前提和后果的需求 217
17.2.3 扫描大纲 218
17.2.4 测试设计 227
17.3 通过代码导出测试 231
17.4 使用问题大纲 236
17.5 测试驱动器与测试运行 238
17.6 使用覆盖率 241
第18章 测试一致性关系 243
18.1 构建测试需求检查单 250
18.1.1 基本检查单 250
18.1.2 增加缺陷可视性的注释 253
18.1.3 测试这个例子 259
18.2.1 多于两个变量 261
18.2 多样性问题 261
18.2.2 检验子系统的其他部分 263
18.2.3 如果检查由库例程完成 266
18.2.4 未检查或不可能的ERROR需求 267
18.2.5 如果多个变量可以同时变更 267
第19章 状态机与状态图 271
19.1 状态机 271
19.1.1 实现 272
19.1.2 稀疏状态机 275
19.1.3 冗余迁移 275
19.2 状态图 276
19.2.1 状态行动 276
19.2.2 条件状态迁移 278
19.2.3 嵌套状态 279
19.2.4 历史信息 282
19.2.5 状态图实现框架 283
19.3.1 模型什么时候有用 285
19.3 什么时候和怎样构建模型 285
19.3.2 构建模型 286
19.4 审查状态机和状态图 288
19.4.1 检查模型 288
19.4.2 审查行动 291
19.4.3 检查实现映射 291
19.5 测试状态机和状态图 291
19.5.1 测试需求 292
19.5.2 来自状态图的需求 294
19.5.3 测试规格说明 296
19.5.4 测试实现 298
19.5.5 覆盖率 299
19.6 多个状态机 299
19.6.1 独立状态机 299
19.6.2 通信状态机 302
第20章 测试使用可重用软件的子系统 305
20.1 测试需求 305
20.2 覆盖率 307
第21章 测试基于对象的软件 308
21.1 背景 308
21.1.1 术语 309
21.1.2 其他方法 310
21.2 子系统规模与测试实现 310
21.2.1 两种特例 312
21.2.2 另一种方法 312
21.3 类测试需求大纲 313
21.3.1 组织 313
21.3.2 第一步:对象使用需求 314
21.3.3 第二步:状态机需求 315
21.3.4 第三步:成员函数集成需求 315
21.3.5 第四步:对象的聚合 316
21.4 使用类需求大纲 316
21.5 时间进度压力 316
第22章 面向对象的软件1:继承 318
22.1 测试规格说明与实现 320
22.2 导出类的类型 322
22.3 导出类需求大纲 325
22.3.1 复制基类需求大纲 325
22.3.2 处理新成员 327
22.3.3 处理顶替成员函数 327
22.3.4 处理继承成员函数 329
22.3.5 更新剩余的对象使用需求 330
22.3.6 更新状态机需求 330
22.3.7 多继承 331
22.4 成员函数的测试需求检查单 331
22.4.1 新的成员函数 331
22.4.2 顶替成员函数 331
22.4.3 继承成员函数 332
22.5 针对已变更外部例程的测试需求检查单 332
22.6 通用性(模板) 333
23.1 abstract_hash_table:一个抽象类 338
第23章 测试导出类的一个例子 338
23.2 hash_table:一个导出类 345
23.2.1 hash_table大纲 346
23.2.2 hash_table成员函数的测试需求检查单 347
23.2.3 hash_table测试规格说明与实现 349
23.3 checking_hash_table:另一个导出类 349
23.3.1 checking_hash_table大纲 350
23.3.2 checking_hash_table成员函数的测试需求检查单 352
23.3.3 实现checking_hash_table测试 353
23.4 abstract_hash_table<Item,sz>:模板类 353
第24章 面向对象的软件2:动态捆绑 357
24.1 虚拟调用需求大纲 357
24.1.1 捆绑虚拟调用大纲 358
24.1.2 怎样处理数据成员? 363
24.1.3 在变更中构建虚拟调用大纲 364
24.2.2 增加了导出类 365
24.2.3 维护 365
24.2 使用虚拟调用需求大纲 365
24.2.1 编写了新的外部代码 365
第五部分 测试需求的乘积 369
第25章 简单测试需求乘积 369
25.1 变量需求可达性 369
25.1.1 过程——通过规格说明和代码来处理 374
25.1.3 测试大型子系统的含意 376
25.1.4 举例:一致性检查 376
25.1.2 过程——只通过规格说明来处理 376
25.1.5 举例:根据sreadhex规格说明来处理 377
25.1.6 举例:构建sreadhex规格说明 378
25.2 复杂布尔表达式 379
25.2.1 导出需求的大纲 380
25.2.2 举例 382
25.3 创建布尔便利定义 382
25.3.1 过程 384
25.3.2 greport例子 386
25.3.3 greport的其他问题 387
25.4 数据流测试 389
25.5 一些理论 392
第26章 操作测试需求的乘积 394
26.1 过程 396
26.1.1 找出交互线索 396
26.1.2 乘积 398
26.1.3 覆盖率 399
26.1.4 举例 400
26.2 发散操作 401
第六部分 附录 404
附录A 测试需求大纲(学生版) 404
附录B 测试需求大纲(标准版) 414
附录C 与POSIX有关的测试需求大纲(部分样本) 432
附录D 代码审查问题大纲 435
附录E 复杂布尔表达式需求大纲 440
附录F 用于测试编写内容的检查单 447
参考文献 460
术语表 466