内容简介
《软件测试与质量保证》*先从工程导入软件测试;其次从软件测试与软件生命周期的关系,循序渐进介绍软件测试的内容;*后从软件质量的角度阐述软件质量保证体系,明确软件测试与软件质量保证的关系,旨在为软件行业培养其需要的软件测试人才。《软件测试与质量保证》配套有完整的课程资源,包括课程标准、教学大纲、教学课件等。
精彩书摘
第1章 导论
当你翻开一本软件测试的书籍时会看到很多定义和术语,或者是当初次接触一个程序或者系统的测试时,你都会对软件测试的概念感到有些似是而非。软件测试究竟是什么?本书力图从工程的角度,追溯软件测试的发展和历史,多维度地思考,探索软件测试的全貌。
1.1 软件工程与软件测试
众所周知,软件测试是软件工程的一个分支,随着互联网和信息技术的快速发展,软件渗透到各行各业的各个领域,软件产品的需求量呈爆发式增长,为了给用户提供满意的软件产品,软件测试的重要性变得尤为突出。在本书开端,我们从工程开始娓娓道来,让读者对软件测试和软件工程的关系有初步的认识。
1.1.1 工程
工程在英文中称为engineering,和科学science有着截然不同的含义。工程是科学和数学的某种应用,通过这一应用,人类可以使自然界的物质和能源通过各种结构、机器、产品、系统和过程,以*短的时间和*少的人力、物力做出高效、可靠且有用的东西。工程是将自然科学的理论应用到具体工农业生产部门中形成的各学科的总称。
在现代社会中,“工程”一词有广义和狭义之分。就狭义而言,工程定义为“以某组设想的目标为依据,应用有关的科学知识和技术手段,通过有组织的一群人将某个(或某些)现有实体(自然的或人造的)转化为具有预期使用价值的人造产品的过程”。广义而言,工程则定义为“由一群人为达到某种目的,在一个较长时间周期内进行协作活动的过程”。
从这些定义中可以看到工程需要人和团队的协作,工程的*终产出物是产品,工程是一个活动的过程,这些要素在后述软件工程中也会涉及。
工程发展到今天有很多分支,常见的有化学工程、建筑工程、机械工程、电子工程等,软件工程也是其中的一个分支。
1.1.2 软件工程
从工程的广义概念引申出来,软件工程就是一群人为了生产软件产品,在一个较长时间周期内进行协作活动的过程。那什么是软件呢?举个例子,Windows和MacOS是操作系统软件,微软的Office是应用软件,腾讯微信是手机软件。很多人把软件这个术语和计算机程序混淆,Ian Sommerville(萨默维尔)在《软件工程》一书中给出了答案,软件是计算机程序和所有使这个程序正确运行所需的文档和配置信息。
很多人都编写过程序,例如业务人员编写电子表格程序来简化工作,科学家编写程序来处理实验数据等。然而绝大多数的软件开发是个专业化的活动,是为了特定的业务目的,作为软件产品进行开发的,如信息系统、嵌入式软件系统等。因此软件工程的目的是支持专业化的软件开发,而不是个体编程。它包括支持程序描述、设计和进化的相关技术。
计算机科学研究的是构成计算机和软件系统基础的有关理论与方法,而软件工程研究软件制作过程中的实际问题。理论上,所有软件工程都应该以计算机理论为坚实的基础,然而实际情况并非如此,软件工程人员常常需要用特定的方法和工具去开发软件。对于实际、复杂的问题,计算机科学的**理论不可能总是适用的,这就需要应用软件工程的方法去解决。
因此,软件工程发展到今天已经成为一门工程学科,它是研究如何用系统化、规范化、数量化等工程原则和方法去进行软件开发与维护的学科。
1.1.3 软件测试
在早期的软件开发中,软件大多结构简单、功能有限,那时的测试几乎等同于调试,调试倾向于解决编译和单个方法的问题。到20世纪50年代左右,随着软件规模越来越大,仅仅依靠调试无法解决软件可能存在的问题,还需要验证接口逻辑、功能模块,以及不同功能模块之间的耦合等,因此在这个阶段,人们往往将开发完成的软件产品进行集中测试,而此时由于还没有形成测试方法论,对软件测试也没有明确定位与深入思考,因此测试方法依旧较为简单,测试完成后还是可能存在大量问题。
之后,人们开始思考软件测试的真正意义,不同的概念和定义被不断提出。1973年,Bill Hetzel(黑泽尔)博士**次对软件测试进行了定义:软件测试是对程序或系统能否完成特定任务建立信心的过程。这个观点在软件质量概念提出后就不适用了。
1975年,John Goodenough(古迪纳夫)和Susan Gerhart(格哈特)在IEEE(Institute of Electrical and Electronics Engineers,电气与电子工程师学会)上发表了文章《测试数据选择的原理》,从此时开始,软件测试正式被确定为一个研究方向[1]。
1979年,G.J.Meyers(迈耶斯)博士等在《软件测试的艺术》一书中认为“软件测试是为了寻找错误而执行程序的过程”[2]。
1983年,IEEE在北卡罗来纳大学*次召开了关于软件测试的技术会议,对软件测试进行了如下定义:软件测试是使用人工或自动手段运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清楚预期结果与实际结果之间的差异。IEEE的概念指明了测试是为了检验软件是否满足需求,它是一个
目录
目录
第1章 导论 1
1.1 软件工程与软件测试 1
1.1.1 工程 1
1.1.2 软件工程 1
1.1.3 软件测试 2
1.1.4 软件生命周期 3
1.2 软件质量与软件测试 6
1.2.1 质量革命 6
1.2.2 软件质量 6
1.2.3 SWEBOK中的软件质量与软件测试 7
1.3 软件缺陷 8
1.3.1 软件缺陷案例 8
1.3.2 软件失败、错误、故障、缺陷 10
1.3.3 软件缺陷的定义 11
1.4 软件测试与软件质量保证 11
1.5 确认与验证 11
1.6 测试用例 12
1.7 软件测试人员与组织 12
1.7.1 关于测试的错误认知 12
1.7.2 优秀软件测试人员应具备的素质 13
1.7.3 软件测试人员的组织 14
1.7.4 软件测试人员的职业发展路径 15
本章小结 16
本章思考题 16
第2章 软件测试分类 17
2.1 基于测试阶段的划分 17
2.1.1 单元测试 17
2.1.2 集成测试 18
2.1.3 系统测试 18
2.1.4 验收测试 18
2.2 基于测试目标或特性的划分 19
2.2.1 功能测试 19
2.2.2 非功能测试 19
2.3 基于测试方法的划分 21
2.3.1 静态测试 21
2.3.2 动态测试 21
2.3.3 白盒测试 21
2.3.4 黑盒测试 22
2.4 基于被测对象的划分 22
2.5 其他类型的测试 23
2.5.1 回归测试 23
2.5.2 冒烟测试 23
2.5.3 国际化测试 24
2.5.4 即兴测试 24
2.5.5 云测试 24
2.5.6 众包测试 24
2.5.7 配置测试 25
2.5.8 探索性测试 26
2.5.9 智能化测试 26
本章小结 27
本章思考题 28
第3章 软件测试的理论及测试有效性 29
3.1 三个著名的测试理论 29
3.1.1 Goodenough和Gerhart理论 29
3.1.2 Weyuker和Ostrand理论 32
3.1.3 Gourlay理论 33
3.2 测试的足够性 34
3.3 测试的局限性 35
本章小结 35
本章思考题 35
第4章 软件测试方法与测试用例设计 37
4.1 白盒测试方法 37
4.1.1 控制流与数据流 37
4.1.2 逻辑覆盖法 39
4.1.3 基本路径测试 42
4.1.4 数据流测试 42
4.2 黑盒测试方法 44
4.2.1 等价类划分法 44
4.2.2 边界值分析法 48
4.2.3 决策表法 49
4.2.4 因果图法 52
4.2.5 功能图法 56
4.2.6 场景法 57
4.2.7 错误推测法 58
4.3 测试用例设计的测试方法选择策略 59
本章小结 59
本章思考题 59
第5章 单元测试 60
5.1 静态单元测试 60
5.1.1 人工静态测试 60
5.1.2 静态分析工具 61
5.2 动态单元测试 63
5.2.1 桩模块 64
5.2.2 驱动模块 64
5.3 单元测试框架XUnit 64
5.3.1 JUnit 64
5.3.2 NUnit 64
5.3.3 CppUnit 65
5.3.4 PHPUnit 65
本章小结 65
本章思考题 65
第6章 集成测试与系统测试 66
6.1 集成测试 66
6.1.1 接口类型和接口错误 66
6.1.2 集成测试粒度 67
6.1.3 集成测试目标 67
6.1.4 集成测试开展 67
6.1.5 集成测试方法 68
6.1.6 集成测试策略 69
6.1.7 集成测试优点 71
6.2 系统测试 72
6.2.1 功能测试 72
6.2.2 健壮性测试 72
6.2.3 性能测试 72
6.2.4 安全性测试 75
6.2.5 兼容性测试 76
6.2.6 可恢复性测试 77
6.2.7 用户界面测试 78
6.2.8 文档测试 81
本章小结 82
本章思考题 82
第7章 软件测试过程与缺陷管理 83
7.1 测试基本过程 83
7.1.1 软件测试需求分析 83
7.1.2 软件测试计划 85
7.1.3 软件测试设计 86
7.1.4 软件测试实现与测试环境搭建 88
7.1.5 软件测试执行 89
7.1.6 软件测试评估 91
7.1.7 软件测试总结和报告 92
7.2 缺陷管理 93
7.2.1 软件缺陷管理流程 93
7.2.2 缺陷报告 99
7.2.3 缺陷确认 104
7.2.4 缺陷解决 104
7.2.5 缺陷测试 105
7.2.6 缺陷关闭 105
本章小结 107
本章思考题 107
第8章 自动化测试与测试自动化 108
8.1 概述 108
8.1.1 自动化测试的概念 108
8.1.2 测试自动化的概念 109
8.1.3 自动化测试的优势 110
8.2 自动化测试的实施及实例 111
8.2.1 实施自动化测试的前提条件 111
8.2.2 自动化测试过程 112
8.2.3 自动化测试实例 117
8.3 自动化测试工具与测试自动化框架 129
8.3.1 自动化测试工具 129
8.3.2
试读
第1章 导论
当你翻开一本软件测试的书籍时会看到很多定义和术语,或者是当初次接触一个程序或者系统的测试时,你都会对软件测试的概念感到有些似是而非。软件测试究竟是什么?本书力图从工程的角度,追溯软件测试的发展和历史,多维度地思考,探索软件测试的全貌。
1.1 软件工程与软件测试
众所周知,软件测试是软件工程的一个分支,随着互联网和信息技术的快速发展,软件渗透到各行各业的各个领域,软件产品的需求量呈爆发式增长,为了给用户提供满意的软件产品,软件测试的重要性变得尤为突出。在本书开端,我们从工程开始娓娓道来,让读者对软件测试和软件工程的关系有初步的认识。
1.1.1 工程
工程在英文中称为engineering,和科学science有着截然不同的含义。工程是科学和数学的某种应用,通过这一应用,人类可以使自然界的物质和能源通过各种结构、机器、产品、系统和过程,以*短的时间和*少的人力、物力做出高效、可靠且有用的东西。工程是将自然科学的理论应用到具体工农业生产部门中形成的各学科的总称。
在现代社会中,“工程”一词有广义和狭义之分。就狭义而言,工程定义为“以某组设想的目标为依据,应用有关的科学知识和技术手段,通过有组织的一群人将某个(或某些)现有实体(自然的或人造的)转化为具有预期使用价值的人造产品的过程”。广义而言,工程则定义为“由一群人为达到某种目的,在一个较长时间周期内进行协作活动的过程”。
从这些定义中可以看到工程需要人和团队的协作,工程的*终产出物是产品,工程是一个活动的过程,这些要素在后述软件工程中也会涉及。
工程发展到今天有很多分支,常见的有化学工程、建筑工程、机械工程、电子工程等,软件工程也是其中的一个分支。
1.1.2 软件工程
从工程的广义概念引申出来,软件工程就是一群人为了生产软件产品,在一个较长时间周期内进行协作活动的过程。那什么是软件呢?举个例子,Windows和MacOS是操作系统软件,微软的Office是应用软件,腾讯微信是手机软件。很多人把软件这个术语和计算机程序混淆,Ian Sommerville(萨默维尔)在《软件工程》一书中给出了答案,软件是计算机程序和所有使这个程序正确运行所需的文档和配置信息。
很多人都编写过程序,例如业务人员编写电子表格程序来简化工作,科学家编写程序来处理实验数据等。然而绝大多数的软件开发是个专业化的活动,是为了特定的业务目的,作为软件产品进行开发的,如信息系统、嵌入式软件系统等。因此软件工程的目的是支持专业化的软件开发,而不是个体编程。它包括支持程序描述、设计和进化的相关技术。
计算机科学研究的是构成计算机和软件系统基础的有关理论与方法,而软件工程研究软件制作过程中的实际问题。理论上,所有软件工程都应该以计算机理论为坚实的基础,然而实际情况并非如此,软件工程人员常常需要用特定的方法和工具去开发软件。对于实际、复杂的问题,计算机科学的**理论不可能总是适用的,这就需要应用软件工程的方法去解决。
因此,软件工程发展到今天已经成为一门工程学科,它是研究如何用系统化、规范化、数量化等工程原则和方法去进行软件开发与维护的学科。
1.1.3 软件测试
在早期的软件开发中,软件大多结构简单、功能有限,那时的测试几乎等同于调试,调试倾向于解决编译和单个方法的问题。到20世纪50年代左右,随着软件规模越来越大,仅仅依靠调试无法解决软件可能存在的问题,还需要验证接口逻辑、功能模块,以及不同功能模块之间的耦合等,因此在这个阶段,人们往往将开发完成的软件产品进行集中测试,而此时由于还没有形成测试方法论,对软件测试也没有明确定位与深入思考,因此测试方法依旧较为简单,测试完成后还是可能存在大量问题。
之后,人们开始思考软件测试的真正意义,不同的概念和定义被不断提出。1973年,Bill Hetzel(黑泽尔)博士**次对软件测试进行了定义:软件测试是对程序或系统能否完成特定任务建立信心的过程。这个观点在软件质量概念提出后就不适用了。
1975年,John Goodenough(古迪纳夫)和Susan Gerhart(格哈特)在IEEE(Institute of Electrical and Electronics Engineers,电气与电子工程师学会)上发表了文章《测试数据选择的原理》,从此时开始,软件测试正式被确定为一个研究方向[1]。
1979年,G.J.Meyers(迈耶斯)博士等在《软件测试的艺术》一书中认为“软件测试是为了寻找错误而执行程序的过程”[2]。
1983年,IEEE在北卡罗来纳大学*次召开了关于软件测试的技术会议,对软件测试进行了如下定义:软件测试是使用人工或自动手段运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清楚预期结果与实际结果之间的差异。IEEE的概念指明了测试是为了检验软件是否满足需求,它是一个



















