软件工程复习自用---第七章

实现

软件工程复习自用---第七章_第1张图片

考题重点

软件工程复习自用---第七章_第2张图片

软件工程复习自用---第七章_第3张图片

编码

软件测试基础

测试目的就是发现程序中的错误

测试的正确定义是“为了发现程序中的错误而执行程序的过程

好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案

成功的测试是发现了至今为止尚未发现的错误的测试

黑盒测试(又称功能测试)把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。黑盒测试是在程序接口进行的测试,只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息(例如数据库或文件)的完整性

白盒测试(又称结构测试)是把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作

大型软件系统通常由若干个子系统组成,每个子系统又由许多模块组成,因此,大型软件系统的测试过程基本上由模块测试、子系统测试、系统测试、验收测试和平行运行等五个步骤组成

模块测试

        在设计得好的软件系统中,每个模块完成一个清晰定义的子功能,而且这个子功能和同级其他模块的功能之间没有相互依赖关系。因此,有可能把每个模块作为一个单独的实体来测试,而且通常比较容易设计检验模块正确性的测试方案。 模块测试的目的是保证每个模块作为一个单元能正确运行,所以模块测试通常又称为单元测试。在这个测试步骤中所发现的往往是编码和详细设计的错误

子系统测试    

        子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试。模块相互间的协调和通信是这个测试过程中的主要问题,因此,这个步骤着重测试模块的接口。

系统测试    

        系统测试是把经过测试的子系统装配成一个完整的系统来测试。在这个过程中不仅应该发现设计和编码的错误,还应该验证系统确实能提供需求说明书中指定的功能,而且系统的动态特性也符合预定要求。在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明中的错误

子系统测试和系统测试,都兼有检测和组装两重含义,通常称为集成测试

验收测试  

        验收测试把软件系统作为单一的实体进行测试,测试内容与系统测试基本类似,但是它是在用户积极参与下进行的,而且可能主要使用实际数据(系统将来要处理的信息)进行测试。  验收测试的目的是验证系统确实能够满足用户的需要,在这个测试步骤中发现的往往是系统需求说明书中的错误。验收测试也称为确认测试

平行运行    

        所谓平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。这样做的具体目的有如下几点

(1)可以在准生产环境中运行新系统而又不冒风险

(2)用户能有一段熟悉新系统的时间

(3)可以验证用户指南和使用手册之类的文档

(4)能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标

单元测试

单元测试集中检测软件设计的最小单元——模块

单元测试和编码属于软件过程的同一个阶段

在源程序代码通过编译程序的语法检查后,可以用详细设计描述作指南,对重要的执行通路进行测试,以便发现模块内部的错误

可以应用人工测试和计算机测试这样两种不同类型的测试方法,完成单元测试工作

单元测试主要使用白盒测试技术,而且对多个模块的测试可以并行地进行

模块测试的五个方面:模块接口、局部数据结构、重要的执行通路、出错处理通路、边界条件

集成测试

集成测试是测试和组装软件的系统化技术

由模块组装成程序时有两种方法。

一种方法是先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,这种方法称为非渐增式测试方法;

另一种方法是把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。这种每次增加一个模块的方法称为渐增式测试,这种方法实际上同时完成单元测试和集成测试

目前在进行集成测试时普遍采用渐增式测试方法,当使用渐增方式把模块结合到程序中去时,有自顶向下和自底向上两种集成策略

自顶向下集成

自顶向下集成方法是从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。在把附属于(及最终附属于)主控制模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先的策略

深度优先的结合方法先组装在软件结构的一条主控制通路上的所有模块。选择一条主控制通路取决于应用的特点,并且有很大任意性

宽度优先的结合方法是沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来

软件工程复习自用---第七章_第4张图片

自底向上集成

自底向上测试从“原子”模块(即在软件结构最低层的模块)开始组装和测试。因为是从底部向上结合模块,总能得到所需的下层模块处理功能,所以不需要存根程序

用下述步骤可以实现自底向上的结合策略

① 把低层模块组合成实现某个特定的软件子功能的族

② 写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出

③ 对由模块组成的子功能族进行测试

④ 去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族

上述第②~④步实质上构成了一个循环

软件工程复习自用---第七章_第5张图片

自顶向下测试方法的主要优点是不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误。

自顶向下测试方法的主要缺点是需要存根程序,可能遇到与此相联系的测试困难,低层关键模块中的错误发现较晚,而且用这种方法在早期不能充分展开人力。

自底向上测试方法的优缺点与上述自顶向下测试方法的优缺点刚好相反 

回归测试

在集成测试的范畴中,回归测试是指重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来非预期的副作用

回归测试就是用于保证由于调试或其他原因引起的变化,不会导致非预期的软件行为或额外错误的测试活动

回归测试可以通过人工地进行,也可以使用自动化的捕获回放工具自动进行。利用捕获回放工具,软件工程师能够捕获测试用例和实际运行结果,然后可以回放(即重新执行测试用例),并且比较软件变化前后所得到的运行结果

确认测试

确认测试也称为验收测试,它的目标是验证软件的有效性

通常,验证指的是保证软件正确地实现了某个特定要求的一系列活动;确认指的是为了保证软件确实满足了用户需求而进行的一系列活动

软件有效性的一个简单定义是:如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的。 需求分析阶段产生的软件需求规格说明书,准确地描述了用户对软件的合理期望,因此是软件有效性的标准,也是进行确认测试的基础

确认测试的范围

确认测试必须有用户积极参与,或以用户为主进行。用户应该参与设计测试方案,使用用户界面输入测试数据并且分析评价测试的输出结果。

确认测试通常使用黑盒测试法。应该仔细设计测试计划和测试过程,测试计划包括要进行的测试的种类及进度安排,测试过程规定了用来检测软件是否与需求一致的测试方案

通过测试和调试要保证软件能满足所有功能要求,能达到每个性能要求,文档资料是准确而完整的,此外,还应该保证软件能满足其他预定的要求(例如安全性、可移植性、兼容性和可维护性等)

确认测试有下述两种可能的结果: (1) 功能和性能与用户要求一致,软件是可以接受的 (2) 功能和性能与用户要求有差距

软件配置复查

软件配置复查是确认测试的一个重要内容。复查的目的是保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,具有完成软件维护所必须的细节,而且已经编好目录

Alpha和Beta测试

如果一个软件是为许多客户开发的(例如,向大众公开出售的盒装软件产品),那么绝大多数软件开发商都使用被称为Alpha测试和Beta测试的过程,来发现那些看起来只有最终用户才能发现的错误。 Alpha测试由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试。开发者负责记录发现的错误和使用中遇到的问题。 Alpha测试是在受控的环境中进行的。 Beta测试由软件的最终用户们在一个或多个客户场所进行。与Alpha测试不同,开发者通常不在Beta测试的现场。 Beta测试是软件在开发者不能控制的环境中的“真实”应用

白盒测试技术

通常把测试数据和预期的输出结果称为测试用例

逻辑覆盖

逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试

覆盖由强到低依次是路径覆盖、条件组合覆盖、判定/条件覆盖、条件覆盖、判定覆盖、语句覆盖

语句覆盖

语句覆盖的含义是,选择足够多的测试数据,使被测程序中每个语句至少执行一次

语句覆盖是很弱的逻辑覆盖标准,因为他只需保证每个判断条件为真即可

下图所示,其实只需一组数据使ab为真即可

软件工程复习自用---第七章_第6张图片

判定覆盖

判定覆盖又叫分支覆盖,它的含义是,不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次

拿上图举例:存在两个判定语句,包含四个条件,每个判定可能的结果都要执行一次,可以是真假,假真或者真真,假假

需要两组测试数据,比如sacbd(真假),sabed(假真)

判定覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高

条件覆盖

条件覆盖的含义是,不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果

条件覆盖通常比判定覆盖强,但满足条件覆盖的测试数据不一定满足判定覆盖

软件工程复习自用---第七章_第7张图片

拿上图举例:两个判定语句,包含四个条件,这四个条件要取到真假各一次

a:A > 1        A <= 1        B = 0        B != 0

b:A = 2        A != 2        X > 1        X <= 1

测试数据要满足4个条件真真假假都取到

比如 A > 1,B = 0,A = 2,X > 1各取真 两个判定语句也为真 sacbed

特殊情况: 对于第二个条件 只有一方取真即为真,那么我设计两组测试数据,对于b的两个条件,一个为真假,一个为假真,满足条件覆盖,但是在关系运算符or的作用下,会导致判定语句b只取到真,取不到假的情况,因此不满足判定覆盖

判定/条件覆盖

判定/条件覆盖是一种能同时满足判定覆盖和条件覆盖的逻辑覆盖,它的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果

对于上图来说,满足条件覆盖的测试数据有可能与判定/条件覆盖的测试数据一致,因此可以推出有时判定/条件覆盖也并不比条件覆盖更强

条件组合覆盖

条件组合覆盖是更强的逻辑覆盖标准,它要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次

软件工程复习自用---第七章_第8张图片

下面的4组测试数据使上面列出的8种条件组合每种至少出现一次:    

① A=2,B=0,X=4(针对(1)和(5),执行路径sacbed)    真真

② A=2,B=1,X=1(针对(2)和(6),执行路径sabed)    假假

③ A=1,B=0,X=2(针对(3)和(7),执行路径sabed)    假真

④ A=1,B=1,X=1(针对(4)和(8),执行路径sabd)    假假

显然,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。因此,条件组合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到,例如,上述4组测试数据都没有测试到路径sacbd 

点覆盖

图论中点覆盖的定义如下:如果连通图G的子图G′是连通的,而且包含G的所有结点,则称G′是G的点覆盖

在正常情况下流图是连通的有向图。满足点覆盖标准要求选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次,由于流图的每个结点与一条或多条语句相对应,显然,点覆盖标准和语句覆盖标准是相同的

边覆盖

图论中边覆盖的定义是:如果连通图G的子图G″是连通的,而且包含G的所有边,则称G″是G的边覆盖

为了满足边覆盖的测试标准,要求选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常边覆盖和判定覆盖是一致的

路径覆盖

路径覆盖的含义是,选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)

控制结构测试

基本路径测试是Tom McCabe提出的一种白盒测试技术。使用基本路径测试设计测试用例时,首先计算程序的环形复杂度,并用该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值

使用基本路径测试技术设计测试用例的步骤如下

根据过程设计结果画出相应的流图(相关介绍在第六章计算复杂度)

软件工程复习自用---第七章_第9张图片

计算流图的环形复杂度

1.上图中共有5个判定节点 5(2,3,5,6,10) + 1 = 6

2.边数17 - 结点数13 + 2 = 6

确定线性独立路径的基本集合

独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,即独立路径至少包含一条在定义该路径之前不曾用过的边

程序的环形复杂度决定了程序中独立路径的数量,而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界

上述程序的环形复杂度为6,因此共有6条独立路径 

路径1: 1-2-10-11-13        路径2: 1-2-10-12-13     路径3: 1-2-3-10-11-13      

路径4: 1-2-3-4-5-8-9-2-…     路径5: 1-2-3-4-5-6-8-9-2-…     路径6: 1-2-3-4-5-6-7-8-9-2-…

设计可强制执行基本集合中每条路径的测试用例 

黑盒测试技术

黑盒测试着重测试软件功能。黑盒测试并不能取代白盒测试,它是与白盒测试互补的测试方法,它很可能发现白盒测试不易发现的其他类型的错误

黑盒测试力图发现下述类型的错误: (1) 功能不正确或遗漏了功能; (2) 界面错误; (3) 数据结构错误或外部数据库访问错误; (4) 性能错误; (5) 初始化和终止错误

白盒测试在测试过程的早期阶段进行,而黑盒测试主要用于测试过程的后期

黑盒测试主要包括等价划分、边界值分析、错误推测、因果图

等价划分

等价划分把程序的输入域划分成若干个数据类,据此导出测试用例

        等价划分法力图设计出能发现若干类程序错误的测试用例,从而减少必须设计的测试用例的数目。 如果把所有可能的输入数据(有效的和无效的)划分成若干个等价类,则可以合理地做出下述假定:每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。因此,可以从每个等价类中只取一组数据作为测试数据。这样选取的测试数据最有代表性,最可能发现程序中的错误

        使用等价划分法设计测试方案首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效等价类和无效等价类

有效等价类对测试的意义:用来测试功能是否正确实现

无效等价类对测试的意义:用来测试程序是否有强大的异常处理能力(健壮性)

启发式规则

(1) 如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值)

(2) 如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类 

(3) 如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值)

(4) 如果规定了输入数据必须遵循的规则,则可以划分出一个有效等价类(符合规则)和若干个无效等价类(从各种不同角度违反规则)

(5) 如果规定了输入数据为整型,则可以划分出正整数、零和负整数3个有效类

(6) 如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表

根据等价类设计测试方案时主要使用下面两个步骤

(1) 设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止

(2) 设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止

也就是一个测试用例针对一种无效等价类,一个测试用例尽可能地覆盖较多的有效等价类

注意,通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个无效的等价类

举例分析

假设有一个把数字串转变成整数的函数。运行程序的计算机字长16位,用二进制补码表示整数。这个函数是用Pascal语言编写的,它的说明如下:function strtoint (dstr:shortstr):integer; 函数的参数类型是shortstr,它的说明是: type shortstr=array[1..6] of char; 被处理的数字串是右对齐的,也就是说,如果数字串比6个字符短,则在它的左边补空格。如果数字串是负的,则负号和最高位数字紧相邻(负号在最高位数字左边一位)。     考虑到Pascal编译程序固有的检错功能,测试时不需要使用长度不等于6的数组做实在参数,更不需要使用任何非字符数组类型的实在参数

有效输入的等价类有 (1) 1~6个数字字符组成的数字串(最高位数字不是零)。 (2) 最高位数字是零的数字串。 (3) 最高位数字左邻是负号的数字串。

无效输入的等价类有 (1) 空字符串(全是空格)。 (2) 左部填充的字符既不是零也不是空格。 (3) 最高位数字右面由数字和空格混合组成。 (4) 最高位数字右面由数字和其他字符混合组成。 (5) 负号与最高位数字之间有空格。

合法输出的等价类有 (1) 在计算机能表示的最小负整数和零之间的负整数。 (2) 零。 (3) 在零和计算机能表示的最大正整数之间的正整数。

非法输出的等价类有 (1) 比计算机能表示的最小负整数还小的负整数。 (2) 比计算机能表示的最大正整数还大的正整数

软件工程复习自用---第七章_第10张图片

软件工程复习自用---第七章_第11张图片

边界值分析

经验表明,处理边界情况时程序最容易发生错误。例如,许多程序错误出现在下标、纯量、数据结构和循环等等的边界附近。因此,设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些。    

使用边界值分析方法设计测试方案首先应该确定边界情况,通常输入等价类和输出等价类的边界。选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值。    

通常设计测试方案时总是联合使用等价划分和边界值分析两种技术

错误推测

错误推测法在很大程度上靠直觉和经验进行。它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案

等价划分法和边界值分析法都只孤立地考虑各个输入数据的测试功效,而没有考虑多个输入数据的组合效应,可能会遗漏了输入数据易于出错的组合情况。    

选择输入组合的一个有效途径(因果图)是利用判定表或判定树为工具,列出输入数据各种组合与程序应作的动作(及相应的输出结果)之间的对应关系,然后为判定表的每一列至少设计一个测试用例。    

选择输入组合的另一个有效途径是把计算机测试和人工检查代码结合起来

调试 

调试(也称为纠错)作为成功测试的后果出现,即调试是在测试发现错误之后排除错误的过程

调试就是把症状和原因联系起来的尚未被人深入认识的智力过程

调试途径:蛮干法、回溯法、原因排错法(对分查找法、归纳法和演绎法)

软件可靠性

软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。软件可靠性随着给定的时间间隔的加大而减少

软件可用性是程序在给定的时间点,按照规格说明书的规定,成功地运行的概率

可靠性和可用性之间的主要差别是,可靠性意味着在0到t这段时间间隔内系统没有失效,而可用性只意味着在时刻t,系统是正常运行的

你可能感兴趣的:(软件工程)