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 软件测试工具
一、静态分析工具
静态分析不需要执行所测试的程序,
它仅扫描所测试程序的正文,对程序的
数据流和控制流进行分析,然后输出测
试报告。
二、动态测试工具
动态测试就是通过选择适当的测试用
例, 实际运行所测的程序, 比较实际运
行结果和预期结果, 以找出错误 。