5 软件测试工程
据统计表明,软件测试工作量
往往占软件开发总工作量的 40%
以上。对于一些涉及到人身安全
的特殊软件,其软件的测试费用
甚至高于该软件其他费用总和的
3到 5倍。
软
件
工
程
原
理
5.1 软件测试概述
1、进行测试的原因
( 1)问题本身的复杂性及人类自身能
力的局限性;
( 2)软件开发的全过程都是人来完成
的,人在工作中难免有错误。
2、软件测试有两个重要时期
( 1)单元测试阶段
在模块/构件开发过程中,每个模
块/构件的编码完成后所进行的测试。
软
件
工
程
原
理
软
件
工
程
原
理
( 2)综合测试阶段
按照结构化方法或者构件技术等,
系统是由一个个模块/构件组装而成,
在系统构筑过程中,要进行严格的综
合测试,确保整个系统能正常运行。
一、软件测试的定义
1、为了发现错误而 审查文档和 执行
程序的过程。
2、根据软件的规格说明以及程序内
部结构而设计一批测试用例,并利用
软
件
工
程
原
理
这些测试用例去运行程序,以发现
软件错误的过程。
测试用例 ={输入数据 +预期结果 }
注意:
( 1) 软件测试是一个查找错误的过
程, 所以, 软件测试只能证明错误
的存在, 而不能证明程序无错, 不
能保证经过测试的程序一定没有错
误 。
( 2) 软件测试仅仅是一个手段, 其
根本目的是为了纠正软件中的错误,
软
件
工
程
原
理
从而提高软件的质量 。
( 3)测试不可能发现所有错误,
只能在有限的时间和经济条件下,
尽可能地发现错误。
二,软件测试的目的
测试的目的是以最少的人力, 物
力和时间投入, 尽可能多地发现软
件中的各种错误 。
软
件
工
程
原
理
G.Myers 在他的软件测试著作中叙
述了 测试目标,
1、为了发现错误而执行程序的过
程;
2、一个好的测试用例是很可能找
到至今为止尚未发现的错误的用例;
3、一个成功的测试是指发现了至
今为止尚未发现的错误的测试。
软
件
工
程
原
理
三、软件测试的原则
根据软件测试目标,软件的测试原则是:
1、所有的测试都应该追溯到用户需
求。
2、应该尽早制定测试计划。
3、应该由第三方进行测试工作。
4、穷举测试是不可能的。
5、充分注意到错误的群集现象。
6、测试应该从“小规模”到“大规模”。
软
件
工
程
原
理
四、测试流程
测试规格大纲如课本 P107所示。
软件测试流程如下图所示:
软
件
工
程
原
理
1、软件配置
包括:需求规格说明、设计说明
书、源程序等。还应包含测试配置。
例如,测试计划、测试用例、预期
结果等等。
2、测试工具
为软件测试提供的某种服务程序。
例如,静态分析工具程序、动态分
析程序、测试结果分析程序等等。
软
件
工
程
原
理
3、评价
测试结果与期望结果比较,如果有
差异则往往程序有错,需要改正。
4、可靠性预测
有 3种情况可以考虑:
( 1) 若发现严重错误, 则软件的质
量和可靠性一定不高;
( 2) 若测试结果是软件功能基本正
软
件
工
程
原
理
常, 发现的问题不是严重错误,也容
易修改, 则有两种可能:
1)软件质量和可靠性可以接受;
2)所进行的测试还不足以发现严
重错误,错误被潜伏下来。
( 3)测试没有发现任何错误,则极
有可能是测试配置选择不当(测试用
例没有选好),错误被深深地潜伏下
来,这是极危险。
软
件
工
程
原
理
5.2 软件测试方法与技术
一、软件测试对象
应包括需求分析与设计以及编码等
所获得一切的 文档 和 程序 。
二, 软件测试方法
一般可以分成 静态测试 和 动态测试
等 。
1,静态测试
静态测试实际上是确认在给定的外
软
件
工
程
原
理
部环境中软件的逻辑正确性,它应该
包括 需求规格说明 和 程序 等的确认。
静态测试一般不在计算机上实际执行
程序,可以通过 人工分析 或 计算机辅
助分析 以及 程序正确性证明 来确认软
件的正确性。
( 1)人工测试方法。
( 2)计算机辅助静态分析。
( 3)程序正确性证明。
软
件
工
程
原
理
2、动态测试
动态测试也称为机器(计算机)测
试,动态测试主要是通过动态分析以
及程序测试来检查程序的执行状态,
以确认程序的正确性。常用的动态测
试方法有 白盒法 和 黑盒法 。
若了解软件产品的 内部逻辑结构,
针对某些特定条件设计测试用例,对
软件的逻辑路径进行测试,可以用 白
盒法 。
软
件
工
程
原
理
若已经了解软件产品规定的功能,
则测试是为了 证实各个功能 完全可执
行,并在各功能中查找错误,可以用
黑盒法 。
( 1) 穷举测试与选择测试
所谓穷举测试就是试图输入一切可
能的数据让程序都执行一遍,以发现
所有隐藏的错误。不幸的是,穷举测
试是不可能的,穷举测试带来一个必
然的计算问题,那怕是一个很小的程
序,可能的逻辑路径也非常大。
软
件
工
程
原
理
例 1:白盒测试
100行,20次循
环,路径 520条,
1ms,3170年。
开始
开始
软
件
工
程
原
理
P CAB
例 2:黑盒测试,输入数据 232?232=264
可能性,1ms/次,5亿年。
结论,白盒法和黑盒法,穷举测试均
是不现实的,应采用选择测试。
选择测试,就是选择一些有代表性
的典型的测试用例,进行很有限的测
试。
软
件
工
程
原
理
( 2)测试用例的设计
理想的测试是以最少的测试用例,发
现最多的程序错误。也就是说,测试用
例的设计应考虑最可能发现最多错误,
但花费最少时间和最小代价。
三, 白盒测试法
白盒测试法 简称 白盒法,又称 结构测
试,测试者完全了解程序的内部结构和
处理过程,从程序的逻辑结构入手,按
照程序的内部逻辑结构进行测试。
软
件
工
程
原
理
例如:是否按预定的每一条路径执
行,是否执行每一个语句等。
为了选用高产的测试数据, 做尽可
能完备的测试 。 可以参考一些基本的
测试原则, 例如:
( 1) 保证模块中每一个独立的路径至
少执行一次;
( 2) 保证所有判断的每一个分支至少
执行一次;
软
件
工
程
原
理
( 3)保证每一个循环都在边界条件和
一般条件下至少执行一次;
( 4)验证所有内部数据结构的有效性。
主要介绍三种测试技术,即,逻辑
覆盖测试, 循环测试, 基本路径测试 。
1、逻辑覆盖
逻辑覆盖是一组覆盖方法的总称,
它是以程序的内部逻辑结构为基础设
计测试用例。具体可分成,语句覆盖,
软
件
工
程
原
理
判定覆盖, 条件覆盖, 判定 /条件覆盖,
条件组合覆盖 等。
如,给出一个小程序的流程图。 P112
软
件
工
程
原
理
( 1)语句覆盖
语句覆盖是选择足够的测试用例,使
得被测程序的每条语句至少执行一次。
( 2)判定覆盖
判定覆盖又称 分支覆盖,它是选择足
够的测试用例,使得程序中每个判定至
少获得一次真,获得一次假,从而使得
每个判定框的每一个分支至少执行一次。
( 3)条件覆盖
条件覆盖是选择足够的测试用例,使
软
件
工
程
原
理
得程序判定中的每一个条件能获得各种
不同的结果。
( 4)判定 /条件覆盖
判定 /条件覆盖是选用足够的测试用例,
使得判定表达式中每个条件都取得各种
可能的值, 并且每个判定表达式也都取
得各种可能的结果 。
( 5) 条件组合覆盖
条件组合覆盖是选择足够的测试用例,
使得每个判定表达式的条件的各种可能
组合都至少出现一次 。
软
件
工
程
原
理
2、循环测试
结构化程序结构中,存在有三种循环
结构,简单循环、嵌套循环、串接循环。
如图所示:
软
件
工
程
原
理
1)简单循环测试
假设 n是最大循环次数,应进行下列
测试,a)跳过整个循环; b)只执行循
环一次; c)执行循环两次; d)执行循
环 m次,其中,m<n-1; e)执行循环 n-1、
n,n+1次。
2)嵌套循环测试
应执行下列测试:
a)从最内层循环开始测试,把其它
循环都设置为最小值;
软
件
工
程
原
理
b)对最内层循环使用简单测试方法,
外层循环次数设为最小值,并且,为
越界或非法值增加一些额外的测试;
c)由内向外,以此类推。
3)串接循环测试
如果串接的各循环彼此独立,则使
用简单测试方法进行测试。如果第一
个循环的计数器值是后个循环的初始
值,则使用嵌套循环测试方法。
软
件
工
程
原
理
3、基本路径测试
在实际问题中,一个不是很复杂的程
序,其路径都可能是一个庞大的数字,
要覆盖所有的路径是不可能的,因此,
只得把覆盖的路径数压缩到一定的限度
内进行测试。
该测试方法是 Tom McCabe提出的一种
白盒测试法技术。其基本思想是,以软
件过程性描述为基础(如,详细设计的
程序流程图,PAD,PDL等或源代码),
软
件
工
程
原
理
通过分析它的控制流程确定复杂性度,
导出 基本路径 集合,并设计一组测试用
例,确保程序中的每个语句至少执行一
次、每一条路径都通过一次。
( 1) 程序流图
程序流图 ( 控制流图 ) 简称 流图, 它
是把程序流程图中结构化构件改造为一
个有向图的形式, 或理解为 流程图的简
化形式 。
由程序流程图导出的程序流图, 如下
软
件
工
程
原
理
图所示:
软
件
工
程
原
理
( 2)谓词结点是指流图中有条件判断
的结点。
如果判断中有复合条件,则要增加谓
词结点。
a or b
x y
e e
y x
b
a
x
软
件
工
程
原
理
( 3)基本路径测试主要有 4个步骤:
①根据详细设计或源程序代码结果,
导出程序流图。
②计算环路复杂性。
根据 McCabe的定义,环路复杂性是根
据程序流图边数 G和节点数来计算:
V( G) =E-N+2
其中,E是程序流图中的边数,N是流
图中的结点数。
例如,下图的环路复杂性是:
软
件
工
程
原
理
V( G) =17-13+2=6
或者,V( G) =谓词结点数 +1=5+1=6
或者,V( G) =6( 个区域 )
9
1
2
3
4
5
6
78
10
11 12
13
软
件
工
程
原
理
③ 确定线性独立的基本路径集
所谓 独立路径 是指至少引入程序的一
个新处理语句集合或一个新条件的路径。
如果使用程序流图术语描述,独立路径
是至少包含一条在定义该路径之前不曾
用过的边。
④ 设计测试用例
软件测试人员可以根据判断点给出的
条件,选择适当数据作为测试用例,保
证每一条路径可以被测试。
软
件
工
程
原
理
四、黑盒测试法
黑盒测试法简称 黑盒法,它注重测试
软件的功能需求,所以,黑盒测试又称
为 功能测试 。
以程序的外部功能为根据,检查程序
是否完成所规定的功能。另一方面还要
验证它是否做了不该做的事情。
黑盒法测试主要检查以下的错误:
( 1) 功能不正确或者被遗漏;
( 2) 界面错误;
软
件
工
程
原
理
( 3)数据结构或者外部数据库访问错误;
( 4) 性能错误;
( 5)初始化或者终止错误。
1、等价分类法
等价分类法 是把所有可能的输入数据划
分成若干个等价类(子类,子集)。
假定,每个类中的一个 典型的、代表性
的值,在测试中的作用等价于这一类中的
其他值。
软
件
工
程
原
理
( 1)等价类划分。
根据输入条件, 把输入数据划分
为等价类, 并定义 有效等价类 ( 合
法输入类 ), 无效等价类 ( 非法输
入类 ) 等 。
如何划分等价类是一个重要问题,
可以参考以下给出的几条原则:见
课本 P118。
1) 输入在某一范围内, 则定义一
个有效等价类, 两个无效等价类;
软
件
工
程
原
理
2) 输入为一组值, 则定义一个有效
等价类, 一个无效等价类;
3)输入是一个布尔量,则定义一个
有效等价类,一个无效等价业;
4)若规定了输入规则,则可定义一
个有效等价类,若干个无效等价类。
5)若已有等价类中各个元素在程序
中的处理不同,则进一步划分成更小的
等价类。
( 2)选择测试用例。
1)选择一个新的测试用例,使得尽
软
件
工
程
原
理
可能多地覆盖尚未被覆盖的有效等价类,
重复这一步,直到所有有效等价类都被
覆盖为止。
2)设计一个新的测试用例,使得覆
盖一个且只覆盖一个尚未被覆盖的无效
等价类。重复这一步,直到所有无效等
价类都被覆盖为止。
例子,三角形程序测试。用黑盒法选
用的测试用例如,P119 表 5-1所示。
软
件
工
程
原
理
2、边界值分析法
因在边界上选取测试用例,故称为 边
界测试法,边界值分析属于黑盒测试法
的一种,它是等价类划分方法的补充,
这是用的最多的方法之一。
理论上说,等价类划分后,可以在某
一个等价类中选取任意值作为测试用例。
测试实践表明,软件常常在它的边界上
出错,例如,刚好小于、刚好等于、刚
好大于某一个特定值等等。
软
件
工
程
原
理
3,错误猜测法
错误猜测法实际上是一种 猜错, 所谓
猜错也就是凭实践经验和感觉, 猜测被
测试程序哪些地方最容易出错, 并且以
此来设计测试用例 。
错误猜测法的基本思想是,凭经验列
举出程序中全部可能有错误的地方和最
容易发生错误的情况,并且以它们为依
据选择测试用例。
软
件
工
程
原
理
5.3 软件测试策略
软件测试过程可以分成 4个步骤进行,
即 单元测试, 集成测试 (组装测试)、
确认测试, 系统测试 。如下图所示:
软
件
工
程
原
理
软件开发与测试的对应关系,如下图所
示:
软
件
工
程
原
理
一、单元测试
单元测试 又称 模块测试,是对软
件系统的模块或构件进行正确性检
查的测试。通常,可以在每一个构
件或模块完成编程时进行。
单元测试的目的,测试模块的接
口和内部结构,是否完成预定的功
能,以便发现各模块内部可能存在
的错误。
软
件
工
程
原
理
1、单元测试的内容
( 1)模块接口测试。
( 2)局部数据结构测试。
( 3)路径测试。
( 4)边界测试。
( 5)出错处理测试。
2,单元测试的步骤
( 1)代码审查。
( 2) 测试模块 。
由于模块本身往往是不能单独执行,
软
件
工
程
原
理
所以要为被测试的模块设计一些辅助
性的模块,称为 驱动模块 和 桩模块
(存根模块) 。
( 1) 驱动模块 。 驱动模块 ( driver)
是模拟被测试模块的调用模块 。
( 2) 存根模块 。 存根模块又称桩模
块 ( stub), 模拟被测试模块的下属
模块 。
驱动模块与桩模块, 如下页图示:
软
件
工
程
原
理
软
件
工
程
原
理
二、集成测试
集成测试又称 组装测试 或者 联合测试
等。集成测试就是按设计要求,把通过
单元测试的各个模块组装成一个完整的
系统,对该系统进行 综合测试 。
如果存在子系统的话,可以首先组装
成若干个子系统,再由子系统组装成一
个大系统。 集成测试的目标 主要是发现
与模块接口有关的各种错误。
1,系统集成方法
系统集成方式有,非增量式 和 增量式 。
软
件
工
程
原
理
( 1)非增量式系统集成
非增量式又称为 非渐增式 系统集成,
它是将已测试的模块一次性组装成为一
个系统,再进行综合测试,从而获得一
个达到用户要求的软件系统。
( 2) 增量式系统集成
增量式又称为 渐增式 系统集成,它是
将被测试的模块同已经测试好的模块结
合起来进行测试,即一个个模块逐步接
入系统并进行测试,也就是模块是一边
接入系统一边测试,使得系统逐步扩大,
最后获得一个完整的系统。
软
件
工
程
原
理
2、接口测试
单元测试后,不能证明模块是没有错
误。这主要由于模块测试完成后,组合
在一起成为一个完整的系统时,必然产
生, 接口相连, 问题,数据可能在通过
接口时会丢失;一个模块可能对另一个
模块产生无法预料的影响或者副作用;
当几个模块联合在一起的时候,可能达
不到预期的功能;把每一个模块的误差
累积起来的时候可能会扩大,甚至达到
无
软
件
工
程
原
理
法忍受的程度;全局数据结构可能
也会带来一些影响等等。
接口测试的目的 是检查由于接口
错误或者接口进行无效假设造成的
系统缺陷。
接口的类型及接口错误见课本
P125。
接口测试的一般准则:课本 P125
软
件
工
程
原
理
3、集成测试的文档
测试计划及详细的测试过程描述。
4、回归测试
回归测试是对已经进行过测试的模块
重新测试,以确保新添加的模块不会对
系统产生无法预料的副作用。
三, 确认测试
确认测试又称为 有效性测试, 它的测
试依据是需求规格说明, 检查软件完成
软
件
工
程
原
理
的功能和性能是否符合需求规格说明
的指标要求。
1,确认测试的标准
通常, 确认测试是在一个模拟环境
下用黑盒法实现, 软件确认也就是要
证明软件的功能和性能与软件需求一
致性 。
测试计划 列出了要进行测试的种类;
详细的测试过程定义了为发现与需求
不一致的错误而使用的测试实例 。
软
件
工
程
原
理
2、软件配置审查
目的,检查所有文档资料的完整性、
准确性,文档与程序的一致性。文档应
包括技术文档(分析与设计文档等)和
用户文档(使用说明和操作手册等)。
3,α 和 β 测试
α 测试是由一个用户在开发场地进行,
并且在开发者的指导下对软件进行测试,
开发者负责记录错误和使用中的问题。
β 测试是由软件最终用户们在一个或
软
件
工
程
原
理
多个用户场地进行,通常,开发者不
在现场。由用户记录测试中遇到的问
题,并定期把问题报告给开发者,开
发者再对软件进行修改,反复进行,
直至最终软件产品形成。
四、系统测试
软件要与其他的系统(例如硬件、
各种外设、某些工具软件或支持软件、
来自于其他系统的信息等)集成,然
后进行一系列的 集成测试 和 确认测试 。
软
件
工
程
原
理
这些测试可能已超出软件工程的研究范
围,而且,也不仅仅由软件人员来完成。
1、恢复测试
恢复测试主要检验软件的容错能力。
2、安全测试
安全测试是检验计算机系统对非法入
侵、攻击的防范能力。
3、压力测试
又称强度测试,是检验计算机系统在
软
件
工
程
原
理
超负荷情形下的承受力和对异常情况的
抵抗能力。
4、性能测试
性能测试就是用于测试软件在集成系
统中的运行性能。
五、面向对象的测试
其测试的基本目标与传统开发方法中
的测试一样。
在面向对象系统中,可分成 4个测试
层次:
软
件
工
程
原
理
1、与对象关联的单个操作的测试。
2、单个对象类测试。
3、对象群集测试。
4、面向对象系统测试。
软
件
工
程
原
理
5.4 调试与排错
调试又称为 纠错、排错 。
一、调试的目的
测试的目的 是尽可能多地找出软件中
的错误。
调试的目的 就是找出产生错误的原因
和产生错误的准确位置,并进行改正、
排除错误。
注意,
( 1) 在出现错误的地方很可能还有别
的错误;
软
件
工
程
原
理
( 2)不要只修改错误的征兆和表现,要
找到产生错误的真正原因,修改错误的
本质;
( 3)当心修改一个错误时可能引入新的
错误;
( 4)不要试图直接修改目标代码来修改
错误,应当修改源程序。因为,当程序
重新编译或汇编时,错误又会再重现。
二、调试的方法与技术
1、强行排错法
软
件
工
程
原
理
( 1)输出内存储器的信息
( 2)在程序中插入打印语句
( 3)自动调试工具
2、回溯法
回溯法就是从发现错误的地方开始,
逐步向后回溯查找,反向跟踪,直到找
出错误的根源为止。
3、归纳法
归纳法是一种从特殊推断一般的方法,
由错误征兆、线索,推出错误的根源。
4、演绎法
软
件
工
程
原
理
演绎法是一种从一般原理或前提出
发,经过排除和细化的过程,推导出
结论的方法。
5、对分查找法
把程序从某一个关键点划分成两部
分(程序段),在该关键点输入变量
的正确值,如果输出正确,错误在上
半部分,否则在下半部分。如此多次
的划分查找,直到找出错误为止。
软
件
工
程
原
理
5.5 软件测试工具
一、静态分析工具
静态分析不需要执行所测试的程序,
它仅扫描所测试程序的正文,对程序的
数据流和控制流进行分析,然后输出测
试报告。
二、动态测试工具
动态测试就是通过选择适当的测试用
例, 实际运行所测的程序, 比较实际运
行结果和预期结果, 以找出错误 。
据统计表明,软件测试工作量
往往占软件开发总工作量的 40%
以上。对于一些涉及到人身安全
的特殊软件,其软件的测试费用
甚至高于该软件其他费用总和的
3到 5倍。
软
件
工
程
原
理
5.1 软件测试概述
1、进行测试的原因
( 1)问题本身的复杂性及人类自身能
力的局限性;
( 2)软件开发的全过程都是人来完成
的,人在工作中难免有错误。
2、软件测试有两个重要时期
( 1)单元测试阶段
在模块/构件开发过程中,每个模
块/构件的编码完成后所进行的测试。
软
件
工
程
原
理
软
件
工
程
原
理
( 2)综合测试阶段
按照结构化方法或者构件技术等,
系统是由一个个模块/构件组装而成,
在系统构筑过程中,要进行严格的综
合测试,确保整个系统能正常运行。
一、软件测试的定义
1、为了发现错误而 审查文档和 执行
程序的过程。
2、根据软件的规格说明以及程序内
部结构而设计一批测试用例,并利用
软
件
工
程
原
理
这些测试用例去运行程序,以发现
软件错误的过程。
测试用例 ={输入数据 +预期结果 }
注意:
( 1) 软件测试是一个查找错误的过
程, 所以, 软件测试只能证明错误
的存在, 而不能证明程序无错, 不
能保证经过测试的程序一定没有错
误 。
( 2) 软件测试仅仅是一个手段, 其
根本目的是为了纠正软件中的错误,
软
件
工
程
原
理
从而提高软件的质量 。
( 3)测试不可能发现所有错误,
只能在有限的时间和经济条件下,
尽可能地发现错误。
二,软件测试的目的
测试的目的是以最少的人力, 物
力和时间投入, 尽可能多地发现软
件中的各种错误 。
软
件
工
程
原
理
G.Myers 在他的软件测试著作中叙
述了 测试目标,
1、为了发现错误而执行程序的过
程;
2、一个好的测试用例是很可能找
到至今为止尚未发现的错误的用例;
3、一个成功的测试是指发现了至
今为止尚未发现的错误的测试。
软
件
工
程
原
理
三、软件测试的原则
根据软件测试目标,软件的测试原则是:
1、所有的测试都应该追溯到用户需
求。
2、应该尽早制定测试计划。
3、应该由第三方进行测试工作。
4、穷举测试是不可能的。
5、充分注意到错误的群集现象。
6、测试应该从“小规模”到“大规模”。
软
件
工
程
原
理
四、测试流程
测试规格大纲如课本 P107所示。
软件测试流程如下图所示:
软
件
工
程
原
理
1、软件配置
包括:需求规格说明、设计说明
书、源程序等。还应包含测试配置。
例如,测试计划、测试用例、预期
结果等等。
2、测试工具
为软件测试提供的某种服务程序。
例如,静态分析工具程序、动态分
析程序、测试结果分析程序等等。
软
件
工
程
原
理
3、评价
测试结果与期望结果比较,如果有
差异则往往程序有错,需要改正。
4、可靠性预测
有 3种情况可以考虑:
( 1) 若发现严重错误, 则软件的质
量和可靠性一定不高;
( 2) 若测试结果是软件功能基本正
软
件
工
程
原
理
常, 发现的问题不是严重错误,也容
易修改, 则有两种可能:
1)软件质量和可靠性可以接受;
2)所进行的测试还不足以发现严
重错误,错误被潜伏下来。
( 3)测试没有发现任何错误,则极
有可能是测试配置选择不当(测试用
例没有选好),错误被深深地潜伏下
来,这是极危险。
软
件
工
程
原
理
5.2 软件测试方法与技术
一、软件测试对象
应包括需求分析与设计以及编码等
所获得一切的 文档 和 程序 。
二, 软件测试方法
一般可以分成 静态测试 和 动态测试
等 。
1,静态测试
静态测试实际上是确认在给定的外
软
件
工
程
原
理
部环境中软件的逻辑正确性,它应该
包括 需求规格说明 和 程序 等的确认。
静态测试一般不在计算机上实际执行
程序,可以通过 人工分析 或 计算机辅
助分析 以及 程序正确性证明 来确认软
件的正确性。
( 1)人工测试方法。
( 2)计算机辅助静态分析。
( 3)程序正确性证明。
软
件
工
程
原
理
2、动态测试
动态测试也称为机器(计算机)测
试,动态测试主要是通过动态分析以
及程序测试来检查程序的执行状态,
以确认程序的正确性。常用的动态测
试方法有 白盒法 和 黑盒法 。
若了解软件产品的 内部逻辑结构,
针对某些特定条件设计测试用例,对
软件的逻辑路径进行测试,可以用 白
盒法 。
软
件
工
程
原
理
若已经了解软件产品规定的功能,
则测试是为了 证实各个功能 完全可执
行,并在各功能中查找错误,可以用
黑盒法 。
( 1) 穷举测试与选择测试
所谓穷举测试就是试图输入一切可
能的数据让程序都执行一遍,以发现
所有隐藏的错误。不幸的是,穷举测
试是不可能的,穷举测试带来一个必
然的计算问题,那怕是一个很小的程
序,可能的逻辑路径也非常大。
软
件
工
程
原
理
例 1:白盒测试
100行,20次循
环,路径 520条,
1ms,3170年。
开始
开始
软
件
工
程
原
理
P CAB
例 2:黑盒测试,输入数据 232?232=264
可能性,1ms/次,5亿年。
结论,白盒法和黑盒法,穷举测试均
是不现实的,应采用选择测试。
选择测试,就是选择一些有代表性
的典型的测试用例,进行很有限的测
试。
软
件
工
程
原
理
( 2)测试用例的设计
理想的测试是以最少的测试用例,发
现最多的程序错误。也就是说,测试用
例的设计应考虑最可能发现最多错误,
但花费最少时间和最小代价。
三, 白盒测试法
白盒测试法 简称 白盒法,又称 结构测
试,测试者完全了解程序的内部结构和
处理过程,从程序的逻辑结构入手,按
照程序的内部逻辑结构进行测试。
软
件
工
程
原
理
例如:是否按预定的每一条路径执
行,是否执行每一个语句等。
为了选用高产的测试数据, 做尽可
能完备的测试 。 可以参考一些基本的
测试原则, 例如:
( 1) 保证模块中每一个独立的路径至
少执行一次;
( 2) 保证所有判断的每一个分支至少
执行一次;
软
件
工
程
原
理
( 3)保证每一个循环都在边界条件和
一般条件下至少执行一次;
( 4)验证所有内部数据结构的有效性。
主要介绍三种测试技术,即,逻辑
覆盖测试, 循环测试, 基本路径测试 。
1、逻辑覆盖
逻辑覆盖是一组覆盖方法的总称,
它是以程序的内部逻辑结构为基础设
计测试用例。具体可分成,语句覆盖,
软
件
工
程
原
理
判定覆盖, 条件覆盖, 判定 /条件覆盖,
条件组合覆盖 等。
如,给出一个小程序的流程图。 P112
软
件
工
程
原
理
( 1)语句覆盖
语句覆盖是选择足够的测试用例,使
得被测程序的每条语句至少执行一次。
( 2)判定覆盖
判定覆盖又称 分支覆盖,它是选择足
够的测试用例,使得程序中每个判定至
少获得一次真,获得一次假,从而使得
每个判定框的每一个分支至少执行一次。
( 3)条件覆盖
条件覆盖是选择足够的测试用例,使
软
件
工
程
原
理
得程序判定中的每一个条件能获得各种
不同的结果。
( 4)判定 /条件覆盖
判定 /条件覆盖是选用足够的测试用例,
使得判定表达式中每个条件都取得各种
可能的值, 并且每个判定表达式也都取
得各种可能的结果 。
( 5) 条件组合覆盖
条件组合覆盖是选择足够的测试用例,
使得每个判定表达式的条件的各种可能
组合都至少出现一次 。
软
件
工
程
原
理
2、循环测试
结构化程序结构中,存在有三种循环
结构,简单循环、嵌套循环、串接循环。
如图所示:
软
件
工
程
原
理
1)简单循环测试
假设 n是最大循环次数,应进行下列
测试,a)跳过整个循环; b)只执行循
环一次; c)执行循环两次; d)执行循
环 m次,其中,m<n-1; e)执行循环 n-1、
n,n+1次。
2)嵌套循环测试
应执行下列测试:
a)从最内层循环开始测试,把其它
循环都设置为最小值;
软
件
工
程
原
理
b)对最内层循环使用简单测试方法,
外层循环次数设为最小值,并且,为
越界或非法值增加一些额外的测试;
c)由内向外,以此类推。
3)串接循环测试
如果串接的各循环彼此独立,则使
用简单测试方法进行测试。如果第一
个循环的计数器值是后个循环的初始
值,则使用嵌套循环测试方法。
软
件
工
程
原
理
3、基本路径测试
在实际问题中,一个不是很复杂的程
序,其路径都可能是一个庞大的数字,
要覆盖所有的路径是不可能的,因此,
只得把覆盖的路径数压缩到一定的限度
内进行测试。
该测试方法是 Tom McCabe提出的一种
白盒测试法技术。其基本思想是,以软
件过程性描述为基础(如,详细设计的
程序流程图,PAD,PDL等或源代码),
软
件
工
程
原
理
通过分析它的控制流程确定复杂性度,
导出 基本路径 集合,并设计一组测试用
例,确保程序中的每个语句至少执行一
次、每一条路径都通过一次。
( 1) 程序流图
程序流图 ( 控制流图 ) 简称 流图, 它
是把程序流程图中结构化构件改造为一
个有向图的形式, 或理解为 流程图的简
化形式 。
由程序流程图导出的程序流图, 如下
软
件
工
程
原
理
图所示:
软
件
工
程
原
理
( 2)谓词结点是指流图中有条件判断
的结点。
如果判断中有复合条件,则要增加谓
词结点。
a or b
x y
e e
y x
b
a
x
软
件
工
程
原
理
( 3)基本路径测试主要有 4个步骤:
①根据详细设计或源程序代码结果,
导出程序流图。
②计算环路复杂性。
根据 McCabe的定义,环路复杂性是根
据程序流图边数 G和节点数来计算:
V( G) =E-N+2
其中,E是程序流图中的边数,N是流
图中的结点数。
例如,下图的环路复杂性是:
软
件
工
程
原
理
V( G) =17-13+2=6
或者,V( G) =谓词结点数 +1=5+1=6
或者,V( G) =6( 个区域 )
9
1
2
3
4
5
6
78
10
11 12
13
软
件
工
程
原
理
③ 确定线性独立的基本路径集
所谓 独立路径 是指至少引入程序的一
个新处理语句集合或一个新条件的路径。
如果使用程序流图术语描述,独立路径
是至少包含一条在定义该路径之前不曾
用过的边。
④ 设计测试用例
软件测试人员可以根据判断点给出的
条件,选择适当数据作为测试用例,保
证每一条路径可以被测试。
软
件
工
程
原
理
四、黑盒测试法
黑盒测试法简称 黑盒法,它注重测试
软件的功能需求,所以,黑盒测试又称
为 功能测试 。
以程序的外部功能为根据,检查程序
是否完成所规定的功能。另一方面还要
验证它是否做了不该做的事情。
黑盒法测试主要检查以下的错误:
( 1) 功能不正确或者被遗漏;
( 2) 界面错误;
软
件
工
程
原
理
( 3)数据结构或者外部数据库访问错误;
( 4) 性能错误;
( 5)初始化或者终止错误。
1、等价分类法
等价分类法 是把所有可能的输入数据划
分成若干个等价类(子类,子集)。
假定,每个类中的一个 典型的、代表性
的值,在测试中的作用等价于这一类中的
其他值。
软
件
工
程
原
理
( 1)等价类划分。
根据输入条件, 把输入数据划分
为等价类, 并定义 有效等价类 ( 合
法输入类 ), 无效等价类 ( 非法输
入类 ) 等 。
如何划分等价类是一个重要问题,
可以参考以下给出的几条原则:见
课本 P118。
1) 输入在某一范围内, 则定义一
个有效等价类, 两个无效等价类;
软
件
工
程
原
理
2) 输入为一组值, 则定义一个有效
等价类, 一个无效等价类;
3)输入是一个布尔量,则定义一个
有效等价类,一个无效等价业;
4)若规定了输入规则,则可定义一
个有效等价类,若干个无效等价类。
5)若已有等价类中各个元素在程序
中的处理不同,则进一步划分成更小的
等价类。
( 2)选择测试用例。
1)选择一个新的测试用例,使得尽
软
件
工
程
原
理
可能多地覆盖尚未被覆盖的有效等价类,
重复这一步,直到所有有效等价类都被
覆盖为止。
2)设计一个新的测试用例,使得覆
盖一个且只覆盖一个尚未被覆盖的无效
等价类。重复这一步,直到所有无效等
价类都被覆盖为止。
例子,三角形程序测试。用黑盒法选
用的测试用例如,P119 表 5-1所示。
软
件
工
程
原
理
2、边界值分析法
因在边界上选取测试用例,故称为 边
界测试法,边界值分析属于黑盒测试法
的一种,它是等价类划分方法的补充,
这是用的最多的方法之一。
理论上说,等价类划分后,可以在某
一个等价类中选取任意值作为测试用例。
测试实践表明,软件常常在它的边界上
出错,例如,刚好小于、刚好等于、刚
好大于某一个特定值等等。
软
件
工
程
原
理
3,错误猜测法
错误猜测法实际上是一种 猜错, 所谓
猜错也就是凭实践经验和感觉, 猜测被
测试程序哪些地方最容易出错, 并且以
此来设计测试用例 。
错误猜测法的基本思想是,凭经验列
举出程序中全部可能有错误的地方和最
容易发生错误的情况,并且以它们为依
据选择测试用例。
软
件
工
程
原
理
5.3 软件测试策略
软件测试过程可以分成 4个步骤进行,
即 单元测试, 集成测试 (组装测试)、
确认测试, 系统测试 。如下图所示:
软
件
工
程
原
理
软件开发与测试的对应关系,如下图所
示:
软
件
工
程
原
理
一、单元测试
单元测试 又称 模块测试,是对软
件系统的模块或构件进行正确性检
查的测试。通常,可以在每一个构
件或模块完成编程时进行。
单元测试的目的,测试模块的接
口和内部结构,是否完成预定的功
能,以便发现各模块内部可能存在
的错误。
软
件
工
程
原
理
1、单元测试的内容
( 1)模块接口测试。
( 2)局部数据结构测试。
( 3)路径测试。
( 4)边界测试。
( 5)出错处理测试。
2,单元测试的步骤
( 1)代码审查。
( 2) 测试模块 。
由于模块本身往往是不能单独执行,
软
件
工
程
原
理
所以要为被测试的模块设计一些辅助
性的模块,称为 驱动模块 和 桩模块
(存根模块) 。
( 1) 驱动模块 。 驱动模块 ( driver)
是模拟被测试模块的调用模块 。
( 2) 存根模块 。 存根模块又称桩模
块 ( stub), 模拟被测试模块的下属
模块 。
驱动模块与桩模块, 如下页图示:
软
件
工
程
原
理
软
件
工
程
原
理
二、集成测试
集成测试又称 组装测试 或者 联合测试
等。集成测试就是按设计要求,把通过
单元测试的各个模块组装成一个完整的
系统,对该系统进行 综合测试 。
如果存在子系统的话,可以首先组装
成若干个子系统,再由子系统组装成一
个大系统。 集成测试的目标 主要是发现
与模块接口有关的各种错误。
1,系统集成方法
系统集成方式有,非增量式 和 增量式 。
软
件
工
程
原
理
( 1)非增量式系统集成
非增量式又称为 非渐增式 系统集成,
它是将已测试的模块一次性组装成为一
个系统,再进行综合测试,从而获得一
个达到用户要求的软件系统。
( 2) 增量式系统集成
增量式又称为 渐增式 系统集成,它是
将被测试的模块同已经测试好的模块结
合起来进行测试,即一个个模块逐步接
入系统并进行测试,也就是模块是一边
接入系统一边测试,使得系统逐步扩大,
最后获得一个完整的系统。
软
件
工
程
原
理
2、接口测试
单元测试后,不能证明模块是没有错
误。这主要由于模块测试完成后,组合
在一起成为一个完整的系统时,必然产
生, 接口相连, 问题,数据可能在通过
接口时会丢失;一个模块可能对另一个
模块产生无法预料的影响或者副作用;
当几个模块联合在一起的时候,可能达
不到预期的功能;把每一个模块的误差
累积起来的时候可能会扩大,甚至达到
无
软
件
工
程
原
理
法忍受的程度;全局数据结构可能
也会带来一些影响等等。
接口测试的目的 是检查由于接口
错误或者接口进行无效假设造成的
系统缺陷。
接口的类型及接口错误见课本
P125。
接口测试的一般准则:课本 P125
软
件
工
程
原
理
3、集成测试的文档
测试计划及详细的测试过程描述。
4、回归测试
回归测试是对已经进行过测试的模块
重新测试,以确保新添加的模块不会对
系统产生无法预料的副作用。
三, 确认测试
确认测试又称为 有效性测试, 它的测
试依据是需求规格说明, 检查软件完成
软
件
工
程
原
理
的功能和性能是否符合需求规格说明
的指标要求。
1,确认测试的标准
通常, 确认测试是在一个模拟环境
下用黑盒法实现, 软件确认也就是要
证明软件的功能和性能与软件需求一
致性 。
测试计划 列出了要进行测试的种类;
详细的测试过程定义了为发现与需求
不一致的错误而使用的测试实例 。
软
件
工
程
原
理
2、软件配置审查
目的,检查所有文档资料的完整性、
准确性,文档与程序的一致性。文档应
包括技术文档(分析与设计文档等)和
用户文档(使用说明和操作手册等)。
3,α 和 β 测试
α 测试是由一个用户在开发场地进行,
并且在开发者的指导下对软件进行测试,
开发者负责记录错误和使用中的问题。
β 测试是由软件最终用户们在一个或
软
件
工
程
原
理
多个用户场地进行,通常,开发者不
在现场。由用户记录测试中遇到的问
题,并定期把问题报告给开发者,开
发者再对软件进行修改,反复进行,
直至最终软件产品形成。
四、系统测试
软件要与其他的系统(例如硬件、
各种外设、某些工具软件或支持软件、
来自于其他系统的信息等)集成,然
后进行一系列的 集成测试 和 确认测试 。
软
件
工
程
原
理
这些测试可能已超出软件工程的研究范
围,而且,也不仅仅由软件人员来完成。
1、恢复测试
恢复测试主要检验软件的容错能力。
2、安全测试
安全测试是检验计算机系统对非法入
侵、攻击的防范能力。
3、压力测试
又称强度测试,是检验计算机系统在
软
件
工
程
原
理
超负荷情形下的承受力和对异常情况的
抵抗能力。
4、性能测试
性能测试就是用于测试软件在集成系
统中的运行性能。
五、面向对象的测试
其测试的基本目标与传统开发方法中
的测试一样。
在面向对象系统中,可分成 4个测试
层次:
软
件
工
程
原
理
1、与对象关联的单个操作的测试。
2、单个对象类测试。
3、对象群集测试。
4、面向对象系统测试。
软
件
工
程
原
理
5.4 调试与排错
调试又称为 纠错、排错 。
一、调试的目的
测试的目的 是尽可能多地找出软件中
的错误。
调试的目的 就是找出产生错误的原因
和产生错误的准确位置,并进行改正、
排除错误。
注意,
( 1) 在出现错误的地方很可能还有别
的错误;
软
件
工
程
原
理
( 2)不要只修改错误的征兆和表现,要
找到产生错误的真正原因,修改错误的
本质;
( 3)当心修改一个错误时可能引入新的
错误;
( 4)不要试图直接修改目标代码来修改
错误,应当修改源程序。因为,当程序
重新编译或汇编时,错误又会再重现。
二、调试的方法与技术
1、强行排错法
软
件
工
程
原
理
( 1)输出内存储器的信息
( 2)在程序中插入打印语句
( 3)自动调试工具
2、回溯法
回溯法就是从发现错误的地方开始,
逐步向后回溯查找,反向跟踪,直到找
出错误的根源为止。
3、归纳法
归纳法是一种从特殊推断一般的方法,
由错误征兆、线索,推出错误的根源。
4、演绎法
软
件
工
程
原
理
演绎法是一种从一般原理或前提出
发,经过排除和细化的过程,推导出
结论的方法。
5、对分查找法
把程序从某一个关键点划分成两部
分(程序段),在该关键点输入变量
的正确值,如果输出正确,错误在上
半部分,否则在下半部分。如此多次
的划分查找,直到找出错误为止。
软
件
工
程
原
理
5.5 软件测试工具
一、静态分析工具
静态分析不需要执行所测试的程序,
它仅扫描所测试程序的正文,对程序的
数据流和控制流进行分析,然后输出测
试报告。
二、动态测试工具
动态测试就是通过选择适当的测试用
例, 实际运行所测的程序, 比较实际运
行结果和预期结果, 以找出错误 。