标题：软件测试设计
图书信息
测试实践丛书  软件测试设计
马均飞    郑文强  编著
ISBN 978-7-121-12967-4
2011年4月出版
定价：55.00元
16开
444 页
宣传语
全面解析问题驱动的软件测试设计方法
内 容 简 介
本书针对软件测试人员在测试设计过程中面临的各种问题，提出了“问题驱动的软件测试设计”方法。该方法将软件测试设计技术、测试设计中面临的问题和项目测试实践经验紧密结合，详细阐述了测试人员应该如何有效地开展软件测试设计活动。
测试人员在测试设计过程中经常面临各种问题和挑战，主要包括几乎无穷的测试对象输入数据的组合、不同利益相关者对软件产品的不同质量要求、非常有限的测试时间和测试资源，以及不全、模糊且经常变更的需求规格说明等。问题驱动的软件测试设计方法从经典测试设计、基于质量特性的测试设计、基于风险的测试设计和基于经验的测试设计4个方面，系统地解决测试人员在测试设计过程中碰到的各种问题。
本书适用于测试工程师、测试经理和质量改进人员阅读，也可以作为国际软件测试认证委员会（ISTQB）高级测试技术分析员和高级测试分析员的培训参考教材。
前  言
如何有效地减少测试用例数目？
如何避免测试用例之间的冗余？
如何满足客户对产品的不同质量要求？
如何应付紧迫的测试时间和有限的测试资源？
如何适应需求的不完善和变更？
如何快速获得产品的质量信息？
当你还在为这些测试设计问题而苦苦思索的时候，不妨看一看本书，它将为你提供一个测试设计的全新视角和思路。本书结合编者10年的软件测试实践经验，以解决软件测试设计面临的具体问题为目的，以现有的软件测试设计技术为基础，提出了问题驱动的软件测试设计方法。该方法不再将关注点集中在测试设计技术本身的描述，而是放在了不同的测试技术如何解决测试设计过程中面临的实际问题上。本书首先提出测试人员在测试设计过程中遇到的各种不同问题，然后应用不同的测试设计技术从不同的角度解决问题。
问题驱动的软件测试设计由4大类测试设计技术组成，即经典测试设计、基于质量特性的测试设计、基于风险的测试设计和基于经验的测试设计。该方法全面覆盖了现有的各种软件测试设计技术，不仅包括了等价类划分、边界值分析和决策表测试等经典测试技术，也包括了失效模式和影响分析FMEA以及探索性测试等测试技术。问题驱动的软件测试设计方法通过将测试人员面临的问题、测试技术和实践经验的紧密结合，为读者提供了全新的测试设计思想和理念，相信书中介绍的技术、方法和实践经验能够给读者带来对软件测试设计的全新认识。
软件测试设计的误区及本书的解决方法
软件测试设计是整个软件测试过程中的一个重要活动，其输出质量（无论是文档化的工作产品，还是存在于测试人员头脑中的想法）将会直接影响后续测试活动的效率和有效性，进而影响软件产品的最终质量。测试人员在测试设计过程中的如下误区常常会影响测试活动的有效开展。
（1）测试对象的需求规格说明是测试设计和执行的唯一输入，即测试人员的测试活动都以该说明作为判断依据。需求规格说明作为测试的输入，这观点本身没有错，但它不是唯一的。在测试过程中测试人员面对的需求常常是不全且模糊，甚至没有任何需求文档；另外，测试对象除了需求规格说明中包括的显现需求之外，测试人员还需要考虑一些隐现的需求。例如，竞争对手的产品特点和以前版本发现的缺陷等。
（2）假如测试对象满足了需求规格说明的要求，那么它就满足了产品的质量要求，这个误区实际上是上面的误区导致的。我们需要强调的是软件测试不仅仅是验证的目的（即Verification，正确地构建产品），而且需要达到确认的目的（即Validation，构建正确的产品）。因此在测试过程中还需要进行确认测试，即从用户的角度检查软件产品是否确实是用户需要的，是否实际满足了用户的真实需求和要求。在测试过程中，测试人员除了要考虑功能测试之外，还需要针对不同的质量特性进行非功能测试。
（3）测试对象的每个功能对于测试设计而言是同样重要。在实际测试设计过程中经常无意识地按照这个观点开展测试活动。例如，无论什么功能，忽略其重要程度和优先级，测试人员都会基于需求进行测试设计，同等对待每个功能的测试用例和规格说明等文档。
我们认为，前面的这些误区是由于片面地理解了一些测试思想和理念造成的，它们会直接影响测试人员测试设计活动的效率和有效性。为了更好地建立测试人员的测试思想和理念，从而更好地进行软件测试设计，本书提出了问题驱动的软件测试设计方法。这种方法将从需求、质量特性、风险和测试经验等方面入手，针对测试设计过程中面临的各种问题提供系统化的测试设计解决方案。
本书的创作过程及其主要内容
两年前就想写一本关于软件测试设计方面的书，机缘巧合，郑文强与笔者先写了一本《软件测试管理》（电子工业出版社，2010年7月）。正是该书的出版，为本书的写作奠定了坚实的理论和实践基础，使得该书在不到半年的时间内就完成了撰写和评审的所有工作。实际上我们在2009年末就完成了本书经典测试设计部分的内容，后来由于忙于《软件测试管理》的出版工作，所以中止了本书的写作。2010年5月完成《软件测试管理》出版之前的所有工作后，我们才又开始继续编写本书。本书的创作思路经历了如下两个不同的阶段。
（1）我们计划覆盖所有软件测试技术人员需要掌握的知识点。《软件测试管理》覆盖测试管理的内容，而本书将重点关注高级软件测试分析和技术。但是软件测试技术的内容很宽泛，而且软件测试技术人员需要掌握的知识点和软件测试管理人员有很多是重复的。如果按照原计划，本书差不多有一半的内容与《软件测试管理》类似。考虑再三，我们认为这样的一本书，对我们本身测试知识水平的提高不大，对读者而言也是不公平的，所以最后我们完全放弃了原来确定的写作架构和内容。
（2）尽管重新建立本书的框架和思路花费了很多精力，但是却更好地开拓了我们的视野，并且可以更加贴近测试人员的实际测试工作。此时我们将本书定位为软件测试设计领域的专著，而尽量不涉及软件测试其他方面的内容（当然完全不涉及其他内容是不可能的，因为软件测试设计不可能独立于其他测试活动而单独存在）。
确定本书的定位之后，接下来需要完善整体写作思路和目录结构。尽管软件测试设计技术在很多相关书籍中都会有所涉及，但是专门论述这些技术的书籍确实还不多。
首先我们根据自己多年的软件测试经验，罗列了测试人员在测试设计过程中经常面临的各种问题和挑战；
其次根据具体的问题分析，有针对性地选择合适的测试设计技术来解决它们；
最后将不同的测试设计技术和测试设计面临的问题与编者多年的测试设计实践经验相结合，提出了“问题驱动的软件测试设计”方法。该方法不再将重点放在软件测试设计技术理论上，而是将重点放在如何在测试过程中应用这些技术，有效地解决测试人员所面临的各种问题。
创作过程总是充满了艰辛，无论是收集各种相关的测试资料，还是准备各种合适的项目案例，甚至是评审过程中的各种争论。创作过程同样也是收获的过程，包含各种喜悦和成就感。比如，书的内容随着时间不断增加，软件测试设计技术的不断清晰化，以及测试设计中阐述的各种测试思想和理念不断解决测试人员面临的问题和挑战等。
本书是《软件测试管理》之后，二位笔者和郑文强的又一次成功合作。本书的创作过程不仅加深了我们在软件测试设计方面的理解，也在写作技巧、沟通和合作方面有了更多的收获。
本书分为4大部分，共12章。每个部分将基于测试人员在测试过程中面临的不同问题类型，分别阐述不同的测试技术，以及如何有效地解决该类型的问题。
本书主要解决的问题和挑战是相对独立的，读者可以根据自己面临的最紧迫问题选择相关的内容阅读，更加有效地在测试过程中解决实际问题。假如读者有时间，建议从头开始阅读，以系统地掌握本书所提出的整个测试思想，从而系统地解决测试设计过程中面临的各种问题。
本书的读者对象
软件测试设计是测试过程中的重要测试活动，不同测试人员对测试设计的理解和要求不同，笔者在本书的写作过程中兼顾不同要求。本书可以作为测试人员的案头手册，其中不仅提供全面的测试设计技术，同时帮助解决软件测试设计过程中面临的各种问题。本书的主要作用如下。
（1）对于软件测试的新手，本书提供的软件测试设计知识可以帮助其理解软件测试设计的概念，更好且更快地了解软件测试设计。
（2）对于有经验的测试人员，本书可以提供系统而全面的软件测试设计技术和方法，以快速提高其软件测试设计水平。
（3）对于软件测试的研究者，本书将测试设计过程中碰到的实际问题与测试设计技术和方法紧密结合起来，为其提供全新的软件测试设计思想。
推荐的阅读方式
本书融合了编者10多年的测试设计实践经验，以一个贯穿始终的大型项目案例为背景，系统地介绍了问题驱动的软件测试设计方法的思想。本书在介绍编者自身软件测试设计经验的同时，还介绍了大量的业界实践。本书融合了国内外众多软件测试领域专家的测试设计思想，直接参考的文献达上百篇。并通过脚注的形式提供，为读者的扩展阅读提供了方便。
如果读者希望全面了解软件测试设计知识，建议从头到尾顺序阅读本书；如果暂时只对部分章节感兴趣，也可以直接跳到相关章节。本书系统地介绍了各种软件测试设计知识，读者可以在需要了解某些测试设计技术和方法的时候回头翻阅本书，相信书中的内容和思想一定能够对读者的学习和工作有所帮助。
致谢
本书的出版离不开我们成长过程中给予我们帮助的同学、同事和朋友，他们为此书的出版提供了诚恳的指导和宝贵的意见。
感谢电子工业出版社孙学瑛编辑为本书提供的宝贵意见和大力支持，本书才得以在这么短的时间内与读者见面；同时感谢其他博文视点同事，他们的专业素质和敬业精神令我们感动。
最后要感谢我们的家人，这本书的写作占用了大量的晚上和周末的时间。没有他们的支持和鼓励，这本书很难面世。
由于编者水平和时间的限制，书中难免存在错误和不足之处，欢迎读者及各界同仁不吝指正。
编者
2011.2.1
目  录
第1部分  经典测试设计
第1章  静态测试 3
1.1  评审 4
1.1.1  评审遵循的原则 7
1.1.2  选择合适的评审类型 8
1.1.3  案例分析：如何开展评审活动 13
1.1.4  影响评审成功的因素 19
1.2  静态分析 21
1.2.1  基于代码的分析 22
1.2.2  基于架构的分析 28
1.3  小结 30
第2章  基于结构的测试 31
2.1  语句测试 35
2.2  判定测试 36
2.3  条件测试 37
2.4  判定条件测试 39
2.5  条件决定测试 40
2.6  条件组合测试 43
2.7  线性代码序列和跳转测试 44
2.8  路径测试 46
2.9  案例分析 48
2.9.1  实现各种测试覆盖 48
2.9.2  圈复杂度和路径测试 54
2.10  小结 58
第3章  基于规格说明的测试 60
3.1  等价类划分 61
3.1.1  识别等价类 63
3.1.2  创建测试用例 64
3.1.3  覆盖率准则 65
3.1.4  案例分析：LACP参数等价类测试 66
3.2  边界值分析 70
3.2.1  识别等价类 70
3.2.2  识别边界值 70
3.2.3  创建测试用例 72
3.2.4  覆盖率准则 72
3.2.5  案例分析：LACP参数边界值测试 72
3.3  决策表测试 76
3.3.1  确定条件桩和动作桩 77
3.3.2  初始决策表 78
3.3.3  优化决策表 78
3.3.4  创建测试用例 80
3.3.5  覆盖率准则 80
3.3.6  因果图和决策表 80
3.3.7  案例分析：ATM取款的决策表测试 81
3.4  状态转换测试 84
3.4.1  状态转换图 84
3.4.2  测试用例 86
3.4.3  N-Switch 92
3.4.4  覆盖率准则 93
3.4.5  案例分析：堆栈的状态转换测试 93
3.5  结对测试 100
3.5.1  基于正交矩阵的结对测试 102
3.5.2  Allpairs 114
3.5.3  案例分析：用户认证系统的测试 117
3.6  分类树方法 122
3.6.1  简介 122
3.6.2  CTE-XL 123
3.6.3  案例分析：测试编辑器的字体属性 132
3.7  用例/场景测试 135
3.7.1  用例的相关概念 135
3.7.2  用例规格说明 137
3.7.3  案例分析：ATM取款的用例测试 138
3.8  动态分析 141
3.8.1  内存泄漏 142
3.8.2  野指针 142
3.8.3  性能分析 143
3.9  案例分析：综合应用测试技术 143
3.9.1  使用Allpairs得到测试用例 144
3.9.2  基于分类树方法得到的测试用例 145
3.10  小结 146
第2部分  基于质量特性的测试设计
第4章  质量模型 149
4.1  McCall质量模型 149
4.1.1  软件质量框架 150
4.1.2  软件质量因素 151
4.1.3  软件质量标准 152
4.1.4  软件质量度量 154
4.2  Boehm质量模型 156
4.2.1  软件质量特性树 157
4.2.2  代码质量度量 158
4.2.3  使用质量特性改进软件生命周期 160
4.3  Dromey质量模型 161
4.3.1  质量模型框架 161
4.3.2  结构形式和产品属性 162
4.3.3  相互间的关系 163
4.4  ISO/IEC 9126 166
4.4.1  质量模型 166
4.4.2  内部和外部质量 167
4.4.3  使用质量 170
4.4.4  软件质量度量 171
4.5  案例分析：质量模型在测试类型定义中的应用 173
4.5.1  获取测试类型 174
4.5.2  定义测试类型 175
4.5.3  测试类型改变了什么 176
4.6  案例分析：测试存储设备解决方案 180
4.6.1  方案介绍 180
4.6.2  存储设备解决方案的测试设计 182
4.7  小结 183
第5章  功能测试 184
5.1  适合性测试 184
5.1.1  案例分析：用户视频点播的适合性测试 185
5.1.2  案例分析：图书在线续借功能的适合性
测试 187
5.2  准确性测试 188
5.2.1  案例分析：网上购物系统中购物结算的
准确性测试 189
5.2.2  案例分析：计算器中的准确性测试 193
5.3  互操作性测试 194
5.3.1  案例分析：SAN卷控制器的互操作性测试 195
5.3.2  案例分析：Gmail的互操作性测试 199
5.4  安全保密性测试 201
5.4.1  案例分析：PC安全性测试 203
5.4.2  案例分析：交换机安全性测试 206
5.5  辅助性测试 208
5.5.1  案例分析：命令行的辅助性测试 209
5.5.2  案例分析：网站的辅助性测试 211
5.6  小结 214
第6章  非功能测试 216
6.1  可靠性测试 216
6.1.1  可靠性测试介绍 216
6.1.2  软件可靠性工程测试 218
6.1.3  软件可靠性度量 221
6.2  易用性测试 223
6.2.1  易用性测试类型 224
6.2.2  易用性测试技术 229
6.3  效率测试 231
6.3.1  效率测试的主要类型 232
6.3.2  度量软件产品效率 234
6.4  可维护性测试 237
6.4.1  维护活动的分类 237
6.4.2  提高软件的可维护性 240
6.5  可移植性测试 243
6.6  案例分析：DHCP的非功能测试 245
6.6.1  DHCP功能介绍 245
6.6.2  DHCP非功能测试设计 247
6.6.3  DHCP非功能测试用例概要 247
6.7  小结 248
第3部分  基于风险的测试设计
第7章  认识风险 252
7.1  基本概念 252
7.1.1  产品风险 253
7.1.2  项目风险 254
7.1.3  风险与测试 256
7.2  开展风险活动 257
7.2.1  风险识别 258
7.2.2  风险分析 263
7.2.3  风险应对 265
7.3  ISO/IEC 16805 270
7.3.1  计划和实施风险管理 271
7.3.2  管理风险概要 272
7.3.3  执行风险分析 273
7.3.4  执行风险应对 274
7.3.5  执行风险监控 274
7.3.6  评估风险管理过程 275
7.4  小结 276
第8章  基于风险的测试设计 277
8.1  启发式分析方法 277
8.1.1  INSIDE-OUT 278
8.1.2  OUTSIDE-IN 279
8.2  攻击 281
8.2.1  用户接口攻击 282
8.2.2  系统接口攻击 283
8.2.3  冲突测试 283
8.3  失效模式和影响分析 284
8.3.1  概述 284
8.3.2  应用领域 287
8.3.3  实现步骤 289
8.3.4  收益与成本 297
8.3.5  确定RPN 298
8.4  案例分析：综合实施基于风险的测试设计 299
8.4.1  了解测试对象 301
8.4.2  识别失效模式 301
8.4.3  确定发生可能性 306
8.4.4  确定严重程度 307
8.4.5  确定检测难度 308
8.4.6  计算RPN 308
8.4.7  设计测试用例 309
8.5  小结 310
第9章  基于风险的测试管理 312
9.1  选择测试重点 312
9.2  选择合适的测试策略 317
9.2.1  测试策略 317
9.2.2  案例分析：风险管理在IGMP功能中的应用 318
9.3  基于风险的测试实践 322
9.3.1  风险与测试过程的集成 322
9.3.2  尽早开展风险活动 324
9.3.3  风险活动的迭代 325
9.4  讨论：基于风险的测试 325
9.4.1  作用 325
9.4.2  优点 326
9.4.3  挑战 330
9.5  案例分析：通过风险监控测试过程 332
9.5.1  风险相关的度量 332
9.5.2  风险在测试过程监控中的应用 333
9.6  小结 336
第4部分  基于经验的测试设计
第10章  基于缺陷分类的测试 339
10.1  软件缺陷分类 340
10.1.1  异常分类 340
10.1.2  正交缺陷分类 344
10.1.3  其他分类 347
10.2  实施基于缺陷分类的测试 351
10.2.1  缺陷分类的作用 351
10.2.2  激发测试思想 352
10.2.3  创建缺陷分类 355
10.3  案例分析：缺陷分类在测试设计中的应用 357
10.3.1  获取功能基本信息 357
10.3.2  获取缺陷分类 358
10.3.3  评审和改进 360
10.3.4  测试用例设计和实现 361
10.4  小结 361
第11章  探索性测试 362
11.1  概述 363
11.1.1  测试的本质 363
11.1.2  脚本化测试的问题 364
11.1.3  探索性测试的引入 368
11.2  实施探索性测试 370
11.2.1  学习 371
11.2.2  设计 374
11.2.3  执行 376
11.2.4  结果分析 377
11.2.5  探索性测试人员 378
11.3  基于会话的测试管理 378
11.3.1  会话与会话管理 379
11.3.2  度量和估算 383
11.3.3  面临的挑战 385
11.4  案例分析：HTSM 387
11.4.1  什么是HTSM 387
11.4.2  应用HTSM 392
11.5  小结 395
第12章  基于应用类型的测试 397
12.1  基于Web的测试 397
12.1.1  Web系统组成 399
12.1.2  客户端测试 401
12.1.3  服务器端测试 402
12.2  GUI测试 404
12.2.1  GUI的特点 404
12.2.2  Rational Functional Tester 405
12.3  协议一致性测试 406
12.3.1  多种不同协议 407
12.3.2  TTCN在协议一致性测试中的应用 410
12.4  安全关键系统测试 411
12.4.1  安全关键系统 411
12.4.2  主要特征 412
12.4.3  测试安全关键系统的注意事项 413
12.5  综合系统测试 416
12.5.1  综合系统 416
12.5.2  主要特征 418
12.5.3  测试综合系统的注意事项 419
12.6  小结 421
参考文献 422
实例目录
第1章  静态测试 3
例1-1 “IGMP系统需求规格说明”评审邀请信 15
例1-2 “IGMP系统需求规格
说明”审查收集的数据 18
例1-3  C++编码标准命名规则（方法和函数命名） 27
第2章  基于结构的测试 31
例2-1  程序代码到控制流图的转换 33
第3章  基于规格说明的测试 60
例3-1  发放年终奖 62
例3-2  判断三角形类型 77
例3-3  某航空公司的订票系统 84
例3-4  测试某网站系统 100
第4章  质量模型 149
例4-1  不同软件的质量比较 150
例4-2  软件质量因素之间的联系 154
例4-3  对比型度量 154
例4-4  度量指标评估 159
例4-5  准确性内部度量 171
例4-6  安全保密性外部度量 172
例4-7  有效性使用度量 172
第6章  非功能测试 216
例6-1  某医院门诊信息管理系统的可靠性测试 220
例6-2  图书馆信息系统运行概况 222
例6-3  Bridge模式和设置MAC
老化时间的易用性测试 224
例6-4  Bridge不同模式术语的不一致 225
例6-5  软件产品输入和输出的易理解性问题 225
例6-6  DHCP配置的易学性问题 226
例6-7  系统安装步骤过于复杂 226
例6-8  帮助信息不清晰 226
例6-9  CLI命令格式不一致 227
例6-10  无法批量更改端口属性 227
例6-11  选择参数问题 228
例6-12  创建密码时的易用性验证 231
例6-13  IBM提供的维护活动（部分） 240
例6-14  系统需求规格说明的可维护性要求 243
例6-15  不同CPU架构的字节顺序 244
第7章  认识风险 252
例7-1  风险的可能性与风险的严重程度 253
例7-2  产品风险列表 254
例7-3  风险问卷调查法 259
例7-4  风险模板 260
第8章  基于风险的测试设计 277
例8-1  INSIDE-OUT的模拟场景 278
例8-2  质量特性列表 280
例8-3  通用风险列表 280
例8-4  测试边界值 282
例8-5  打印机的冲突测试 283
第9章  基于风险的测试管理 312
例9-1  基于潜在风险列表选择测试重点 313
例9-2  基于优化的风险级别选择测试重点 315
例9-3  没有及时应对“采购IGMP测试仪表”风险而导致的影响 324
第10章  基于缺陷分类的测试 339
例10-1  按发现的项目阶段分类缺陷 340
例10-2  按严重程度分类缺陷 340
例10-3  按优先级分类缺陷 341
例10-4  当“目标”为“需求/设计/代码”时对应的缺陷类型 345
例10-5  缺陷分类如何拓宽测试人员的测试思想 353
第11章  探索性测试 362
例11-1  不同的利益相关者对软件产品质量的理解不同 364
例11-2  环境驱动的测试 366
例11-3  脚本化测试与探索性测试 369
例11-4  探索性测试 370
例11-5  规格说明中的模糊问题 373
例11-6  规格说明中的可测试性问题 374
例11-7  何时应该根据失效设计测试用例 375
例11-8  如何通过失效设计测试用例 375
例11-9  结对测试 376
例11-10  测试用例执行结果判断准则 377
例11-11  测试章程 380
例11-12  测试章程相关的活动和非测试章程相关的活动 381
例11-13  针对光电转换模块SFP的测试会话报告 382
例11-14  根据平均会话数目估算测试工作量 384
第12章  基于应用类型的测试 397
例12-1  不同浏览器对同一Web页面的解析 398
例12-2  Selenium 403
例12-3  IBM® Rational® TTCN Suite 411
例12-4  企业级存储设备 412
例12-5  FDA对软件开发活动的要求 414
例12-6  安全关键系统组件 416
例12-7  未来作战系统 417