软件工程课件 第七章(实现)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mb
在新加入的实际模块
上面加上新的驱动程
序进行测试;
族1 族2 族3
Mc
5)重复第二到第 四步,逐渐向上加
Ma Mb
入实际模块,直至
构造出整个软件结
构。
7.4.4 回归测试
指重新执行已经做过的部分测试。 回归测试用于保证由于调试或其他原因引起的程序 变化,不会导致额外错误的测试活动。
7.5 确认测试(验收测试)
7.6 白盒测试技术
测试方案=目的+用例(数据+预期结果)
目标:确定一组最可能发现某个或某类错误的
测试数据。
7.6 白盒测试技术
7.6.1 逻辑覆盖:是对一系列测试过程的总称,测试过程通过
逐渐综合,以期望进行完整的通路测试
1. 语句覆盖
设计的测试用例能使程序中每条语句至少执行一次。
例:一个被测试模块的源程序为(PASCAL语言):
格式化 8.0
图7.2 正文加工系统(H图)
对“编辑”功能的测试:
TEST DRIVER
编辑 3.0 TEST STUB
7.4 集成测试
集成测试是组装软件的系统化技术,它将经过单元测试的 模块联系在一起进行测试。
1)非渐增式测试方法 先分别测试每个模块,再把所有模块按设计要求 放在一起结合成所要的程序。
2)渐增式测试方法 每次增加一个待测试模块,把它同已经测 试好的那些模块结合起来进行测试,反复进 行直到完成所有模块测试的方法。
使用渐增式测试方法把模块结合到软件系统中 去时,有自顶向下和自底向上两种集成方法。
7.4.1 自顶向下集成
自顶向下集成是一种递增的装配软件结构的 方法,这种方法应用非常广泛。它需要存根程序, 但是不需要驱动程序。
第七章:实现
朱梅霞
著名的软件测试失败案例
1、迪斯尼的狮子王
1994年迪斯尼公司发布了第一个面向儿童的多媒
体儿童游戏LionKing Animated Storybook(狮子王动画故事 书)。尽管已经有许多其他公司在儿童游戏市场上运作多 年,但是这次是迪斯尼公司首次进军这个市场。他们进行 了大力宣传促销。结果,销售额非常可观。该游戏成为孩 子们那个夏季的“必买游戏”。后来却飞来横祸。12月26 日,圣诞节后的一天,迪斯尼公司的客户支持部电话开始 响个不停。很快,电话支持部门就淹没在愤怒的家长和哭 诉玩不成游戏的孩子们的电话狂潮之中。报纸和电视中涌 现了各种故事。 原因:迪斯尼公司没有对市场上投入使用的各种PC机型进 行正确的测试。软件在少数系统中工作正常——例如迪斯 尼的程序员用于开发游戏的系统——但在大众使用的常见 系统中却不行。
M1 M2 M5 M8 图7.3 自顶向下结合实例 M6 M3 M7 M4
来测试,然后结合模块M6,再构
造中央和右侧的控制通路。
2)宽度优先策略
沿着软件结构水平地移动,把
处于同一个层次的所有模块组装
起来。 如图,首先结合M2、M3、
M1 M2 M5 M8 图7.3 自顶向下结合实例 M6 M3 M7 M4
7.2.3 测试方法
黑盒测试:
如果已经知道软件应该具有的功能,可以通过
测试来检验是否每个功能都能正常使用,这种
测试称黑盒测试。也称功能测试。
白盒测试:
如果知道软件内部工作过程(程序流程图&流图),
可以通过测试来检验软件内部动作是否按照
规格说明书的规定正常进行,这种测试也称
结构测试。
7.2.4 软件测试的步骤
不能保证一定能查出在判断的条件中存在的错误。
例如,在该例子中,若第二个分支X>1错写成X<1,利用上述两组测试用例进行测 试,无法查出这一错误。因此,需要更强的逻辑覆盖准则去检验判定的内部条 件。������
千年虫问题Y2K
广泛地讲,“千年虫”还包括以下两个方面的问题: 一个是在一 些计算机系统中,对于闰年的计算和识别出现问题,不能把 2000年识别为闰年,即在该计算机系统的日历中没有2000年2月29日这一 天,而是直接由2000年2月28日过渡到了2000年3月1 日; 另一个是在一些比较老的计算机系统中,在程序中使用了数字串99(或 99/99等)来表示文件结束、永久性过期、删除等一些特殊意义的自动操 作,这样当1999年9月9日(或1999年4 月9日即1999年的第99天)来临时, 计算机系统在处理到内容中有日期的文件时,就会遇到99或99/99等数字 串,从而将文件误认为已经过期或者将文件删除等错误操作,引发系统 混乱甚至崩溃等故障。
断的每种可能结果都至少执行一次
对于上例,选取如下测试用例:
s a
入口 1 T
I. A=3,B=0,X=1 (TF 覆盖sacbd)
II. A=2,B=1,X=1 (FT 覆盖sabed)
A>1 and B=0 2 F
4 5
X=X/A
c
b d
A=2 or X>1 3 返回
T
6 7
X=X+1
e
F
图7.5 被测试模块的流程图
确认测试一般使用黑盒测试法。
7.5.3 Alpha和Beta测试
Alpha测试:用户在开发者的场所进行测试,并且在开 发者的指导下进行,测试在受控环境中进行,开发 者记录发现的错误和问题; Beta测试:用户在一个或多个客户场所进行测试,不受 开发者控制,测试者记录发现的问题和错误,定期 将问题报告发送给开发者。
7.5.1 确认测试的范围
也称为验收测试,目标是验证软件的有效性。 如果软件的功能和性能符合用户的期待,软件就是有 效的。
软件规格说明书是进行确认测试的基础。
确认测试的主要特点及内容有:
1)某些已经测试过的纯粹技术性的测试项可能不需要再次测试, 而对用户特别感兴趣的功能或性能,可能需要增加一些测试; 2)通常确认测试主要使用实际生产中的数据来进行测试; 3)确认测试必须有用户的积极参与,甚至以用户为主,可能需要 进行一些与用户使用步骤有关的测试。
Ma D2
Mb D3
族1
族2
族3
2)为每个模块设计一
个驱动程序,作为测 试的控制程序,以协 调测试用例的输入和 D1
Mc
Ma
D2
Mb
D3
输出。图中D1、D2、
D3分别是族1、2、3的 驱动程序; 族1 族2 族3
Mc
3)对模块进行测试;
4)用 实际模块代替驱动
程序组装成新的模块族,
Da Ma
Db
7.3.1 单元测试重点
1)模块接口
应该对穿过模块接口的数据流进行检测,以保证正确的输入 和输出。
2)局部数据结构
这是错误的主要来源,应该设计相应的测试用例,以便发现 数据结构方面的错误。
3)重要的执行路径 由于不可能进行穷尽测试,因此选择测试路径是 非常关键的。 4)出错处理通路 5)边界条件
(A、C都是一次性程序,只在测试时临时使用,应尽量设计得简
单一些,以节省费用和时间)
A
B C
驱动模块
被测试模块 存根模块
例:
正文加工 系统
输入 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
1.模块测试
模块测试又称单元测试,它把每个模块作为单独的实
体来测试。
2.子系统测试
子系统测试是把经过单元测试的模块放在一起形成一 个子系统来测试。
3.系统测试
系统测试是把经过测试的子系统装配成一个完整的系 统来测试。
4.确认测试
验收测试把软件系统作为单一的实体进行测试(利用 用户的实际数据测试)。
千年虫,大约1974
20世纪70年代某位程序员——假设他叫Dave— —负责本公司的工资系统。他使用的计算机存 储空间很小,迫使他尽量节省每一个字节。 Dave自豪地将自己的程序压缩得比其他人都小。 他使用的其中一个办法是把4位数日期,例如 1973缩减为2位数,例如73。因为工资系统极度 依赖数据处理,Dave得以节省可观的存储空间。 他主要认为只有在到达2000年时程序计算00或 01这样的年份时才会出现问题。他知道这样会 出问题,但是在25年之内程序肯定会更改或升 级,而且眼前的任务比现在计划遥不可及的未 来更加重要。这一天毕竟是要到来的。1995年, Dave的程序仍然在使用,而Dave退休了,谁也 不会想到进入程序检查2000年兼容问题,更不 用说去修改了。 估计世界各地更换或升级类似Dave程序以解 决原有2000年错误的费用以及超过数亿美元了。
这种方法的思想是:从主控模块(主程序)开 始,沿软件的控制层次向下移动,逐渐把各个模 块结合起来。 在自顶向下结合方法中,如何将所有模块组装 到软件结构中,又有两种方法:
1)深度优先策略
先组装软件结构的一条主控制通 路上的所有模块,选择哪条主控 制通路,具有较大的任意性。 如图,如果选取左通路,就先把 模块M1、M2、M5、M8结合起
T 4
5 T6 7
X=X/A
c
F 2
b d
A=2 or X>1
and
X=X+1
e
F
3 返回
图7.5 被测试模块的流程图
选取测试用例:A = 2 , B = 0 , X = 4 ,程序执行路径为:sacbed。 它只关注判定表达式的值,而检查不出表达式中逻辑运算符出现的
错误
2.
判定覆盖
不仅每个语句至少执行一次,而且每个判
图7.2 正文加工系统(H图)
1)驱动程序
相当于一个“主程序”,用来把测试数据传送给被 测试的模块,并打印有关结果。
2)存根程序
用来代替被测试模块所调用的模块,相当于“虚拟
子程序”。
Ex: 测试B模块,设计了A模块和C模块。
由A负责传送测试数据,由C负责模拟被B调用的 模块。C模块可能没有,这取决于B有没有调用其 他程序。
M4和主控模块M1,然后结合下
一个控制层次中的模块M5、M6 和M7,最后结合模块M8。
自顶向下集成方法 的基本过程如下: 1)对 主控模块 进行 测试,测试时用存根
M5 M8 图7.3 自顶向下结合实例 M2 M6 M1 M3 M7 M4
程序代替所有直接被
主控模块调用的模块;
2)根据选定的结
合策略(深度优先或
爱国者导弹防御系统,1991
美国爱国者导弹防御系统是里根总统提出的主动战略防 御(即星球大战)程序的缩略版本。它首次应用在海 湾战争中对抗伊拉克飞毛腿导弹的防御战争中。尽管 关于此系统的赞誉不绝于耳,但是它确实在几次对抗 导弹战役中失利,其中一枚在沙特阿拉伯的多哈击毙 28名美国士兵。
原因:存在一个软件缺陷。一个很 小的系统时钟错误积累起来就可能 拖延14小时,造成跟踪系统失去准 确度。在多哈袭击战中,系统被拖 延100多小时。
宽度优先),每次用
一个实际模块代替一 个存根程序(新结合 的模块往往又需要新 的存根程序); M8 M5 M2 M6
ห้องสมุดไป่ตู้
M1 M3 M7 M4
图7.3 自顶向下结合实例
3) 每 结 合 一 个 模 块 , 就 测试一个; 4) 为 保 证 不 引 入 新 的 错 误,需要进行回归测试, 即重复以前进行过的部分 M5 M8 图7.3 自顶向下结合实例 M6 M7 M2 M1 M3 M4
或全部测试;
5)重复回到第二步,直 到构成整个软件结构。
7.4.2 自底向上集成
自底向上集成方法是从软件结构最底层模块
开始进行组装和测试,它与自顶向下结合方法
相反,需要驱动程序,不需要存根程序。
Mc
自底向上集成方法
的基本过程如下:
1)把底层模块组合成实 现一个特定软件子功能 的族,如图族1、2、3。 D1
7.3.3 计算机测试
由于软件模块不是一个独立的系统,不能独立运行, 要依靠其他模块调用,或需要调用其他模块。 因此,必须要为测试的单元开发驱动程序或存根程序。
正文加工 系统 输入 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
5.平行运行
平行运行是同时运行新开发出来的系统和将被它取代 的旧系统,以便比较新旧两个系统的处理结果。
7.3 单元测试
单元测试的一般方法是:
首先通过编译系统检查并改正程序中所有的语法错误; 然后用详细设计模块说明为指南,对重要的控制路径进行测试,
以便发现模块内部的错误(伪码、Jackson图)。
通常,单元测试使用白盒测试方法。
PROCEDURE EXAMPLE (A , B : REAL ; VAR X : REAL) ;
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
or