ImageVerifierCode 换一换
格式:PPT , 页数:119 ,大小:1.09MB ,
资源ID:967838      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-967838.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第6章系统测试、实施与维护.ppt)为本站会员(天天快乐)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

第6章系统测试、实施与维护.ppt

1、第6章 系统测试、实施与维护,6.1 软件测试 6.2 调试 6.3 系统实施 6.4 系统维护 6.5 实验五 习题,6.1 软 件 测 试,6.1.1 测试的基本概念 软件测试是对软件计划、软件设计、软件编码进行查错和纠错的活动。测试的目的是为了找出软件开发过程中各个阶段的错误,以便分析错误的性质和确定错误的位置,并纠正错误。,软件测试伴随着程序设计的出现而出现,随着软件技术的发展,人们对软件测试的认识也在不断加深。通常人们认为“软件测试是为了证明软件是正确的”。实际上这种认识是错误的。1983年,IEEE提出的软件工程标准术语中软件测试的定义是:“使用人工或自动手段来运行或测定某个系统的

2、过程,其目的在于检验它是否满足规定的需求,或弄清预期结果与实际结果之间的差别”。G.J.Myers则认为“程序测试是为了发现错误而执行程序的过程”。,上面的两种定义有不同的强调方面,关于软件测试的概念,我们要注意以下两点:(1) 软件测试是为了发现程序中的错误而不是证明程序的正确性。按照Myers的观点,“成功的测试是发现了至今尚未发现的错误的测试”。当然测试的目的不仅仅是发现错误,还包含检验、评价等。(2) 软件测试方法不仅仅是执行程序,也包括人工方法。事实上,人工测试在某些测试阶段可以发现大部分的错误。,6.1.2 测试的基本原则要高质量地完成测试工作,找出软件中的错误,应该遵守下面的一些

3、基本原则:(1) 测试队伍与开发队伍应分别建立。开发和测试工作两者在思想和方法上都是不一样的,为了保证测试的质量,应分别建立开发和测试队伍。开发工作是建设性的,而在测试阶段,人们设计出一系列的输入数据(称为测试用例),目的是为了“破坏”已经建造好的软件。就像给硬件产品做高低温试验、震动试验、破坏性试验一样。而且一般程序编写者往往认为自己编写的程序是正确的,要他们找出自己程序中的错误是十分困难的。,(2) 设计测试用例时,要给出测试的预期结果。一个测试用例应由两部分组成: 对程序进行测试的一组输入数据的描述; 由这一组输入数据所产生的程序的预期输出结果的描述。预期输出结果不一定是精确的输出结果,

4、对于一些复杂的计算,人工计算结果可能需要很大的工作量,可以给出一个对输出结果有效范围的描述。,(3) 设计测试用例时,应包括对有效的和期望的输入条件的测试,也应包括对无效的和非期望的输入条件的测试。一个程序不仅当输入合法时能正确运行,而且当有非法输入时,应该能够拒绝这些非法输入,并给出适当的提示信息。(4) 在程序修改之后,要进行回归测试。对程序的任何修改都有可能引入新的错误,所以必须进行回归测试,即将以前的所有测试用例再次输入测试,而不是仅仅测试以前结果不正确的测试用例。回归测试有助于发现由于修改程序而引入的新错误。,(5) 对发现错误较多的程序段,应进行深入的测试。如果发现某个程序段错误较

5、多,则表明这个程序段质量很低,有可能隐藏有更多的错误,应该进行深入的测试。,6.1.3 测试方法软件测试方法有多种,这些测试方法具有不同的思路和出发点。总的来说,测试方法可分为静态测试方法和动态测试方法两大类。所谓静态测试方法,是指不在计算机上运行被测试程序,而是采用其他手段达到对程序进行检测目的的测试方法。静态测试方法包括人工测试方法和计算机辅助静态分析方法。所谓动态测试方法,是指在计算机上运行被测试程序,并用所设计的测试用例对程序进行检测的方法。动态测试方法根据设计测试用例的思想不同可分为白盒测试、黑盒测试以及穷举测试等。,下面分别介绍各种测试方法。1. 人工测试方法人工测试方法是指依靠人

6、而不是计算机来对程序进行检测的方法。人工测试可以找出计算机测试不容易发现的错误,可以减少系统测试的总工作量。根据统计,人工测试能有效地发现30%70%的逻辑设计和编码错误。人工测试可以采用人工运行和代码审查的方式。代码审查可以由程序编写者本人非正式地进行,也可以由审查小组正式进行。代码审查主要是对照常见程序错误清单对程序代码进行分析审查,并将发现的错误记录下来。,表6.1是由Myers提供的常见程序错误清单,该表主要针对FORTRAN一类的程序设计语言所编写的程序,其他的程序设计语言编写的程序也可参照该清单。表中的参数相当于C语言中函数的形式参数,而变元相当于C语言中函数调用时的实际参数。,表

7、6.1 Myers提供的常见程序错误清单,表6.1 Myers提供的常见程序错误清单,表6.1 Myers提供的常见程序错误清单,表6.1 Myers提供的常见程序错误清单,表6.1 Myers提供的常见程序错误清单,2. 计算机辅助静态分析方法计算机辅助静态分析方法是利用计算机测试工具对被测程序的特性进行分析方法的总称。静态分析工具主要有下面几种形式:(1) 静态确认工具:对程序进行静态分析和确认,收集一些程序中的信息,以查找程序中的各种缺陷和可疑的程序构造。例如,使用了一个尚未赋值的变量,或者赋了值的变量一直没有使用等。,(2) 符号执行工具:以符号值作为程序的输入,使程序符号执行,对程序

8、的运算规律加以检验。(3) 程序验证工具:交互式程序验证系统是证明程序正确性的一种工具。它通过系统内部基于符号的逻辑变换和结构归纳,提取程序的语义和结构的要点来分析证明程序的正确性。,3. 黑盒测试黑盒测试又称功能测试,即不管程序内部是如何编制的,只考虑程序输入和输出之间的关系,或只考虑程序的功能。因此,测试者必须根据软件的规格说明书来确定和设计测试用例。黑盒测试也被称为数据驱动测试或基于规格说明书的测试。黑盒测试适合于对内部结构未知的软件进行测试,例如对于外购的软件包,只能根据软件包的功能说明书进行测试。另外,用户对系统的验收测试也使用黑盒测试方法,因为用户关心的是软件能否实现所需的功能。也

9、可以说,黑盒测试是从用户观点进行的测试。,4. 白盒测试白盒测试也称为结构测试,它是根据被测试程序的逻辑结构设计测试用例。使用白盒测试方法需要了解程序的内部结构,对程序的不同逻辑路径进行测试。由于采用不同方法设计测试用例对程序的逻辑路径覆盖的程度不一,因此白盒测试又被称为基于“覆盖”的测试。覆盖率越高,测试越充分。,5. 穷举测试软件测试的主要目的是查找软件中存在的错误,而不能证明软件的正确性。实际上采用一般的测试方法根本无法证明软件的正确性。有人主张通过白盒或黑盒测试方法对所有可能的情况进行测试,如果所有的情况都是正确的,则可证明程序是正确的。这种方法被称为穷举测试,实际上除了一些简单的程序

10、外,它是无法实现的。,使用黑盒测试进行穷举测试,必须穷举所有可能的输入数据。举一个简单的例子,假设输入三个无符号整数作为三角形的三条边长,判断该三角形是否为直角三角形。C语言中无符号整数的范围为0216?1,如果要穷举所有的输入数据,则测试用例数为216*216*2163*1014,假定程序每执行一次需要1 ms,则需要一万年。白盒测试要实现穷举测试同样难以实现,当程序中包含有较复杂的循环和条件语句嵌套时,可能的执行路径数目同样很多,测试用例要覆盖所有的执行路径是根本不可能的。,6.1.4 设计测试用例使用白盒测试和黑盒测试都需要设计测试用例,上一节中已经提到要将所有可能的情况穷举出来是不可能

11、的,因此在设计测试用例时必须依据一定的原则,以保证既能对程序进行充分的测试,而测试用例的数目又不能太大。本节将介绍常用的白盒和黑盒测试用例设计的方法。1. 白盒测试白盒测试根据模块设计阶段对模块内部逻辑结构的描述设计测试用例。根据测试用例对模块所有可能执行路径的覆盖程度,可将其分为语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖和路径覆盖。,1) 语句覆盖语句覆盖要求所设计的用例使程序中的每一条语句至少执行一次,这是覆盖程度很低的一种覆盖标准。下面是一个简单的例子。假设程序的流程图如图6.1所示,对应的C语言源程序片段如下:X=0;if(A1|B2)X=A+B;printf(%d, X

12、);,图6.1 被测试程序的流程图,现在按语句覆盖标准设计测试用例,只需设计一组测试用例使条件“A1 or B2”成立即可,例如:输入数据:A=2,B=0;输出数据:X=2。这组测试用例虽然覆盖了所有的语句,但对条件语句的分支测试不充分,只测试了条件为真的分支。如果条件表达式中的第一个条件表达式A1误写为A=1(C语言中该表达式值为真),则这组测试用例无法检测该错误。同样,如果条件表达式中的第二个条件表达式B2写错,则这组测试用例也不能检测出程序的错误。,2) 判定覆盖判定覆盖要求对程序中所有判定的分支都必须能够执行到。对于上面的例子,可设计两组测试用例。第一组输入数据:A=2,B=0;输出数

13、据:X=2;第二组输入数据:A=1,B=0;输出数据:X=0。这两组测试用例分别使条件语句中的条件表达式取“真”和“假”,很显然也是语句覆盖,但对程序的测试比语句覆盖更充分。判定覆盖也是一种较弱的覆盖,这里的例子对条件表达式中B2的测试很不充分,没有测试该表达式为真的情况。,3) 条件覆盖条件覆盖是指设计的测试用例能使程序中判定的每一个条件的可能取值都满足一次。对于上面的例子,判定中有两个条件,每个条件的可能取值为:条件1:A1 真记为T1假(A1)记为F1条件2:B2真记为T2假(B2)记为F2,可以设计两组测试用例:第一组输入数据:A=2,B=3; 输出数据:X=2;满足T1、T2;第二组

14、输入数据:A=1,B=0; 输出数据:X=0;满足F1、F2。,在大部分情况下,条件覆盖比判定覆盖强,因为它使判定表达式中每个条件都取得了可能的值,而判定覆盖只关心整个判定的取值。读者可以很容易地看出,这里的两组测试用例也满足判定覆盖的要求。但条件覆盖并不一定总是满足判定覆盖的要求,对上面的例子,我们看下面的两组测试用例:第一组输入数据:A=2,B=0; 输出数据:X=2;满足T1、F2;第二组输入数据:A=1,B=3; 输出数据:X=4;满足F1、T2。这两组测试用例虽然满足条件覆盖的要求,但它不满足判定覆盖的要求。,4) 判定/条件覆盖判定/条件覆盖是指设计足够的测试用例,使其既满足条件覆

15、盖的要求,又满足判定覆盖的要求。要求判定中每一个条件所有的取值都能满足一次,而且保证判定的每个分支都能执行到一次。很显然,判定/条件覆盖比前面的几种覆盖标准更强。判定/条件覆盖仍然有一定的不足,表面看起来它测试了所有条件的所有可能取值,但实际上往往有某些条件掩盖了另一些条件。假设判定由两个条件构成,例如“x and y”,如果x取值为“假”,则不管此时y的取值为“真”还是为“假”,整个判定的值均为“假”。,5) 条件组合覆盖条件组合覆盖是指设计足够的测试用例,使得判定中各种条件可能的取值组合都能满足一次。对上面例子中的程序,判定中共有两个条件表达式,每个条件都有两种取值,因此共有四种取值组合,

16、它们是:(1) A1, B2;(2) A1, B2;(3) A1, B2;(4) A1, B2。,图6.2 被测程序的流程图,6) 路径覆盖路径覆盖是指设计足够的测试用例,使其覆盖程序中所有可能的路径。前面在介绍穷举测试时,我们提到对于一些含有复杂条件和循环嵌套的程序,其可能路径的数目很大,路径覆盖是无法实现的。对于一些简单的程序,路径覆盖还是可以实现的,我们看图6.2所示的程序流程示意图。,该流程图中共有两个判定,程序执行的所有可能的路径共有4种:sace、sade、sbce和sbde。对于一些含有循环及条件嵌套的程序,由于其可能的执行路径数目巨大,要实行真正的路径覆盖是不可能的。对于这样一

17、些程序,可以采取一些方法来简化测试用例的设计,例如通常可以将循环简化为进入循环和不进入循环的分支操作,则执行路径的数目将大大减少。,2. 黑盒测试黑盒测试是根据功能说明书进行的测试,测试者只知道程序的输入和输出之间的关系或程序的功能。测试者必须仔细地研究程序的功能说明,找出程序的功能信息或输入和输出之间的关系,然后设计测试用例并推断测试结果的正确性。常用的黑盒测试方法有等价类划分、边界值分析等。1) 等价类划分等价类划分是黑盒测试常用的一种方法。它的基本思想是:将所有可能的输入情况划分为若干个等价类,然后为每一个等价类设计一个测试用例,如果这个测试用例程序的输出结果是正确的,则认为对该类的所有

18、数据该程序都能得到正确的输出结果。,等价类划分方法测试的质量取决于等价类划分是否合理,这往往依赖于测试人员的经验。下面是等价类划分经常采用的一些规则:(1) 如果规定了输入值的范围或值的个数,则取一个有效等价类、两个无效等价类。例如,功能说明书规定“项数为110”,则取一个有效等价类“项数在110之间”,两个无效等价类“项数10”。(2) 如果输入项规定了值的集合,则取一个有效等价类和一个无效等价类。例如规定电话号码“以数字开头”,则取一个有效等价类“以数字开头”,一个无效等价类“以字母或其他字符开头”。,(3) 如果规定了输入数据的一组值,而且程序对不同输入值进行不同处理,则每个允许的输入值

19、分别是一个有效等价类,此外还有一个无效等价类。(4) 如果规定了输入数据的规则,则取符合规则的一个有效等价类和若干不符合规则的无效等价类。(5) 如果规定了输入数据是整形,则可以划分出负整数、零、正整数三个等价类。以上只是一些可供参考的规则,实际工作中应仔细分析程序输入数据的要求,划分出有代表性的有效等价类和无效等价类。,在确定输入数据的等价类时,常常还需要分析输出数据的等价类,以便根据输出数据等价类导出输入数据的等价类。例如,输入三角形的三条边长,判断三角形是普通三角形、等腰三角形还是等边三角形,在设计等价类时显然应根据输出结果进行等价类的划分。在划分有效等价类之后,按照等价类设计测试用例时

20、应该注意:(1) 设计一个测试用例,使其覆盖尽可能多的尚未覆盖的有效等价类。(2) 设计一个测试用例,使其只覆盖一个无效等价类。,之所以如此要求,是因为经验表明,程序员往往更注意有效输入,而忽视对无效输入数据的处理。现在来看一个简单的例子。假设程序要求输入某城市的电话号码,电话号码由三个部分构成。这三个部分的名称与内容分别是:地区码:空白或三位数字;前缀:非“0”或“1”开头的三位数字;后缀:四位数字。,假定被测试的程序接收符合上述规则的所有号码,拒绝所有不符合规则的号码。现在使用等价类划分法来对其进行测试。第一步,划分等价类。划分的等价类以表格形式(表6.2)给出,并给每个等价类一个惟一的编

21、号。,表6.2 电话号码的等价类划分,第二步,确定测试用例。表中有四个有效等价类,可使用下面两个测试用例:测试数据测试范围期望结果( )276-2345等价类(1)(3)(4)有效(635)805-9321等价类(2)(3)(4)有效对于11个无效等价类,应选择11个测试用例。,2) 边界值分析法在等价类划分法中,代表一个等价类的测试数据可以在这个类的允许值范围内任意选择。假设输入数据x的有效范围为1.0,10.0,则设计测试用例时,有效等价类的输入数据可为110之间的任意数据,例如2.0。如果程序员将x=1.0错写为x1.0,则所选定的测试用例将不能检测到这类错误。如果选择有效范围的边界上的

22、测试用例,则对这类错误的测试效果将很好,这就是边界值分析的基本思想。,各种资料和经验也表明,程序员在程序设计过程中往往对输入输出数据有效范围的边界不够重视,在处理边界情况时,程序最容易发生错误。使用边界值分析方法设计测试用例,暴露程序错误的可能性将更大。在对边界值进行分析,进行测试用例设计时,可参考下面的一些规则:(1) 如果输入条件规定了取值范围,则应对该范围的边界内附近、恰好在边界上和边界外附近设计测试用例。例如,规定输入值的有效范围为1.0,10.0,则应对0.9、1.0、1.1、9.9、10.0、10.1设计测试用例。,(2) 如果输入条件规定了数据的个数,则应对最小个数、最大个数、比

23、最小个数少1、比最大个数多1等情况设计测试用例。(3) 对软件规格说明中的每一个输出条件仿照前面对输入条件使用的(1)、(2)原则设计测试用例。边界值分析法通常不作为一种独立的测试方法,而是作为其他测试方法的一种补充。例如,使用等价类划分法设计测试用例后,再使用边界值分析法补充部分测试用例对边界情况进行测试。,6.1.5 测试过程与步骤,图6.3 软件测试的过程,图6.3中的输入有两类,即:(1) 软件,即待测试的软件,包括设计阶段相关的文档和源程序清单等。(2) 测试构造,包括测试计划、测试用例及预期的测试结果。将得到的测试结果与预期结果比较,如果不符,则意味着错误,需要纠正,经过纠错后的软

24、件需要再进行回归测试,如此反复地进行;如果相符,则根据测试过程中错误发生的情况建立可靠性模型,作为系统付诸实施后的维护工作的依据。这一点正如前面所讲的,测试的目的并不是证明软件的正确性,测试通过的软件仍然可能含有错误。,6.1.6 模块测试程序模块是构成信息系统中软件部分的基本单位,模块的测试是信息系统软件测试的第一步。模块测试又叫单元测试,经验表明模块测试发现的错误占错误总数的65%,其重要性显而易见。一个模块具有以下属性:(1) 名字;(2) 应完成的功能;(3) 实现功能所应采用的算法;(4) 内部使用的数据结构;(5) 模块接口。,1. 模块测试的内容模块测试针对模块的各项属性进行检验

25、测试,主要内容有:1) 模块接口测试在测试模块的其他属性之前,首先应对穿过模块接口的数据进行测试。如果数据不能正确地在模块之间传递,其他的动态测试将不能正常进行。在对模块接口进行测试和检验时,应着重参照Myers提供的常见程序错误清单中的“模块接口检查表”和“完成外部输入/输出时的检查表”来逐项检查。,2) 局部数据结构对于一个模块来说,局部数据结构通常是错误的发源地,应该设计相应的测试用例,以便发现下列类型的错误:(1) 不一致或不正确的说明;(2) 错误的初始化或错误的缺省值;(3) 不相容的数据类型;(4) 上溢、下溢和地址异常。除了局部数据结构外,如有可能,在模块测试期间也应检查全局数

26、据对模块的影响。,3) 覆盖条件和路径测试在单元测试期间,必须对重要模块的基本路径进行测试。应设计测试用例,用来发现由于不正确的计算、比较或不适当的控制流而造成的错误。计算中常见的错误有:(1) 算术运算优先次序不正确或误解了运算次序;(2) 运算方式不正确;(3) 初始化不正确;(4) 精度不够;(5) 表达式的符号表示不正确。,程序中的比较运算和控制流向关系密切,通常在比较之后发生控制流的变化。测试用例应发现下述错误:(1) 不同数据类型的数据进行比较;(2) 逻辑运算符不正确或优先次序不正确;(3) 因为精度问题造成期待相等的数据不相等;(4) 循环终止条件不正确;(5) 不正确地修改循

27、环变量。,4) 错误处理良好的程序设计应能预先估计到运算中可能发生的错误和异常,例如误操作或不正确的输入数据,并给出相应的处理措施。在模块测试时,应有意地进行不合理输入,检查程序的错误处理能力。主要注意检查如下几种情况:(1) 输出的出错信息难以理解;(2) 输出的出错信息与实际不符;(3) 错误处理不正确;(4) 在错误处理之前,错误已引起系统干预。操作系统一般都具有一定的错误捕获能力,但是它给出的错误信息一般比较笼统,应用程序应在操作系统捕获错误之前,对错误进行处理。,5) 边界测试对输入输出数据的各种等价类边界,以及分支条件和循环条件的边界,都应测试模块能否正确工作。,2. 模块测试的步

28、骤与方法单元测试常被当作编码的附属步骤,当编码完成后,程序员首先进行初步检查,然后可由专门的测试人员或采用码审查会的形式来进行测试。在确认没有语法错误之后,可针对每个模块单独地进行测试工作。模块的动态测试采取白盒测试的方法,根据模块设计阶段得到的模块的逻辑结构设计测试用例。,由于模块不是完整独立的程序,往往不能独立地运行,在整个系统中既可能被别的模块调用,也可能调用其他的模块。要进行动态测试,必须要模拟这两类关系以建立一个独立的测试环境。在单元测试过程中,需要设计两类辅助测试模块来模拟这两类关系。用以模拟被测模块的上级调用模块称为驱动模块;模拟被测模块运行过程中所调用的模块称为桩模块。,驱动模

29、块的作用是:在单元测试中从外部接受测试数据;把测试数据转发给被测模块,运行被测模块;接受被测模块的测试结果数据;输出结果数据。驱动模块一般包含三种语句:输入语句、仿照其上级模块调用格式的调用语句、输出语句。桩模块用来代替被测模块所调用的模块。一般只需打印接口数据并返回,以便于检测被测模块与其下级模块之间的接口,有时也需要用最简单的方法来模拟它所替代的模块的动作。,驱动模块和桩模块只是为测试而编写的,一般都很简单,测试工作结束后它们就没有用处了。模块测试阶段如果发现程序有错,错误一般发生在编码和模块设计阶段,应对编码和模块设计阶段的工作进行检查,改正错误后重新测试,直至模块能完成规定的功能。,6

30、.1.7 集成测试1. 集成测试的基本方法实践表明,单个模块能正常工作,并不能保证组装后也能正常工作。常见的原因有:(1) 模块间的接口未经过严格测试,可能存在错误;(2) 一个模块可能会破坏另一个模块的功能;(3) 把子功能组合起来不能产生预期的主功能;(4) 单个模块可以接受的误差在组装后累计放大,超出可接受的程度。,鉴于以上的原因,在模块的组装过程中必须进行测试,称为集成测试或组装测试。集成测试的主要目的是发现与接口有关的错误。如果集成测试阶段发现错误,则可能是在总体设计阶段设计软件结构时模块之间接口定义有误。,集成测试主要有非渐增式测试和渐增式测试两种方法。(1) 非渐增式测试的过程是

31、:先对每个模块进行测试,再将所有模块按系统软件结构组装,然后进行测试。一般用黑盒测试法设计测试用例。(2) 渐增式测试的过程是:逐个将未经测试的模块组装到已经测试过的模块上,然后进行集成测试。它不严格区分模块测试和集成测试阶段。每加入一个新模块都进行一次测试,重复此过程直到系统组装完成。 渐增式测试模块组装的顺序可分为自顶向下结合和自底向上结合两种方法。,1) 自顶向下结合自顶向下结合的方法是:按照软件结构图自顶向下进行结合,首先测试顶层模块,然后逐步加入下层模块。可采取先广度后深度逐层安装,或者先深度后广度进行模块结合。自顶向下结合方法不需要编写驱动模块,因为模块被组装进来时,它的上层模块已

32、安装好。图6.4所示的软件结构图采用先广度后深度逐层安装时,模块的安装顺序为ABCDEFG;若采用先深度后广度结合方法,模块的安装顺序则为ABECFDG。,图6.4 软件结构图,2) 自底向上结合自底向上结合的方法是:按照软件结构图自底向上,逐步安装与测试,直到测试结束。图6.4的软件结构测试过程如图6.5所示,分三步组装测试(图中di表示驱动模块)。自底向上的结合方式只需要驱动模块,不需要桩模块。 对于复杂的软件结构,在底层进行模块结合时一般按照子功能进行结合,把接近底层的模块分为若干族,为每一族分别编写驱动程序进行测试。,图6.5 自底向上结合,2. 不同测试方法的比较非渐增式测试方法单元

33、测试阶段使用的辅助模块较多,适合于较小规模的系统。而且如果系统规模很大,则测试中若发现错误,错误的定位将非常困难。渐增式测试逐步组装系统,很容易发现错误发生在哪个模块,适合于大规模的系统。采用自顶向下结合可在程序测试的早期实现并验证系统的主要功能,及早发现上层的接口错误,但对底层关键模块中的错误发现较晚。采用自顶向下结合不能多个测试小组同时工作,测试周期较长。,采用自底向上测试的优缺点与自顶向下相反,可以及早发现底层关键模块中的错误,但到测试的后期才能看到系统的全貌。采用自底向上结合可以多个测试小组同时展开工作,测试不同的子系统。在实际测试工作中可以采取混合的测试策略,自底向上和自顶向下测试同

34、时展开,对系统的上层采用自顶向下的组装方法,而对系统的中、下层模块采用自底向上组装测试的方法。,6.1.8 确认测试确认测试,也称为验收测试。在集成测试之后,软件已组装完成,接口错误也已改正,下一步应该验证软件的有效性,由用户参与测试,检验软件功能是否与用户的要求一致。确认测试通过黑盒测试法来证实软件的功能与用户要求是否一致。测试计划和测试过程的目标是:检查功能、性能要求是否达到,文档资料是否正确完整以及其他要求如可移植性、错误恢复能力和易维护性等是否满足。,对于一些通用的软件,要求所有客户进行验收确认是不可能的。这类软件确认测试一般分为两个阶段,称为Alpha()测试和Beta()测试。Al

35、pha测试在开发者的场所由用户在开发者关注和控制的环境下进行。Beta测试则是在一个或多个客户自己的场所由最终用户进行,开发者不到场。客户记录下测试中遇到的所有问题,试运行一个阶段后把这些问题报告给开发者。,6.1.9 系统测试软件经过确认测试后,最终还要与系统中的其他部分配套运行。系统测试的任务就是测试软件与系统其他部分是否能正常配套工作。系统测试通常有以下几类测试:(1) 恢复测试:通过人工干预使软件出错,检查在故障状态下系统的修复能力。(2) 安全测试:设计测试用例,突破软件安全保护机构的安全保密措施,检验系统是否有安全保密的漏洞。,(3) 强度测试:检验系统负荷能力的最高限度。进行强度

36、测试时,让系统的运行处于资源的异常数量、异常频率、异常批量的条件下。(4) 性能测试:检验安装在系统内的软件的运行性能,一般与强度测试结合进行。对于专为某个特定的组织机构开发的信息系统,一般在集成测试后即进入试运行,让它实际地运行一段时间,对系统的功能和性能进行验收测试。有关试运行阶段的工作将在6.3节中介绍。,6.1.10 测试阶段的主要文档测试阶段的主要文档包括测试计划和测试分析报告。单元测试作为编码阶段的附带步骤,一般没有独立的文档,这里讲的测试主要是指整个程序系统的组装测试和确认测试。1. 测试计划测试计划包括每项测试活动的内容、进度安排、设计考虑、测试数据的整理方法及评价准则。表6.

37、3为测试计划的编写提纲。,表6.3 测试计划的编写提纲,表6.3 测试计划的编写提纲,2. 测试分析报告测试分析报告的编写是为了把组装测试和确认测试的结果、发现及分析写成文件加以记载,具体的内容要求如表6.4所示。,表6.4 测试分析报告编写提纲,表6.4 测试分析报告编写提纲,6.2 调 试,6.2.1 调试方法软件测试的目的是发现程序中是否有错误,错误在什么位置以及错误的原因。发现错误后应进行调试。调试工作包含两个方面:一是查找错误的位置和原因,二是改正错误。查找错误的位置和原因是调试工作的重点,本节着重介绍如何确定错误的位置。测试中发现程序的运行结果与预期结果不符,仅从运行结果往往无法判

38、断,因此在调试程序时一般都会采取一些方法以获得更多的信息。常用的一些调试方法有:,1) 输出存储器内容这种方法一般在调试汇编语言编写的程序时使用。通过输出存储器的内容获取程序运行出现错误的现场,然后进行分析研究,判断出错的原因。这种方法由于输出信息量极大,而且输出的是某一时刻状态,不能动态反映程序的执行情况,往往很难从中查找出错误的原因。2) 打印语句在程序中插入打印语句输出关键变量在程序运行过程中的动态值,可以检验在某个事件后,变量是否按预期的要求发生变化。这种方法需要修改源程序插入打印语句,可用于模块测试或小型程序的调试。,3) 自动调试工具利用调试工具来分析程序的动态行为。目前大部分的开

39、发环境都提供一定的调试功能,也可以选择一些独立的调试工具软件。一般调试工具提供的调试功能主要有:变量值观察与修改、单步跟踪、设置断点等。可以在执行过程中观察变量的动态变化。,6.2.2 调试策略在使用上面介绍的几种常用调试方法调试程序时还需注意调试策略。例如,如何确定在程序中什么位置打印变量的值或设置断点。常见的调试策略如下。1) 试探法分析测试结果,猜想错误发生的大致位置,再用前面介绍的调试方法确定出错位置。这种方法效率一般很低。,2) 回溯法这是一种对小型程序很有效的调试方法。从错误发生征兆的位置开始,人工往回追溯源程序代码,直到征兆消失为止,进而找出错误的原因。,3) 归纳法从一些线索(

40、错误的迹象可能存在于一种或多种测试用例的结果中)着手,分析寻找它们之间的联系,提出对错误原因的假设,然后再证明或否认假设。归纳法的工作过程如图6.6所示。,图6.6 归纳法调试过程,4) 演绎法演绎法与归纳法过程相反,它首先列举出一些可能的原因和假设,然后根据测试结果对列出的错误原因进行排除,分析余下的错误原因,不能确定就留下继续分析,可确定就排除错误。对剩余不可确定的原因,再增加测试数据,重复测试过程,直到故障排除。图6.7是演绎法实施的过程。,图6.7 演绎法调试过程,6.3 系 统 实 施,6.3.1 人员及岗位培训系统实施是系统开发的最后一个阶段,将系统设计阶段的结果在计算机上实现。系

41、统实施阶段的主要任务除了前面章节中已介绍的程序设计与调试外,还包括计算机硬件设备的购置和安装调试、操作人员的培训和系统切换及试运行。,为用户单位培训系统操作、维护、运行管理人员是信息系统开发过程中不可缺少的重要环节。对人员的培训工作应该尽早进行,一方面是因为系统开发的各个阶段都必须有用户参加,尽早培训可以更好地使系统分析人员与用户进行沟通;另一方面,系统集成测试之后将投入试运行和实际运行,用户接受培训后可以更好地配合开发人员进行系统测试。一般对操作人员的培训与编程和调试工作同时进行,培训的主要内容包括:,(1) 系统整体结构,系统概貌;(2) 系统分析设计思想和每一步考虑;(3) 系统输入方式

42、和操作方式的培训;(4) 可能出现的故障以及故障的排除;(5) 系统文档资料的分类以及检索方式;(6) 数据的收集、统计渠道、统计口径等;(7) 运行操作注意事项等。,6.3.2 试运行和系统转换系统实施的最后一个阶段就是新系统的试运行和新老系统的转换。系统试运行阶段的主要工作包括:(1) 系统的初始化,输入原始数据记录;(2) 记录系统的运行数据和运行状况;(3) 核对新系统和老系统(人工或计算机系统)的输出结果;(4) 对实际系统的输入方式进行考查(是否方便、效率如何、安全可靠性、误操作保护等);,(5) 对系统实际运行、响应速度(包括运算速度、传递速度、查询速度、输出速度等)进行实际测试

43、。为特定用户开发的专用信息系统一般在系统组装完成后即进入试运行,试运行阶段的工作包含了对系统进行确认测试和系统测试的任务。,新系统开发完成后最终要代替老系统,完成系统的切换。系统切换有如下三种方式。1) 直接切换在确定新系统运行准确无误时,立刻启用新系统,终止老系统的运行。这种方式节省人员和设备费用,适用于一些处理过程不太复杂、数据不很重要的场合。,2) 并行切换新老系统并行工作一段时间,经过一段时间的考验后,新系统正式替代老系统。对于较复杂的大型系统,这种方法提供了一个与旧系统运行结果进行比较的机会,可以对新旧两个系统的时间要求、出错次数和工作效率给以公正的评价。由于与旧系统并行工作,用户消

44、除了尚未认识新系统之前的惊慌与不安。这种方式的主要特点是安全、可靠,但费用和工作量都很大。,3) 分段切换这种切换方式是上面两种方式的结合。在新系统正式运行前,一部分一部分地替代老系统。切换过程中没有正式运行的那一部分,可以在一个模拟环境中进行考验。这种方式既保证了可靠性,又不至于费用太大。但是这种分段切换对系统的设计和实现都有一定的要求,否则无法实现这种分段切换。,图6.8 系统切换的三种方式,6.4.1 维护的内容信息系统实施之后,由于各种因素的影响,例如系统运行环境的变化或者程序中存在未检测到的错误等,为了保证系统的正常工作,要求系统不断地完善并能适应各种变化,还需要进行系统的维护工作。

45、系统维护的工作内容大致包括:(1) 软件的维护:运行中发现软件测试阶段未发现的错误,或者用户对系统的功能要求发生变化,以及业务量的急剧增长等都有可能需要对软件进行修改。,6.4 系统维护,(2) 数据文件及代码的维护:随着系统的变化,原有的数据文件或代码不能适应新的需要,需要维护数据文件或修改旧的代码系统。(3) 硬件的维护:包括计算机、网络及相关设备的日常管理和维护工作。一旦硬件发生故障,必须有专门的人员进行修理。(4) 机构和人员的变动:机构和人员的变动有时也会对信息系统的流程和对设备及程序的维护工作产生影响。,6.4.2 软件维护的分类软件维护是信息系统维护的主要工作,软件工程学科将软件

46、维护定义为“对现有运行软件进行修改而同时保留其主要功能不变的过程”。通常软件维护工作可分为如下四类。1) 改正性维护软件测试不可能将所有潜在的错误都查找出来,设计再好的测试用例也难免存在遗漏。运行中必然会发现软件错误,需要维护人员进行调试并改正错误。这类维护工作称为改正性维护或纠错性维护。,2) 适应性维护计算机系统硬件及操作系统的更新换代频繁,而一个大型的信息系统软件开发常常需要耗费巨资,因为系统运行环境的改变而废弃不用是很不合算的。因此要求维护人员对原来的软件进行修改,以适应新的软硬件运行环境的要求。这类维护活动称为适应性维护。3) 完善性维护当系统投入使用之后,用户会提出增加新功能,修改

47、已有的功能以及一般的改进和建议。为了满足和部分满足这类要求,所进行的维护活动称为完善性维护。完善性维护占软件维护工作的大部分。,4) 预防性维护为了给未来的改进奠定更好的基础而修改软件的维护活动称为预防性维护。这类维护活动相对较少。完善性维护占据了维护工作量的大部分,是最主要的维护活动。图6.9是1987年由Roger S. Pressman统计的四种维护活动的分布情况。,图6.9 四种维护工作量的分布,维护工作的多少和难易程度取决于软件设计的水平,软件开发应该注意按照软件工程方法的要求进行,以提高软件的可维护性。软件的可维护性由维护人员理解、改正、改动和改进软件的难易程度来衡量。开发过程的每

48、个阶段必须有完备一致的文档资料,在设计软件结构时应注意提高模块之间的独立性。完备一致的文档资料有助于维护阶段阅读理解程序,对软件维护之后相应的文档资料也应该进行修改以保持软件与文档的一致性。模块之间的独立性可以避免维护工作中对某一个模块的修改而影响到系统中的其他模块。,6.4.3 维护的管理系统的各项维护工作都应有专人负责,并且通过一定的审批手续。系统硬件维护的管理相对简单,本节我们主要讨论软件维护的管理,因为软件维护相对影响较大,例如一个业务处理过程的修改,往往会影响其他过程或子系统。软件维护工作应由相对固定的维护组织来承担,一般应少吸收设计人员参加。这样可以促使设计人员在设计时注意提高软件的可维护性,另一方面不会影响设计人员从事新项目的开发工作。,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报