描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111611295
内容简介
This extensively classroom-tested text uses an innovative approach to explaining software testing, and covers the latest techniques to test software such as OO, web applications, and embedded software. This new edition features vastly expanded coverage of the basics and the JUnit framework, as well as many new examples and exercises.
目 录
出版者的话
译者序
前言
部分 软件测试基础
第1章 为什么测试软件 2
1.1 软件何时会出现问题 3
1.2 软件测试的目的 6
1.3 参考文献注解 13
第2章 模型驱动测试设计 15
2.1 软件测试基础 15
2.2 软件测试活动 17
2.3 基于软件活动的测试级别 17
2.4 覆盖准则 19
2.5 模型驱动测试设计 21
2.5.1 测试设计 22
2.5.2 测试自动化 22
2.5.3 测试执行 23
2.5.4 测试评估 23
2.5.5 测试者和抽象 23
2.6 MDTD为什么重要 25
2.7 参考文献注解 25
第3章 测试自动化 27
3.1 软件可测性 27
3.2 测试用例的构成 28
3.3 测试自动化框架 30
3.3.1 JUnit测试框架 31
3.3.2 数据驱动测试 35
3.3.3 在单元测试中添加参数 36
3.3.4 从命令行运行JUnit 38
3.4 超越自动化 38
3.5 参考文献注解 41
第4章 测试优先 42
4.1 驯服改动成本曲线 42
4.1.1 改动成本曲线真的被驯服了吗 43
4.2 测试装具——守护者 44
4.2.1 持续集成 45
4.2.2 敏捷方法中的系统测试 45
4.2.3 将测试加入遗留系统 46
4.2.4 敏捷方法中测试的弱点 47
4.3 参考文献注解 48
第5章 基于准则的测试设计 49
5.1 定义覆盖准则 49
5.2 不可行性和包含 52
5.3 使用覆盖准则的好处 53
5.4 下一个部分 54
5.5 参考文献注解 54
第二部分 覆盖准则
第6章 输入空间划分 58
6.1 输入域建模 60
6.1.1 基于接口的输入域建模 61
6.1.2 基于功能的输入域建模 61
6.1.3 设计特征 62
6.1.4 选择区块和测试值 63
6.1.5 检查输入域模型 65
6.2 组合策略准则 66
6.3 检查特征之间的约束 71
6.4 扩展实例:从JavaDoc中推导IDM 72
6.4.1 设计基于IDM的测试用例中的任务 72
6.4.2 为迭代器设计基于IDM的测试用例 73
6.5 参考文献注解 78
第7章 图覆盖 82
7.1 概述 82
7.2 图覆盖准则 86
7.2.1 结构化的覆盖准则 87
7.2.2 游历、顺路和绕路 90
7.2.3 数据流准则 97
7.2.4 图覆盖准则间的包含关系 103
7.3 基于源代码的图覆盖 104
7.3.1 基于源代码的结构化图覆盖 104
7.3.2 基于源代码的数据流图覆盖 108
7.4 设计元素的图覆盖 116
7.4.1 设计元素的结构化图覆盖 116
7.4.2 设计元素的数据流图覆盖 118
7.5 设计规范的图覆盖 124
7.5.1 测试顺序约束 125
7.5.2 测试软件的行为状态 127
7.6 用例的图覆盖 134
7.6.1 用例场景 137
7.7 参考文献注解 137
第8章 逻辑覆盖 141
8.1 有效的语义逻辑覆盖准则 141
8.1.1 简单的逻辑覆盖准则 142
8.1.2 有效子句覆盖 144
8.1.3 无效子句覆盖 148
8.1.4 不可行性和包含 148
8.1.5 让子句决定谓词 150
8.1.6 找到满足准则的取值 153
8.2 语法逻辑覆盖准则 157
8.2.1 蕴涵项覆盖 158
8.2.2 极小DNF 159
8.2.3 MUMCUT覆盖准则 160
8.2.4 卡诺图 163
8.3 程序的结构化逻辑覆盖 166
8.3.1 满足谓词覆盖 169
8.3.2 满足子句覆盖 170
8.3.3 满足有效子句覆盖 171
8.3.4 谓词转换问题 174
8.3.5 谓词中的副作用 176
8.4 基于规范的逻辑覆盖 178
8.5 有限状态机的逻辑覆盖 180
8.6 参考文献注解 184
第9章 基于语法的测试 187
9.1 基于语法的覆盖准则 187
9.1.1 基于通用语法的覆盖准则 187
9.1.2 变异测试 189
9.2 基于程序的语法 192
9.2.1 编译器的BNF语法 192
9.2.2 基于程序的变异 193
9.3 集成测试和面向对象测试 206
9.3.1 BNF集成测试 206
9.3.2 集成变异 206
9.4 基于规约的语法 212
9.4.1 BNF语法 212
9.4.2 基于规约的变异 212
9.5 输入空间的语法 215
9.5.1 BNF语法 215
9.5.2 变异输入语法 218
9.6 参考文献注解 222
第三部分 实践中的测试
第10章 管理测试过程 226
10.1 概述 226
10.2 需求分析和规约 227
10.3 系统和软件设计 227
10.4 中间设计 228
10.5 详细设计 228
10.6 实现 229
10.7 集成 229
10.8 系统部署 229
10.9 运行和维护 229
10.10 实现测试过程 230
10.11 参考文献注解 230
第11章 编写测试计划 231
11.1 分层测试计划模板 231
11.2 参考文献注解 233
第12章 测试实现 234
12.1 集成顺序 234
12.2 测试替身 235
12.2.1 桩和模拟:测试替身的变种 236
12.2.2 使用测试替身来代替组件 237
12.3 参考文献注解 240
第13章 软件演化中的回归测试 241
13.1 参考文献注解 243
第14章 编写有效的测试预言 244
14.1 应该检查的内容 244
14.2 决定正确的测试值 245
14.2.1 对输出进行基于规约的直接验证 246
14.2.2 冗余计算 246
14.2.3 一致性检查 247
14.2.4 蜕变测试 247
14.3 参考文献注解 248
测试准则表 250
参考文献 252
索引 269
译者序
前言
部分 软件测试基础
第1章 为什么测试软件 2
1.1 软件何时会出现问题 3
1.2 软件测试的目的 6
1.3 参考文献注解 13
第2章 模型驱动测试设计 15
2.1 软件测试基础 15
2.2 软件测试活动 17
2.3 基于软件活动的测试级别 17
2.4 覆盖准则 19
2.5 模型驱动测试设计 21
2.5.1 测试设计 22
2.5.2 测试自动化 22
2.5.3 测试执行 23
2.5.4 测试评估 23
2.5.5 测试者和抽象 23
2.6 MDTD为什么重要 25
2.7 参考文献注解 25
第3章 测试自动化 27
3.1 软件可测性 27
3.2 测试用例的构成 28
3.3 测试自动化框架 30
3.3.1 JUnit测试框架 31
3.3.2 数据驱动测试 35
3.3.3 在单元测试中添加参数 36
3.3.4 从命令行运行JUnit 38
3.4 超越自动化 38
3.5 参考文献注解 41
第4章 测试优先 42
4.1 驯服改动成本曲线 42
4.1.1 改动成本曲线真的被驯服了吗 43
4.2 测试装具——守护者 44
4.2.1 持续集成 45
4.2.2 敏捷方法中的系统测试 45
4.2.3 将测试加入遗留系统 46
4.2.4 敏捷方法中测试的弱点 47
4.3 参考文献注解 48
第5章 基于准则的测试设计 49
5.1 定义覆盖准则 49
5.2 不可行性和包含 52
5.3 使用覆盖准则的好处 53
5.4 下一个部分 54
5.5 参考文献注解 54
第二部分 覆盖准则
第6章 输入空间划分 58
6.1 输入域建模 60
6.1.1 基于接口的输入域建模 61
6.1.2 基于功能的输入域建模 61
6.1.3 设计特征 62
6.1.4 选择区块和测试值 63
6.1.5 检查输入域模型 65
6.2 组合策略准则 66
6.3 检查特征之间的约束 71
6.4 扩展实例:从JavaDoc中推导IDM 72
6.4.1 设计基于IDM的测试用例中的任务 72
6.4.2 为迭代器设计基于IDM的测试用例 73
6.5 参考文献注解 78
第7章 图覆盖 82
7.1 概述 82
7.2 图覆盖准则 86
7.2.1 结构化的覆盖准则 87
7.2.2 游历、顺路和绕路 90
7.2.3 数据流准则 97
7.2.4 图覆盖准则间的包含关系 103
7.3 基于源代码的图覆盖 104
7.3.1 基于源代码的结构化图覆盖 104
7.3.2 基于源代码的数据流图覆盖 108
7.4 设计元素的图覆盖 116
7.4.1 设计元素的结构化图覆盖 116
7.4.2 设计元素的数据流图覆盖 118
7.5 设计规范的图覆盖 124
7.5.1 测试顺序约束 125
7.5.2 测试软件的行为状态 127
7.6 用例的图覆盖 134
7.6.1 用例场景 137
7.7 参考文献注解 137
第8章 逻辑覆盖 141
8.1 有效的语义逻辑覆盖准则 141
8.1.1 简单的逻辑覆盖准则 142
8.1.2 有效子句覆盖 144
8.1.3 无效子句覆盖 148
8.1.4 不可行性和包含 148
8.1.5 让子句决定谓词 150
8.1.6 找到满足准则的取值 153
8.2 语法逻辑覆盖准则 157
8.2.1 蕴涵项覆盖 158
8.2.2 极小DNF 159
8.2.3 MUMCUT覆盖准则 160
8.2.4 卡诺图 163
8.3 程序的结构化逻辑覆盖 166
8.3.1 满足谓词覆盖 169
8.3.2 满足子句覆盖 170
8.3.3 满足有效子句覆盖 171
8.3.4 谓词转换问题 174
8.3.5 谓词中的副作用 176
8.4 基于规范的逻辑覆盖 178
8.5 有限状态机的逻辑覆盖 180
8.6 参考文献注解 184
第9章 基于语法的测试 187
9.1 基于语法的覆盖准则 187
9.1.1 基于通用语法的覆盖准则 187
9.1.2 变异测试 189
9.2 基于程序的语法 192
9.2.1 编译器的BNF语法 192
9.2.2 基于程序的变异 193
9.3 集成测试和面向对象测试 206
9.3.1 BNF集成测试 206
9.3.2 集成变异 206
9.4 基于规约的语法 212
9.4.1 BNF语法 212
9.4.2 基于规约的变异 212
9.5 输入空间的语法 215
9.5.1 BNF语法 215
9.5.2 变异输入语法 218
9.6 参考文献注解 222
第三部分 实践中的测试
第10章 管理测试过程 226
10.1 概述 226
10.2 需求分析和规约 227
10.3 系统和软件设计 227
10.4 中间设计 228
10.5 详细设计 228
10.6 实现 229
10.7 集成 229
10.8 系统部署 229
10.9 运行和维护 229
10.10 实现测试过程 230
10.11 参考文献注解 230
第11章 编写测试计划 231
11.1 分层测试计划模板 231
11.2 参考文献注解 233
第12章 测试实现 234
12.1 集成顺序 234
12.2 测试替身 235
12.2.1 桩和模拟:测试替身的变种 236
12.2.2 使用测试替身来代替组件 237
12.3 参考文献注解 240
第13章 软件演化中的回归测试 241
13.1 参考文献注解 243
第14章 编写有效的测试预言 244
14.1 应该检查的内容 244
14.2 决定正确的测试值 245
14.2.1 对输出进行基于规约的直接验证 246
14.2.2 冗余计算 246
14.2.3 一致性检查 247
14.2.4 蜕变测试 247
14.3 参考文献注解 248
测试准则表 250
参考文献 252
索引 269
前 言
自本书的第1版发行以来,软件测试领域已经发生了太多变化。高水平的测试现在在工业界已经变得非常普遍。测试自动化已经无处不在,工业界绝大多数领域都默认必须使用测试自动化。敏捷过程和测试驱动开发变得广为人知而且许多人都在使用。更多的学校在本科和研究生阶段开设了软件测试的课程。ACM关于软件工程的课程大纲在很多地方都包括了软件测试,并且把它设置为强烈推荐的课程[Ardis et al.,2015]。
第2版包括了新的特点和内容,同时保留了第1版中深受数百位教师喜欢的结构、理念和在线资源。
第2版的新内容
当拿到一本书的新版本时,任何教师要做的件事就是研究所讲的课程中需要做哪些改动。因为我们已经经历过很多次这样的情况了,所以我们想让读者很容易地明白第2版的改动。
第1版第2版主题
部分 软件测试基础
第1章第1章为什么测试软件(动机)
第2章模型驱动测试设计(抽象)
第3章测试自动化(JUnit)
第4章测试优先(TDD)
第5章基于准则的测试设计(准则)
第二部分 覆盖准则
第2章第7章图覆盖
第3章第8章逻辑覆盖
第4章第9章基于语法的测试
第5章第6章输入空间划分
第三部分 实践中的测试
第6章第10章管理测试过程
第11章编写测试计划
第12章测试实现
第13章软件演化中的回归测试
第14章编写有效的测试预言
第7章N/A技术
第8章N/A工具
第9章N/A挑战
第2版明显、的改动是将第1版中导言性质的第1章扩展成了5个不同的章节。这个重大的扩展使本书变得更加完善。新版的部分是由我们的课程讲义发展而来的。第1版发行之后,我们开始不断地向测试课程中添加更多的基础内容。这些新的想法终组织成了这5个新的章节。新版第1章用到了很多第1版第1章的内容,包括动机和基本概念。第1章结束的时候包括了一段来自2002年的RTI报告,这篇报告讨论的是在开发晚期才进行测试所造成的巨大成本。每个软件测试研究的项目提案都会引用这个重要的调查研究结果。在完成第1版后,我们意识到这本书的关键创新点在于将测试设计成抽象的活动,独立于用来生成测试用例的软件工件(artifact)。这个观点暗示软件设计已经变成一个和以往不同的过程。这样的想法引出了第2章,这一章讲述如何将测试准则和实践相结合。在我们做咨询的过程中,我们已经帮助软件公司包含这一模型以修正其测试过程。
第1版中有个遗憾是没有提及JUnit或其他的测试自动化架构。2016年,JUnit已经在工业界广泛使用,而且通常用在CS1和CS2的课堂上给作业自动打分。第3章改正了这个疏忽。在这一章里,我们叙述了测试自动化的概况,说明了实施测试自动化的难点,也明确地教授了JUnit。虽然本书所讲的内容在很大程度上并不依附于某个具体技术,但在全书的例子和练习中使用统一的测试架构是方便读者理解的。在课堂上,我们通常要求测试必须自动化,也经常要求学生在作业中尝试别的 “*-Unit”单元测试架构,比如HttpUnit。我们认为在拥有自动化的测试用例之前,测试机构还不具备成功应用测试准则的能力。
很自然地,我们在第4章讲到了测试驱动开发(TDD)。虽然TDD和本书的其余部分不太一样,但这对测试教育者和研究人员来说却是一个令人激动的主题。原因是TDD把测试提前且放到了软件开发的中心位置,测试变成了需求。在部分的后,第5章用抽象的方式介绍了测试准则的概念。软心豆粒糖(jelly bean)的例子(尤其是在课堂上讲述这个例子的时候,我们的学生都很喜欢)和其他概念(如包含关系)依然在第2版中保留了下来。
第二部分是本书的核心,但在第2版中改动少。2014年的一天,Jeff问了Paul一个简单的问题:“第二部分四个章节的顺序为什么是现在这样?”答案是惊愕地沉默,因为我们意识到我们从未想过它们应该出现的顺序。事实上,无可争议地处于软件测试中心地位的RIPR模型已经给出了一个逻辑顺序。具体来说,输入空间划分不需要可达性、影响或传播(这些概念在第2章介绍)。图覆盖准则只需要测试执行“经过”待测软件的一些部分,这就是可达性而没有影响和传播。逻辑覆盖准则需要到达而执行谓词,还要以一种特别的方式使用它进而改变它的结果。这就是说,这个谓词被影响了。后,语法覆盖不仅要求到达程序的某个地方,同时“变异”的程序状态必须和原程序不同,而且这个不同之处必须在程序执行之后观察到。这就是说,程序状态的变化要传播出来。第2版依据RIPR模型按顺序列出来这四个概念,而它们所对应章节的要求在递进地增强。从实用的角度来说,我们只是将前一版的第5章(现为第6章)移到了图覆盖章节(现为第7章)之前。
结构上的另一个主要改动是第2版没有再包含第1版中的第7章到第9章。第1版中的这三章已经过时,相比本书的其他部分,这三章用到的频率较少,所以我们决定在重写这部分之前先发表现有的章节。我们计划在第3版中更好地描述这三章。
我们还做出了数百处更加细微的改动。近的研究发现,测试能够成功不仅需要一个错误值传播到输出结果,而且要求自动化测试预言检查合适的输出结果。这就是说,测试预言必须揭示软件失败。因此,新的RIPR模型取代了旧的RIP模型。本书在一
第2版包括了新的特点和内容,同时保留了第1版中深受数百位教师喜欢的结构、理念和在线资源。
第2版的新内容
当拿到一本书的新版本时,任何教师要做的件事就是研究所讲的课程中需要做哪些改动。因为我们已经经历过很多次这样的情况了,所以我们想让读者很容易地明白第2版的改动。
第1版第2版主题
部分 软件测试基础
第1章第1章为什么测试软件(动机)
第2章模型驱动测试设计(抽象)
第3章测试自动化(JUnit)
第4章测试优先(TDD)
第5章基于准则的测试设计(准则)
第二部分 覆盖准则
第2章第7章图覆盖
第3章第8章逻辑覆盖
第4章第9章基于语法的测试
第5章第6章输入空间划分
第三部分 实践中的测试
第6章第10章管理测试过程
第11章编写测试计划
第12章测试实现
第13章软件演化中的回归测试
第14章编写有效的测试预言
第7章N/A技术
第8章N/A工具
第9章N/A挑战
第2版明显、的改动是将第1版中导言性质的第1章扩展成了5个不同的章节。这个重大的扩展使本书变得更加完善。新版的部分是由我们的课程讲义发展而来的。第1版发行之后,我们开始不断地向测试课程中添加更多的基础内容。这些新的想法终组织成了这5个新的章节。新版第1章用到了很多第1版第1章的内容,包括动机和基本概念。第1章结束的时候包括了一段来自2002年的RTI报告,这篇报告讨论的是在开发晚期才进行测试所造成的巨大成本。每个软件测试研究的项目提案都会引用这个重要的调查研究结果。在完成第1版后,我们意识到这本书的关键创新点在于将测试设计成抽象的活动,独立于用来生成测试用例的软件工件(artifact)。这个观点暗示软件设计已经变成一个和以往不同的过程。这样的想法引出了第2章,这一章讲述如何将测试准则和实践相结合。在我们做咨询的过程中,我们已经帮助软件公司包含这一模型以修正其测试过程。
第1版中有个遗憾是没有提及JUnit或其他的测试自动化架构。2016年,JUnit已经在工业界广泛使用,而且通常用在CS1和CS2的课堂上给作业自动打分。第3章改正了这个疏忽。在这一章里,我们叙述了测试自动化的概况,说明了实施测试自动化的难点,也明确地教授了JUnit。虽然本书所讲的内容在很大程度上并不依附于某个具体技术,但在全书的例子和练习中使用统一的测试架构是方便读者理解的。在课堂上,我们通常要求测试必须自动化,也经常要求学生在作业中尝试别的 “*-Unit”单元测试架构,比如HttpUnit。我们认为在拥有自动化的测试用例之前,测试机构还不具备成功应用测试准则的能力。
很自然地,我们在第4章讲到了测试驱动开发(TDD)。虽然TDD和本书的其余部分不太一样,但这对测试教育者和研究人员来说却是一个令人激动的主题。原因是TDD把测试提前且放到了软件开发的中心位置,测试变成了需求。在部分的后,第5章用抽象的方式介绍了测试准则的概念。软心豆粒糖(jelly bean)的例子(尤其是在课堂上讲述这个例子的时候,我们的学生都很喜欢)和其他概念(如包含关系)依然在第2版中保留了下来。
第二部分是本书的核心,但在第2版中改动少。2014年的一天,Jeff问了Paul一个简单的问题:“第二部分四个章节的顺序为什么是现在这样?”答案是惊愕地沉默,因为我们意识到我们从未想过它们应该出现的顺序。事实上,无可争议地处于软件测试中心地位的RIPR模型已经给出了一个逻辑顺序。具体来说,输入空间划分不需要可达性、影响或传播(这些概念在第2章介绍)。图覆盖准则只需要测试执行“经过”待测软件的一些部分,这就是可达性而没有影响和传播。逻辑覆盖准则需要到达而执行谓词,还要以一种特别的方式使用它进而改变它的结果。这就是说,这个谓词被影响了。后,语法覆盖不仅要求到达程序的某个地方,同时“变异”的程序状态必须和原程序不同,而且这个不同之处必须在程序执行之后观察到。这就是说,程序状态的变化要传播出来。第2版依据RIPR模型按顺序列出来这四个概念,而它们所对应章节的要求在递进地增强。从实用的角度来说,我们只是将前一版的第5章(现为第6章)移到了图覆盖章节(现为第7章)之前。
结构上的另一个主要改动是第2版没有再包含第1版中的第7章到第9章。第1版中的这三章已经过时,相比本书的其他部分,这三章用到的频率较少,所以我们决定在重写这部分之前先发表现有的章节。我们计划在第3版中更好地描述这三章。
我们还做出了数百处更加细微的改动。近的研究发现,测试能够成功不仅需要一个错误值传播到输出结果,而且要求自动化测试预言检查合适的输出结果。这就是说,测试预言必须揭示软件失败。因此,新的RIPR模型取代了旧的RIP模型。本书在一
评论
还没有评论。