软件工程导论第7章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
试好的那些模块结合起来进行测试,反复进
行直到完成所有模块测试的方法。
使用渐增式测试方法把模块结合到软件系统中 去时,有自顶向下和自底向上两种集成方法。
7.4.1 自顶向下集成
自顶向下集成是一种递增的装配软件结构的 方法,这种方法应用非常广泛。它需要存根程序, 但是不需要驱动程序。
这种方法的思想是:从主控模块(主程 序)开始,沿软件的控制层次向下移动, 逐渐把各个模块结合起来。 在自顶向下结合方法中,如何将所有模 块组装到软件结构中,又有两种方法:
7.2.5 测试阶段的信息流
软件配臵 测试 测试 结果 错误 评价 调试 正确
测试配臵
预期结果
错误率数据
可靠性 可靠性预测 模型
图7.1 测试阶段的信息流
7.3 单元测试
单元测试的一般方法是:
首先通过编译系统检查并改正程序中所有的语 法错误; 然后用详细设计模块说明为指南,对重要的控 制路径进行测试,以便发现模块内部的错误。 通常,单元测试使用白盒测试方法。
Mc
Ma
D2
Mb
D3
是族1、2、3的驱动
程序;
族1 族2 族3 图7.4 自底向上实例
3)对模块进行测试;
Mc
Ma D1 D2 Mb D3
4)用实际模块代替驱
动程序组装成新的模
块族,在新加入的实
际模块上面加上新的
驱动程序进行测试;
族1 族2 族3
图7.4 自底向上实例
Mc
5)重复第二到第 四步,逐渐向上加
BEGIN
IF (A>1) AND (B=0)
THEN X : = X / A;
IF (A=2) OR (X>1) THEN X : = X + 1 END
s a
入口 1
A>1 and B=0 2 F
T
4
5
X=X/A
c
b d
A=2 or X>1
3 F
T
6 7
X=X+1
e
返回
图7.5 被测试模块的流程图
上例中,有两个判定
表达式,每个表达式有 两个条件,为了做到条 件覆盖,应该选取测试 a 数据使得a点出现如下
s
入口 1 A>1 and B=0 F 2 T 4 5 T 6 7 X=X+1 X=X/A
c
结果:
A>1,A≤1,B=0, B≠0
b d
A=2 or X>1 F 3
返回
e
在b点出现如下结果:
根程序);
3)每结合一个模块,
就测试一个;
4)为保证不引入新
的错误,需要进行 回归测试,即重复 以前进行过的部分 或全部测试;
M5 M8 M6 M2
M1 M3 M7 M4
5)重复回到第二步,
直到构成整个软件 结构。
图7.3 自顶向下结合实例
7.4.2 自底向上集成
自底向上集成方法是从软件结构最底 层模块开始进行组装和测试,它与自顶 向下结合方法相反,需要驱动程序,不
3.语句构造
构造的原则:每个语句都应该简单而直接.
4.输入/输出
5.效率
A.程序运行时间
B.存储器效率
C.输入/输出效率
7.2 软件测试基础
7.2.1 软件测试的目标
有关测试的一些规则: (1)测试是为了发现程序中的错误而执行程 序的过程;
(2)好的测试方案是极可能发现迄今为止尚
未发现的错误的测试方案;
过测试来检验是否每个功能都能正常使用,这
种测试称黑盒测试。也称功能测试。
白盒测试:
也称结构测试。
如果知道软件内部工作过程,可以通过测
试来检验软件内部动作是否按照规格说明书
的规定正常进行,这种测试称为白盒测试。
7.2.4 软件测试的步骤
1.模块测试
模块测试又称单元测试,它把每个模块作为
单独的实体来测试。
Ma
D1 D2
Mb
Leabharlann BaiduD3
入实际模块,直至
构造出整个软件结
构。
族1
族2
族3
图7.4 自底向上实例
7.4.3 不同集成测试策略的比较
1. 改进的自顶向下测试方法;
2. 混合法。
M1 M2 M5 M3 M6 M4
7.4.4 回归测试
指重新执行已经做过的部分测试。 回归测试用于保证由于调试或其他原因引起 的程序变化,不会导致额外错误的测试活动。
7.5 确认测试(验收测试) 7.5.1 确认测试的范围
也称为验收测试,目标是验证软件的有效性。 如果软件的功能和性能符合用户的期待,软件 就是有效的。 软件规格说明书是进行确认测试的基础。
确认测试的主要特点及内容有:
1)某些已经测试过的纯粹技术性的测试项可能
不需要再次测试,而对用户特别感兴趣的功 能或性能,可能需要增加一些测试; 2)通常确认测试主要使用实际生产中的数据来 进行测试;
M5 M8 图7.3 自顶向下结合实例 M2 M6 M1 M3 M7 M4
根程序代替所有直接
被主控模块调用的模
块;
2)根据选定的 结合策略(深度优
M1 M2 M5 M8 图7.3 自顶向下结合实例 M6 M3 M7 M4
先或宽度优先),
每次用一个实际模
块代替一个存根程
序(新结合的模块
往往又需要新的存
输入
a1、a2、a3 : Integer 16bits 输入数据的穷 尽测试组合:
输出 程序 main() b
a1 a2 a3
216×216 × 216 = 248 ≈ 3 × 1014
6)为了达到最佳测试效果,应该由独立的第三 方从事测试工作。
7.2.3 测试方法
黑盒测试:
如果已经知道软件应该具有的功能,可以通
需要存根程序。
Mc
自底向上集成方法
的基本过程如下:
1)把底层模块组合
D1
Ma D2
Mb D3
成实现一个特定软件
子功能的族,如图族 1、2、3。
族1 族2 族3
图7.4 自底向上实例
2)为每个模块设计 一个驱动程序,作 为测试的控制程序, 以协调测试用例的 输入和输出。图中 D1、D2、D3分别
D1
1)基础语言
如BASIC、FORTRAN、COBOL、ALGOL等
2)结构化语言
如ALGOL、PL/1、PASCAL、C、ADA等
3)专用语言
如APL、BLISS、FORTH、LISP、PROLOG等
选择一种编程语言的理论标准: 1)有理想的模块化机制; 2)可读性好的控制结构和数据结构; 3)便于调试和提高软件可靠性; 4)编译程序发现程序错误的能力强; 5)有良好的独立编译机制。
通常在每个模块开始处要有一段注释,描
述模块功能、算法、接口特点等;
程序清单布局应利用适当的阶梯形式,使
程序的层次结构清晰明显。
2.数据说明
数据说明的次序应该标准化,如按数据类型
确定说明的次序;
多个变量名在一个语句中说明时,应该按字
母顺序排列这些变量; 如果设计时使用了复杂的数据结构,应该用 注释说明实现该数据结构的方法和特点。
审查小组:
1)组长; 2)程序的设计者; 3)程序的编写者; 4)程序的测试者。
7.3.3 计算机测试
由于软件模块不是一个独立的系统,不能独
立运行,要依靠其他模块调用,或需要调用其
他模块。
因此,必须要为测试的单元开发驱动程序或
存根程序。
1)驱动程序
相当于一个‚主程序‛,用来把测试数据传
送给被测试的模块,并打印有关结果。
3)确认测试必须有用户的积极参与,甚至以用
户为主,可能需要进行一些与用户使用步骤
有关的测试。
确认测试一般使用黑盒测试法。
7.5.2 软件配臵复查
目的:保证软件配臵的所有成分都齐全, 质量符合要求,文档与程序完全一致,而且已 经编好目录。
7.5.3 Alpha和Beta测试
Alpha测试:用户在开发者的场所进行测试,并 且在开发者的指导下进行,测试在受控环境 中进行,开发者记录发现的错误和问题; Beta测试:用户在一个或多个客户场所进行测试, 不受开发者控制,测试者记录发现的问题和
沿着软件结构水平地移 动,把处于同一个层次的 所有模块组装起来。 如图,首先结合M2、 M3、M4和主控模块M1, 然后结合下一个控制层次 M5 M8 图7.3 自顶向下结合实例 M6 M7 M2 M1 M3 M4
中的模块M5、M6和M7,
最后结合模块M8。
自顶向下集成方法 的基本过程如下: 1)对主控模块进 行测试,测试时用存
1)深度优先策略
先组装软件结构的一条主 控制通路上的所有模块,选 择哪条主控制通路,具有较 大的任意性。 M2 M5 M8 图7.3 自顶向下结合实例 M6 M1 M3 M7 M4
如图,如果选取左通路,
就先把模块M1、M2、M5 结合起来测试,然后结合模
块M8、M6,再构造中央和
右侧的控制通路。
2)宽度优先策略
编辑 3.0 TEST STUB
7.4 集成测试
集成测试是组装软件的系统化技术,它将 经过单元测试的模块联系在一起进行测试。 由模块组装成程序时有两种方法: 1)非渐增式测试方法 先分别测试每个模块,再把所有模块按设 计要求放在一起结合成所要的程序。
2)渐增式测试方法
每次增加一个待测试模块,把它同已经测
(3)成功的测试是发现了至今为止尚未发现
的错误的测试。
7.2.2 软件测试准则
1)所有测试都应该能追溯到用户需求; 2)应该远在测试前就制定出测试计划; 3)把Pareto原理应用到软件测试中;
4)应该从‚小规模‛测试开始,并逐步进行‚大
规模‛测试;
5)穷举测试是不可能的;
穷尽测试:包含所有可能情况的测试称为穷尽测试。
7.3.1 测试重点
1)模块接口
应该对穿过模块接口的数据流进行检测,
以保证正确的输入和输出。
2)局部数据结构
这是错误的主要来源,应该设计相应的测
试用例,以便发现数据结构方面的错误。
3)重要的执行路径 由于不可能进行穷尽测试,因此选择测试 路径是非常关键的。 4)出错处理通路 5)边界条件
7.3.2 代码审查
c
b d
A=2 or X>1 3 返回
e
F
图7.5 被测试模块的流程图 对于上例,选取如下测试用例: I. A=3,B=0,X=0 (覆盖sacbd)
II. A=2,B=1,X=1 (覆盖sabed)
3. 条件覆盖
条件覆盖是指:选择足够的测试用例,使得
程序中每个判定表达式的每个条件都取到各种
可能的结果。
选择语言时除了考虑理论上的标准,还必
须同时考虑主要的实用标准:
(1)系统用户要求 (2)可以使用的编译程序 (3)可以得到的软件工具 (4)工程规模
(5)程序员知识
(6)软件可移植性要求 (7)软件的应用领域
7.1.2 写程序的风格
1.程序内部的文档
选取含义鲜明的名字,如果使用缩写,缩
写规则要一致,并给每个名字加注释;
选取测试用例:A = 2 , B = 0 , X = 4 ,程序执行 路径为:sacbed。
2. 判定覆盖
判定覆盖是指:选取足够的测试用例,使 得程序中每个判断的可能结果都至少执行一
次,也就是说使程序的每个判断分支至少通
过一次。
s a
入口 1 T 4 5 T 6 7 X=X+1 X=X/A
A>1 and B=0 2 F
2)存根程序
用来代替被测试模块所调用的模块,相当于
‚虚拟子程序‛。
如,测试B模块,设计了A模块和C模块。 由A负责传送测试数据,由C负责模拟被B调用的 模块。C模块可能没有,这取决于B有没有调用其 他程序。
A、C都是一次性程序,只在测试时临时使用,
应尽量设计得简单一些,以节省费用和时间。
A
B C
驱动模块
软件工程
( Software Engineering )
第7章:实现
编码和测试统称为实现。
编码:把软件设计结果翻译成程序。
测试:检测程序并改正错误的过程。
7.1 编码
7.1.1 选择程序设计语言 计算机程序设计语言基本上可以分为两 大类: 1. 汇编语言; 2. 高级语言。
从应用特点看,高级语言可分为:
被测试模块 存根模块
例:
正文加工 系统
输入 1.0
输出 2.0 添加 3.1
编辑 3.0 删除 3.2
加标题 4.0 插入 3.3
存储 5.0 修改 3.4
检索 6.0 合并 3.5
编目录 7.0 列表 3.6
格式化 8.0
图7.2 正文加工系统(H图)
对‚编辑‛功能的测试:
TEST DRIVER
错误,定期将问题报告发送给开发者。
7.6 白盒测试技术 7.6.1 逻辑覆盖
1. 语句覆盖
语句覆盖是指:设计的测试用例能使程序中 每条语句至少执行一次。
例:一个被测试模块的源程序为(PASCAL语言):
PROCEDURE EXAMPLE (A , B : REAL ; VAR
X : REAL) ;
2.子系统测试
子系统测试是把经过单元测试的模块放在一 起形成一个子系统来测试。
3.系统测试
系统测试是把经过测试的子系统装配成一个完 整的系统来测试。 4.验收测试 验收测试把软件系统作为单一的实体进行测试
(利用用户的实际数据测试)。
5.平行运行
平行运行是同时运行新开发出来的系统和将被
它取代的旧系统,以便比较新旧两个系统的处理 结果。
相关文档
最新文档