已阅读5页,还剩479页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件工程,(SoftwareEngineering),第6章:详细设计,目标:确定如何具体实现所要求的系统。不是具体编写程序,而是设计程序的“蓝图”。详细设计的结果决定最终程序代码的质量。,E.W.Dijkstra最早提出结构程序设计:程序质量与程序中包含的Goto语句的数量成反比(1965)。1966,Bohm,Jacopini,证明了只用“顺序”、“选择”、“循环”控制结构就能实现任何单入口单出口程序。,6.1结构程序设计,理论上,最基本的控制结构只有两种:顺序、循环结构(选择结构可由其两者构造)。学界认识到,不是简单去掉Goto语句的问题,而是要创立一种新的程序设计方法。结构化程序设计(IBM率先成功运用)。,结构程序设计:一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。,使用结构程序设计技术的好处:1)提高软件开发工程的成功率和生产率;2)系统有清晰的层次结构,容易阅读理解;3)单入口单出口的控制结构,容易诊断纠正;4)模块化可以使得软件可以重用;5)程序逻辑结构清晰,有利于程序正确性证明。,经典的结构程序设计:只允许使用顺序、IF_THEN_ELSE选择和DO_WHILE循环;,扩展的结构程序设计:除了三种基本控制结构,还使用DO_CASE和DO_UNTIL循环;,修正的结构程序设计:除了三种基本控制结构和两种扩充结构,还使用BREAK等结构。,流程图通常由三种结点组成:1)函数结点如果一个结点有一个入口线和一个出口线,则称为函数结点。,由于函数结点一般对应于赋值语句,所以F也表示了这一个结点对应的函数关系。,6.1.1结构化程序6.1.1.1控制结构,2)谓词结点如果一个结点有一个入口线和两个出口线,而且它不改变程序的数据项的值,则称为谓词结点。,P是一个谓词,根据P的逻辑值(T或F),结点有不同的出口。,3)汇点如果一个结点有两个或多个入口线和一个出口线,而且它不执行任何运算,则称为汇点。,1)顺序结构:相当于“A、B”,2.三种基本控制结构,2)选择结构相当于“IfexpthenAelseBendif”,3)循环结构:相当于“WhileexpdoA”,1)多分支结构相当于“CaseIofI=1:C1;I=2:C2;I=3:C3;I=n:Cn”,3.扩充两种控制结构,2)UNTIL循环结构相当于“RepeatAUntilexp”,6.2人机界面设计,6.2.1设计问题1.系统响应时间;2.用户帮助;3.出错信息处理;4.命令交互,6.2.2设计过程6.2.3人机界面设计指南1.一般交互指南;2.信息显示指南;3.数据输入指南。,6.3过程设计的工具,6.3.1程序流程图,程序流程图:是一种描述程序的控制结构流程和指令执行情况的有向图。历史悠久、使用广泛、直观描绘控制流程、便于初学者掌握。,ASP检索程序流程图:,2)程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。3)程序流程图不易表示数据结构。,程序流程图的缺点:1)程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。,6.3.2盒图(N-S图),盒图的特点有:1)功能域明确,可以从盒图上一眼就看出来;2)不可能任意转移控制;3)很容易确定局部和全程数据的作用域;4)很容易表现嵌套关系,也可以表示模块的层次结构。,盒图例子,PAD(ProblemAnalysisDiagram)是问题分析图。日立公司发明和推广(1973)。,6.3.3PAD图,例子:,PAD图的优点:1)使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序;2)PAD图所描绘的程序结构十分清晰。图中最左面的竖线是程序的主线,即第一层结构。随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。PAD图中竖线的总条数就是程序的层次数;,3)用PAD图表现程序,通俗易懂,程序从图中最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点;,4)容易将PAD图转换成高级语言源程序,这种转换可以用软件工具自动完成;5)可用于表示程序逻辑,也可用于描绘数据结构;6)PAD图的符号支持自顶向下、逐步求精的方法。,判定表由四部分组成:左上部列出所有条件左下部是所有可能做的动作右上部表示各种条件组合右下部是和每种条件组合相对应的动作,6.3.4判定表,6.3.5判定树判定树是判定表的变种。,PDL也称为伪码。如:ifI0then执行订单数据输入模块else报告出错信息endif,6.3.6过程设计语言(PDL),PDL的优点:1)可以作为注释直接插在源程序中间;2)可以使用普通的正文编辑程序或文字处理系统来完成PDL的书写和编辑工作;3)现在已经有一些自动处理程序可以自动地把PDL生成程序代码。,PDL的缺点:不如图形工具形象直观。,6.4面向数据结构的设计方法,1)顺序结构,6.4.1Jackson图,2)选择结构,3)重复结构,6.4.2改进的Jackson图,Jackson方法的目标是:得出对程序处理过程的详细描述。,6.4.3Jackson方法,Jackson结构程序设计方法由五个步骤组成:1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构;2)找出输入数据结构和输出数据结构中有对应关系的数据单元;,3)用三条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:A为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框;,B根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;C根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;,4)列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置;5)用伪码表示程序。,顺序结构:AseqBCDAend,与三种基本结构对应的伪码是:,选择结构Aselectcond1BAorcond2CAorcond3DAend,重复结构Aiteruntil(或while)condBAend,例:一个正文文件由若干记录组成,每个记录是一个字符串。如:Record1:Howmanystagesarethereinthetraditionalsoftwaredevelopmentmodel?Record2:Afterenteringtheroom,walktothepersonsittingnearesttoyouandgreethim/herwitha“highfive”.Record3:Whatareencapsulatedintoanobject?Record4:Whatdiagramisthefollowingdiagram?Simplydescribethemeaningofit.,要求:1)设计程序统计每个记录中空格字符的个数,输出数据的格式是,每读入一个记录(字符串)之后,另起一行打印出这个字符串及其空格数;2)最后打印出文件中空格的总个数。,分析输入、输出数据结构,用Jackson图描绘,并找出两者对应的数据单元:,导出描绘程序结构的Jackson图:,(1)停止(2)打开文件(3)关闭文件(4)印出字符串(5)印出空格数目(6)印出空格总数(7)sum:=sum+1(8)totalsum:=totalsum+sum(9)读入字符串(10)sum:=0(11)totalsum:=0(12)pointer:=1(13)pointer:=pointer+1I(1)文件结束I(2)字符串结束S(3)字符是空格,列出所有操作和条件:,6.5程序复杂度的定量度量,定量度量程序复杂度的作用:(1)可估算软件中错误的数量及软件开发工作量;(2)度量的结果可用来比较不同设计或不同算法的优劣;(3)程序的复杂度可作为模块规模的限度。,1.流图“退化”的程序流程图,仅描绘程序的控制流程,不表现对数据的具体操作及循环、选择的条件。,6.5.1McCabe方法,一个圆代表一条或多条语句;一个顺序结构可以合并成一个结点;,汇点也是结点;一个顺序处理框序列和一个判断框可映射成一个结点。,2.计算环形复杂度的方法1)环形复杂度V(G)等于流图中的区域数;2)环形复杂度V(G)EN+2,其中E是流图中边的条数,N是结点数;3)环形复杂度V(G)P1,其中P为流图中判定结点的数目。,例:计算下列程序图的程序复杂度,解:方法一:程序图把平面分为4个区域,程序复杂度V(G)4;方法二:边的条数E11,结点数N9,程序复杂度V(G)EN24;方法三:判定结点为1、2、4点,数目为P3个,所以V(G)P14。,3.环形复杂度的用途对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。实践表明,模块规模以V(G)10为宜。,根据程序中运算符和操作数的总数来度量程序复杂度。N=N1+N2其中:N定义为程序长度;N1为程序中运算符出现的总次数;N2为操作数出现的总次数。,6.5.2Halstead方法,Halstead给出预测程序长度的公式为:H=n1log2n1+n2log2n2其中:H定义为程序预测长度;n1为程序中使用的不同运算符(包括关键字)的个数;n2为程序中使用的不同操作数(变量和常量)的个数。,多次验证都表明,程序的预测长度H和实际程序长度N非常接近。Halstead还给出了预测程序中包含错误的个数的公式:E=Nlog2(n1+n2)/3000,第6章小结,详细设计说明书着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。,第7章:实现,编码和测试统称为实现。编码:把软件设计结果翻译成程序。测试:检测程序并改正错误的过程。,计算机程序设计语言基本上可以分为两大类:1.汇编语言;2.高级语言。,7.1编码,7.1.1选择程序设计语言,从应用特点看,高级语言可分为:1)基础语言如BASIC、FORTRAN、COBOL、ALGOL等2)结构化语言如ALGOL、PL/1、PASCAL、C、ADA等3)专用语言如APL、BLISS、FORTH、LISP、PROLOG等,选择一种编程语言的理论标准:1)有理想的模块化机制;2)可读性好的控制结构和数据结构;3)便于调试和提高软件可靠性;4)编译程序发现程序错误的能力强;5)有良好的独立编译机制。,选择语言时除了考虑理论上的标准,还必须同时考虑主要的实用标准:,(1)系统用户要求(2)可以使用的编译程序(3)可以得到的软件工具(4)工程规模(5)程序员知识(6)软件可移植性要求(7)软件的应用领域,1.程序内部的文档选取含义鲜明的名字,如果使用缩写,缩写规则要一致,并给每个名字加注释;通常在每个模块开始处要有一段注释,描述模块功能、算法、接口特点等;程序清单布局应利用适当的阶梯形式,使程序的层次结构清晰明显。,7.1.2写程序的风格,2.数据说明数据说明的次序应该标准化,如按数据类型确定说明的次序;多个变量名在一个语句中说明时,应该按字母顺序排列这些变量;如果设计时使用了复杂的数据结构,应该用注释说明实现该数据结构的方法和特点。,3.语句构造4.输入/输出5.效率A程序运行时间B存储器效率C输入/输出效率,程序设计工具实例:VisualC,运用VisualC+开发工具需要掌握:C语言特点、语法;Windows编程基础;MFC相关知识;VisualC集成开发工具环境的使用;,一、C语言特点、语法:C+语言是在C语言的基础是扩展而成的,两种语言的基本语法和语义是相同。,C+中加入了面向对象程序设计(OOP)的特征:封装性:通过“类”把属性和函数组合在一起。继承性:派生类可从先前定义的基类中继承函数和属性。多态性:一个函数名,由不同的对象解释执行,可得到不同的执行效果。,二、Windows编程基础:API:API是Windows应用程序编程接口。API是一个程序内(或一组相关程序内)的一组函数调用,程序员用它创建其他程序。程序员不必知道函数内部,只要知道API的函数原型及返回值。API的函数原型及返回值形式可由相关的技术规范资料获得。,现在的Win32API中,核心部分依靠三个主要组件提供Windows的大部分函数,这三个组件分别是:USER32.DLL;GDI32.DLL;KERNEL32.DLL。,Windows消息机制:1)基于消息的事件驱动消息可以是由硬件发来的(存于系统队列),也可以由Windows系统和应用程序发来(存于程序队列中);每一个Windows程序在不停的捕捉各种消息,并进行处理;每个窗口都必须有一个窗口函数,来负责消息的判断与处理。,2)窗口函数对消息的处理窗口函数是一个回调函数,可以处理收到的消息,在程序中不需要用户显式调用。该窗口函数的形式通常为:WndProc(),每个窗口类必须在初始化时指定一个窗口函数。,三、MFC:MFC,即Microsoft基本类,该类库封装了SDK(软件开发工具包)结构、功能及应用程序框架内部技术。它提供了许多可以重用的类,使得Windows程序员避免了许多重复性工作。,四、VisualC集成开发工具环境1)开发工具的使用;2)掌握Win32程序开发流程;一个win32程序由两大块组成:程序代码;用户接口资源。,用户接口资源:菜单,对话框,图标,光标等;这些资源的实际内容(二进制代码)由各种工具产生,并以各种扩展名的文件存在;,资源描述文件(*.rc)中对用户接口资源进行描述;RC编辑器(RC.exe)根据该资源描述文件(*.rc)将所有用户接口资源集中构造一个*.RES文件;*.RES文件与程序代码结合起来,构成一个Win32程序。,关于函数库和头文件:动态链接库:应用程序调用的API函数在“执行期间”才链接上的函数库,扩展名可以是.dll,也可以是.exe、.fon、.mod、.drv、.ocx等。静态连接库:.lib头文件:如windows.h,它包含操作系统本身的三大模块gdi32.dll、user32.dll和kernel32.dll中的所有API函数。,有关测试的一些规则:(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误的测试。,7.2.1软件测试的目标,7.2软件测试基础,7.2.2软件测试准则,1)所有测试都应该能追溯到用户需求;2)应该远在测试前就制定出测试计划;3)把Pareto原理应用到软件测试中;4)应该从“小规模”测试开始,并逐步进行“大规模”测试;,5)穷举测试是不可能的;,穷尽测试:包含所有可能情况的测试称为穷尽测试。,6)为了达到最佳测试效果,应该由独立的第三方从事测试工作。,黑盒测试:如果已经知道软件应该具有的功能,可以通过测试来检验是否每个功能都能正常使用,这种测试称黑盒测试。也称功能测试。,7.2.3测试方法,白盒测试:也称结构测试。如果知道软件内部工作过程,可以通过测试来检验软件内部动作是否按照规格说明书的规定正常进行,这种测试称为白盒测试。,1.模块测试模块测试又称单元测试,它把每个模块作为单独的实体来测试。2.子系统测试子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试。,7.2.4软件测试的步骤,3.系统测试系统测试是把经过测试的子系统装配成一个完整的系统来测试。4.验收测试验收测试把软件系统作为单一的实体进行测试(利用用户的实际数据测试)。5.平行运行平行运行是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。,7.2.5测试阶段的信息流,7.3单元测试,单元测试的一般方法是:首先通过编译系统检查并改正程序中所有的语法错误;然后用详细设计模块说明为指南,对重要的控制路径进行测试,以便发现模块内部的错误。通常,单元测试使用白盒测试方法。,1)模块接口应该对穿过模块接口的数据流进行检测,以保证正确的输入和输出。2)局部数据结构这是错误的主要来源,应该设计相应的测试用例,以便发现数据结构方面的错误。,7.3.1测试重点,3)重要的执行路径由于不可能进行穷尽测试,因此选择测试路径是非常关键的。4)出错处理通路5)边界条件,审查小组:1)组长;2)程序的设计者;3)程序的编写者;4)程序的测试者。,7.3.2代码审查,7.3.3计算机测试由于软件模块不是一个独立的系统,不能独立运行,要依靠其他模块调用,或需要调用其他模块。因此,必须要为测试的单元开发驱动程序或存根程序。,1)驱动程序相当于一个“主程序”,用来把测试数据传送给被测试的模块,并打印有关结果。2)存根程序用来代替被测试模块所调用的模块,相当于“虚拟子程序”。,如,测试B模块,设计了A模块和C模块。由A负责传送测试数据,由C负责模拟被B调用的模块。C模块可能没有,这取决于B有没有调用其他程序。A、C都是一次性程序,只在测试时临时使用,应尽量设计得简单一些,以节省费用和时间。,例:,对“编辑”功能的测试:,7.4集成测试,集成测试是组装软件的系统化技术,它将经过单元测试的模块联系在一起进行测试。由模块组装成程序时有两种方法:1)非渐增式测试方法先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序。,2)渐增式测试方法每次增加一个待测试模块,把它同已经测试好的那些模块结合起来进行测试,反复进行直到完成所有模块测试的方法。,使用渐增式测试方法把模块结合到软件系统中去时,有自顶向下和自底向上两种集成方法。,自顶向下集成是一种递增的装配软件结构的方法,这种方法应用非常广泛。它需要存根程序,但是不需要驱动程序。,7.4.1自顶向下集成,这种方法的思想是:从主控模块(主程序)开始,沿软件的控制层次向下移动,逐渐把各个模块结合起来。在自顶向下结合方法中,如何将所有模块组装到软件结构中,又有两种方法:,1)深度优先策略先组装软件结构的一条主控制通路上的所有模块,选择哪条主控制通路,具有较大的任意性。如图,如果选取左通路,就先把模块M1、M2、M5结合起来测试,然后结合模块M8、M6,再构造中央和右侧的控制通路。,2)宽度优先策略沿着软件结构水平地移动,把处于同一个层次的所有模块组装起来。如图,首先结合M2、M3、M4和主控模块M1,然后结合下一个控制层次中的模块M5、M6和M7,最后结合模块M8。,自顶向下集成方法的基本过程如下:1)对主控模块进行测试,测试时用存根程序代替所有直接被主控模块调用的模块;,2)根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代替一个存根程序(新结合的模块往往又需要新的存根程序);,3)每结合一个模块,就测试一个;4)为保证不引入新的错误,需要进行回归测试,即重复以前进行过的部分或全部测试;5)重复回到第二步,直到构成整个软件结构。,自底向上集成方法是从软件结构最底层模块开始进行组装和测试,它与自顶向下结合方法相反,需要驱动程序,不需要存根程序。,7.4.2自底向上集成,自底向上集成方法的基本过程如下:1)把底层模块组合成实现一个特定软件子功能的族,如图族1、2、3。,2)为每个模块设计一个驱动程序,作为测试的控制程序,以协调测试用例的输入和输出。图中D1、D2、D3分别是族1、2、3的驱动程序;,3)对模块进行测试;4)用实际模块代替驱动程序组装成新的模块族,在新加入的实际模块上面加上新的驱动程序进行测试;,5)重复第二到第四步,逐渐向上加入实际模块,直至构造出整个软件结构。,7.4.3不同集成测试策略的比较,1.改进的自顶向下测试方法;2.混合法。,7.4.4回归测试指重新执行已经做过的部分测试。回归测试用于保证由于调试或其他原因引起的程序变化,不会导致额外错误的测试活动。,7.5确认测试(验收测试),也称为验收测试,目标是验证软件的有效性。如果软件的功能和性能符合用户的期待,软件就是有效的。软件规格说明书是进行确认测试的基础。,7.5.1确认测试的范围,确认测试的主要特点及内容有:1)某些已经测试过的纯粹技术性的测试项可能不需要再次测试,而对用户特别感兴趣的功能或性能,可能需要增加一些测试;2)通常确认测试主要使用实际生产中的数据来进行测试;3)确认测试必须有用户的积极参与,甚至以用户为主,可能需要进行一些与用户使用步骤有关的测试。,确认测试一般使用黑盒测试法。,7.5.2软件配置复查,目的:保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,而且已经编好目录。,7.5.3Alpha和Beta测试,Alpha测试:用户在开发者的场所进行测试,并且在开发者的指导下进行,测试在受控环境中进行,开发者记录发现的错误和问题;Beta测试:用户在一个或多个客户场所进行测试,不受开发者控制,测试者记录发现的问题和错误,定期将问题报告发送给开发者。,7.6白盒测试技术,1.语句覆盖语句覆盖是指:设计的测试用例能使程序中每条语句至少执行一次。,7.6.1逻辑覆盖,例:一个被测试模块的源程序为(PASCAL语言):PROCEDUREEXAMPLE(A,B:REAL;VARX:REAL);BEGINIF(A1)AND(B=0)THENX:=X/A;IF(A=2)OR(X1)THENX:=X+1END,选取测试用例:A=2,B=0,X=4,程序执行路径为:sacbed。,2.判定覆盖判定覆盖是指:选取足够的测试用例,使得程序中每个判断的可能结果都至少执行一次,也就是说使程序的每个判断分支至少通过一次。,对于上例,选取如下测试用例:I.A=3,B=0,X=3(覆盖sacbd)II.A=2,B=1,X=1(覆盖sabed),3.条件覆盖条件覆盖是指:选择足够的测试用例,使得程序中每个判定表达式的每个条件都取到各种可能的结果。,上例中,有两个判定表达式,每个表达式有两个条件,为了做到条件覆盖,应该选取测试数据使得a点出现如下结果:A1,A1,B=0,B0在b点出现如下结果:A=2,A2,X1,X1,选取如下测试用例:I.A=2,B=0,X=4(满足A1,B=0,A=2和X1,执行路径为sacbed)II.A=1,B=1,X=1(满足A1,B0,A2和X1,执行路径为sabd),条件覆盖通常比判定覆盖强,但是条件覆盖不一定包含判定覆盖。,如:IA=2,B=0,X=1(满足A1,B=0,A=2和X1,执行路径为sacbed)IIA=1,B=1,X=2(满足A1,B0,A2和X1,执行路径为sabed)只满足条件覆盖,并不满足判定覆盖。,4.判定/条件覆盖判定/条件覆盖是指:选取足够的测试用例使得同时满足判定覆盖和条件覆盖的要求。,对于上例,选取如下测试用例:IA=2,B=0,X=4(满足A1,B=0,A=2和X1,执行路径为sacbed)IIA=1,B=1,X=1(满足A1,B0,A2和X1,执行路径为sabd),5.条件组合覆盖条件组合覆盖指:选取足够的测试用例,使得每个判定表达式中条件的各种可能的组合都至少出现一次。,对于上例,共有8种可能的条件组合:1)A1,B=02)A1,B03)A1,B=04)A1,B05)A=2,X16)A=2,X17)A2,X18)A2,X1,选取如下测试用例:IA=2,B=0,X=4(满足1、5组合:A1,B=0,A=2,X1,执行路径sacbed)IIA=2,B=1,X=1(满足2、6组合:A1,B0,A=2,X1,执行路径sabed),IIIA=1,B=0,X=2(满足3、7组合:A1,B=0,A2,X1,执行路径sabed)IVA=1,B=1,X=1(满足4、8组合:A1,B0,A2,X1,执行路径sabd),如果从对程序路径的覆盖程度分析,可以提出下面一些逻辑覆盖标准:6.点覆盖点覆盖是指:选取足够多的测试用例,使得程序执行路径至少经过程序图中每个节点一次。,7.边覆盖边覆盖是指:选取足够多的测试用例,使得程序执行路径至少经过程序图中每条边一次。,选取如下测试用例:IA=3,B=0,X=3(执行路径1453)IIA=2,B=1,X=1(执行路径1267),8.路径覆盖路径覆盖是指:选取足够多的测试用例,使得程序的每条可能路径都至少执行一次。,选取如下测试用例:IA=1,B=1,X=1(执行路径123)IIA=1,B=1,X=2(执行路径1267)IIIA=3,B=0,X=1(执行路径1453)IVA=2,B=0,X=4(执行路径14567),1)A=3,B=0,X=12)A=2,B=0,X=43)A=2,B=1,X=14)A=1,B=0,X=25)A=1,B=1,X=1,更强的测试数据:满足路径覆盖和条件组合覆盖,2)5)满足条件组合覆盖,执行路径分别是:sacbed、sabed、sabed、sabd,路径:sacbd,7.6.2控制结构测试(自学),等价类划分是一种黑盒测试技术。穷尽的黑盒测试需要使用所有可能的输入数据(有效的和无效的)进行测试,通常是不现实的。因此产生了等价类划分。,7.7.1等价划分(等价类划分),7.7黑盒测试技术,等价类划分的思想:如果将所有可能的输入数据(有效的和无效的)划分为若干个等价类,就可以假定用每一个等价类中的代表值作为测试用例来进行测试时,等价于用该类中所有值进行了测试。,用等价类划分设计测试用例时,主要分两步:划分等价类、确定测试用例。1)等价类划分划分等价类需要经验,以下给出一些规则:,A如果某输入条件规定了输入的范围,那么可以划分为一个有效的等价类和两个无效的等价类。如X的值的输入范围是1,99,那么测试X时,可以这样划分:有效等价类为1,99,无效等价类为(-,1)和(99,+)。,B如果某个输入条件规定了一组可能的值,且程序可以对不同的值作出不同的处理,那么可以为每种值确定一个有效的等价类,同时还有一个无效等价类。,如,“职称”这个量可能的值是:教授、副教授、讲师、助教。那么可以这样划分:四类有效等价类分别为教授、副教授、讲师、助教,无效等价类为四种职称以外的所有值。,2)确定测试用例A给每个等价类规定一个唯一的编号;B设计一个新的测试用例,使其尽可能多地覆盖未被覆盖过的有效等价类。重复此步,直至所有有效等价类被覆盖;,C设计一个新的测试用例,使其覆盖而且只覆盖一个尚未被覆盖的无效等价类。重复此步,直到所有无效等价类被覆盖。通常程序发现一类错误后,就报出错信息,不再检查其它类错误,所以设计测试用例时,一次只覆盖一个无效等价类。,实例:一个把数字串变成整数的函数。计算机字长:16bits,函数由PASCAL语言编写。functionstrtoint(dstr:shortstr):integertypeshortstr=array1.6ofchar;/字符串6位/(16位字长能表示的整型数范围是-215,215-1,即-32768,32767),有效输入的等价类有:(1)16个数字字符组成的数字串(最高位数字不为零);如:0,999999(2)最高位数字是零的数字串;如:“012345”(3)最高位数字左邻是负号的数字串;如:“12345”,无效输入的等价类有:(4)空字符串(全是空格);如“”;(5)左部填充的字符既不是零,又不是空格;如:“A12345”(6)最高位数字右面由数字和空格混合而成;如:“12345”(7)最高位数字右面由数字和其他字符混合而成;如:“12A345”(8)负号与最高位数字之间有空格;如:“-1234”,合法输出的等价类有:(9)在计算机能表示的最小负整数和零之间的负整数;如:-32768,0)(10)零;(11)在零和计算机能表示的最大正整数之间的正整数;如:(0,32767,非法输出的等价类有:(12)比计算机能表示的最小负整数还小的负整数;如:“32769”(13)比计算机能表示的最大正整数还大的正整数;如:“123456”,根据划分的等价类,设计出测试方案11个:(1)16个数字组成的字符串;输入:1预期的输出:1(2)最高位数字是零的数字串;输入:000001预期的输出:1(3)负号与最高位数字相邻;输入:00001预期的输出:1,(4)最高位数字是零的特例;输入:000000预期的输出:0(5)太小的负整数;输入:47561预期的输出:错误无效输入(6)太大的正整数;输入:132767预期的输出:错误无效输入,(7)空字符串;输入:预期的输出:错误没有数字(8)字符串左部字符既不是零又不是空格;输入:AAAAA1预期的输出:错误非数字(9)最高位数字后面有空格;输入:12预期的输出:错误无效输入,(10)最高位数字后面有其他字符;输入:1AAA23预期的输出:错误无效输入(11)负号和最高位数字之间有空格;输入:12预期的输出:错误负号位置错。,程序通常在处理边缘情况时容易出现错误,如等价类与等价类之间的边界值。所以在设计测试用例时,使用正好等于、正好大于、正好小于边界值的数据进行测试,发现程序错误的概率较大。,7.7.2边界值分析,边界值分析测试法属黑盒测试。在实际设计测试方案时,常常结合使用等价划分和边界值分析两种技术,把一些等价类的边界值作为测试用例进行测试。,上例中设计了11个测试用例,还应该用边界值分析补充测试用例:(12)使输出刚好等于最小负整数;输入:32768预期的输出:32768(13)使输出刚好等于最大的正整数;输入:32767预期的输出:32767,(14)使输出刚刚小于最小的负整数;输入:32769预期的输出:错误无效输入(15)使输出刚刚大于最大正整数;输入:32768预期的输出:错误无效输入,错误推测法在很大程度上靠直觉和经验进行。基本思想:列举出程序中可能的错误和容易发生错误的特殊情况,且根据它们选择测试方案。如:输入、输出为0时容易出错;输出记录为0条时容易出错;等等。,7.7.3错误推测,对软件系统进行实际测试时,应该联合使用各种设计测试方案的方法,形成一种综合策略。具体可以使用如下策略:1)在任何情况下都应该进行边界值分析;2)必要时用等价划分法补充测试方案;,7.7.4实用测试策略,3)必要时再用错误推测法补充测试方案;4)对照程序逻辑,检查已经设计出的测试方案。可以根据对程序可靠性的要求采用不同的逻辑覆盖标准。,实例:程序TRIANGLE读入三个整数值,这三个整数代表同一个三角形三条边的长度,程序根据这三个值判断三角形属于不等边、等腰或是等边三角形。,综合使用边界值分析、等价值划分和错误推测等技术,可以设计出11种应该测试的情况:(1)正常的不等边三角形;(2)正常的等边三角形;(3)正常的等腰三角形,包括两条相等边的三种不同排列方法;(4)退化的三角形(即两边的和等于第三边),包括三种不同排列方法;,(5)三条边不能构成三角形(即两边之和小于第三边),包括三种不同排列方法;(6)一条边的长度为零,包括三种不同的排列方法;(7)两条边的长度为零,包括三种不同的排列方法;(8)三条边的长度全为零;(9)输入数据中包含负整数;(10)输入数据不全(不足三个正整数);(11)输入数据中包含非整数型的数据。,程序TRIANGLE的测试数据,最后,检查测试数据的覆盖程度,通常应该做到边覆盖。,测试数据覆盖程度检验表中列出的四种测试数据已经做到了边覆盖(覆盖所有的22条边)。,测试数据覆盖程度检验表,7.8调试,7.8.1调试过程,调试是在测试发现错误之后排除错误的过程。,1.蛮干法:打印内存的内容,从中寻找错误的线索,是效率最低的程序调试方法。2.回溯法:从发现问题的程序段开始人工地往回追踪分析程序代码,直到找到错误。3.原因排除法包括:对分查找法、归纳法、演绎法,7.8.2调试途径,7.9软件可靠性,1.软件可靠性定义软件可靠性:是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。,7.9.1基本概念,2.软件的可用性对故障可修复系统,应同时使用可靠性和可用性来衡量。软件可用性是:程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。可靠性和可用性的区别是:可靠性是在0到t时间间隔内,系统没有失效的概率。而可用性是在t时刻,系统是正常运行的概率。,如果在t时刻,系统是可用的,则有两种可能:1)在0到t时刻这段时间内,系统一直没有失效(可靠);2)在0到t时刻这段时间内失效过,但是系统修复后运行到t时刻时情况良好。,如果在一段时间内,软件系统故障停机时间分别为:td1,td2,正常运行时间分别为:tu1,tu2,则系统的稳态可用性定义为:,其中Tup=tui,Tdown=tdi,如果引入系统平均无故障时间MTTF和平均维修时间MTTR的概念,则上面公式的系统稳态可用性变成:,平均维修时间MTTR是修复一个故障平均需要用的时间,取决于维护人员的技术水平和对系统熟悉程度。平均无故障时间MTTF是系统按照规格说明书规定成功地运行的平均时间,取决于系统中潜伏的错误数量。,1.符号估算MTTF时使用到下列符号ET测试之前程序中故障总数;IT程序长度(机器指令总数);测试(包括调试)时间;Ed()在0至期间发现的错误数;Ec()在0至期间改正的错误数;,7.9.2估算平均无故障时间MTTF的方法,2.基本假定可作出下列假定:1)单位长度里的故障数ET/IT近似为常数。一些统计数字表明,通常有:0.510-2ET/IT210-2。2)失效率正比于软件中剩余的(潜藏的)故障数,而平均无故障时间MTTF与剩余的故障数成反比。3)调试过程没有引入新的故障,即Ec()=Ed()。,由于系统剩余的故障数为:Er()=ET-Ec()所以单位长度程序中剩余的故障数为:r()=ET/IT-Ec()/IT,3.估算平均无故障时间MTTF因为平均无故障时间与单位长度程序中剩余的故障数r()成反比,所以:,其中:K为常数,它的值根据经验选取,经典值是200。,由上式变换后得到程序中改正的错误数:,根据对软件平均无故障时间的要求,可以估计需要改正多少个错误后,测试工作就可以结束。,4.估计故障总数ET的方法1)植入故障法假设人为地植入的故障数为Ns,经过一段时间的测试之后发现ns个植入的故障,同时还发现了n个原有的故障,则可以估计出程序中原有的故障总数:,其中:是故障总数ET的估计值;,植入错误法人为植入的错误与原有程序错误可能性质很不相同,发现它们的难度也不同,用此法估计的错误数有时可能不太准确。2)分别测试法分别测试法随机把程序中一部分原有错误加上标记,根据测试发现的有标记和无标记错误的比例,估计程序错误总数。,分别测试法使用两个测试员,独立地测试同一个程序的两个副本,由另一名分析员分析他们的测试结果,把其中一个测试员发现的故障作为有标记的故障。用表示测试时间,假设=0时故障总数为B0(即ET);=1时测试员甲发现的故障数为B1;=1时测试员乙发现的故障数为B2;=1时两个测试员发现的相同故障数为bc。,如果认为测试员甲发现的故障是有标记的,即程序中有标记的故障总数为B1,那么测试员乙发现的B2个故障中有bc个是有标记的。所以可以估计出测试前程序中的故障总数为:,其中,是故障总数ET的估计值。每隔一定时间,分析员分析两名测试员的测试结果,来估计错误总数。几次估计结果差不多时,用其平均值作为错误总数的估计值。,一种预测软件可靠性和衡量软件质量的方法。用测试完成率作为度量软件质量的标准。,7.10日立预测法,7.10.1测试完成率模型,日立的经验表明,完成软件测试通常需要经历三个阶段,第一阶段故障多,测试完成慢,第二阶段测试完成率提高快,第三阶段错误难改正,完成率提高不快。测试时间使用率测试所用时间/测试允许使用时间。,日立的经验表明:1)第一个阶段平均占总时间的22%;2)如果第一个阶段占用的时间超过总时间的55%以上时,该项工程必然失败;,3)成功的工程第一个阶段占用的时间平均为总时间的15%,失败的工程第一个阶段占用的时间高达总时间的97%左右;4)成功的工程第二阶段占总时间的57%左右,失败的工程第二个阶段只占总时间的29%左右。,错误发现率:单位时间内发现的错误数。,7.10.2错误发现率模型,经验表明,失败工程的错误发现率曲线的斜率范围是-0.30,成功的工程为-1-0.3,7.10.3使用日立预测法的步骤,1)制订测试计划,设计测试方案,确定要完成的测试用例的总数;2)从集成测试开始,记录测试用例完成数和错误发现数,绘制用例完成率曲线和错误发现率曲线;3)绘制曲线时,实际的数据是一串离散的点,如果工程不大周期不长的话,连接这些点得不到平滑的曲线时,作平滑处理;,4)每周至少检查一次绘制的曲线,以判断处于哪个阶段,如果第二阶段的到来比计划时间推迟25,就需要及时采取措施补救;5)严密注视错误发现率变化情况以确定其峰值,在错误发现率下降时,计算其斜率,如果大于0.3就产生了严重的问题;6)每周至少检验一次,以修正上一周作出的阶段性预测。,第7章小结,测试计划为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范围等。测试分析报告测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。,测试阶段可能用到的软件工具:BugfreeBug处理记录工具。Wiki知识共享工具。LoadRunner负荷(载)测试软件,预测系统行为和性能的负载测试工具,通过模拟多至上千万用户实施并发负载及实时性能监测的方式来查找和确认问题。,第8章:维护,软件维护是软件生命周期的最后一个阶段。它的任务是:维护软件的正常运行,不断改进软件的性能和质量,为软件的进一步推广应用和更新替换做积极工作。,软件维护所需的工作量非常大,一般说来,大型软件的维护成本高达开发总成本的四倍左右。目前,软件开发组织把60%以上的工作量用于维护自己的软件上。,问题:软件交付使用,软件验收测试以后,就标志着软件设计开发阶段的结束。而软件交付用户使用,才真正标志漫长的维护阶段的开始。,软件交付使用就是新系统和旧系统的转换。旧系统可能是人工作业系统,也可能是某个旧的计算机系统。软件交付应该是一个过程,而不是一个突然事件,软件的交付使用应尽可能平稳过渡,不影响生产或工作,新系统逐步安全地取代旧系统。,一、软件交付使用的工作1)将旧系统的数据转换到新系统(如数据库数据);2)新系统调试完成并加载入机器,准备运行;3)将有关资料(如使用说明)转交给用户;4)对用户做适当的培训。,二、软件交付使用的方式1)直接方式,直接方式是用新系统直接替换旧系统,没有过渡。优点:转换简单,费用最省。缺点:风险大。,由于新系统没有承担过实际工作,可能会出现意想不到的问题,甚至出现程序设计错误。因此,实际应用时,采取一些措施,以便新系统一旦出错,旧系统能够恢复运行。直接方式不适用于一些关系重大的系统。,2)并行方式,一些关系重大的软件产品在验收测试后,并不立即投入生产性运行,而是同时运行新系统和旧系统,以比较处理结果,这就是并行方式。,优点:A.可以对系统进行全面测试,减少了新系统失灵带来的风险,因为旧系统也仍然存在;B用户也能够有一段熟悉新系统的时间。缺点:所需费用较高,双系统要投入更多的人力财力。,3)逐步方式逐步方式是将软件分期,部分地交付使用。这种方式克服了上面两种方式的缺点,既能防止直接转换产生的危险性,又能减少并行方式的费用。但是这种方法使得整个系统中一部分是旧系统,一部分是新系统,所以必须考虑好它们的相互配合问题和接口问题。,实际应用中,常常是混合以上几种方法。对系统不重要的部分采用直接方式,对系统重要部分采用并行方式,使系统平稳交付使用。,通常要求进行软件维护的原因有三种:1)改正在特定使用条件下暴露出来的一些潜在程序错误或设计缺陷;2)因在软件使用过程中数据环境发生变化(如所要处理的数据发生变化)或处理环境发生变化(如硬件或软件操作系统等发生变化),需要修改软件,以适应这种变化;,8.1软件维护的定义,8.1.1软件维护的原因,3)用户和数据处理人员在使用时常提出改进现有功能、增加新功能、以及改善总体性能的要求,为满足这些要求,需要修改软件。,1)改正性维护交付给用户使用的软件,即使通过严格的测试,仍可能有一些潜在的错误在用户使用的过程中发现和修改。诊断和改正错误的过程称为改正性维护。,8.1.2软件维护的类型,2)适应性维护随着计算机的飞速发展,新的硬件系统和外部设备时常更新和升级,一些数据库环境、数据输入/输出方式、数据存储介质等也可能发生变换。为了使软件适应这些环境变化而修改软件的过程叫做适应性维护。,3)完善性维护在软件投入使用过程中,用户可能还会有新的功能和性能要求,可能会提出增加新功能、修改现有功能等要求。为了满足这类要求而进行的维护称为完善性维护。,4)预防性维护为了改进软件未来的可维护性或可靠性,或者为了给未来的改进奠定更好的基础而进行的修改,称为预防性维护。这种维护活动在实践中比较少见。,在各类维护中,完善性维护占软件维护工作的大部分。根据国外的数据统计表明,完善性维护占全部维护活动的50%66%,改正性维护占17%21%,适应性维护占18%25%,其它维护活动占4%左右。,8.2.1结构化维护与非结构化维护的差别1.非结构化维护软件配置的唯一成分是代码,维护从评价程序代码开始,对软件结构、数据结构、系统接口、设计约束等常产生误解,不能进行回归测试,维护代价大。2.结构化维护有完整的软件配置,维护从评价设计文档开始,确定软件结构、性能和接口特点,现修改设计,接着修改代码,再进行回归测试。,8.2软件维护的特点,软件维护的代价表现为有形代价和无形代价。有形代价指软件维护的费用开支。70年代,用于软件维护的费用只占软件总预算的30%40%,80年代上升到60%左右,90年代许多软件项目的维护经费预算达到了80%。,8.2.2软件维护的代价,1.有形代价与无形代价,无形代价:1)当一些看起来合理的要求不能及时满足时,会引起用户的不满;2)改动软件可能会引入新的错误,使软件质量下降;3)把许多软件工程师调去从事维护工作,势必影响开发工作。,软件维护所花费的工作量,一部分用于生产性活动,如分析、评价、修改设计、编写程序等;另一部分用于非生产性活动,如理解代码的含义、解释数据结构和接口特点等。,2.软件维护工作量模型,Belady和Lehman提出了一种维护工作量模型:M=P+Ke(c-d)其中:M:用于维护工作的总工作量;P:生产性工作量;K:经验常数;c:因缺乏好的设计和文档而导致软件复杂性的度量;d:维护人员对软件熟悉程度的度量。,上述模型指出:如果使用了不好的软件开发方法,原来参加开发的人员或小组不能参加维护,则工作量和成本将按指数级增加。,8.2.3软件维护的典型问题,1)如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全管理控制课件
- 针刺配合刺络放血对神经根型颈椎病的临床疗效观察
- 建筑工程师从业资格认证模拟试题与答案
- 家庭成长计划制定指南儿童成长行为测试题及答案解析
- 建筑幕墙工程防水性能测试与试题集及答案
- 家政服务考试题库及答案抖音版
- 惠民教育高考模拟题及答案解析
- 库仑力测试题及答案
- T∕SZJL 16-2025 数控机床转台技术规范
- 家庭关系情景模拟测试及答案解析
- 2025年秋人教版小学数学六年级上册期末质量检测试卷及参考答案
- 招聘专员年度述职报告
- 心电中心运营方案
- xx医院检验科室内质控月总结报告
- 2025年秋青岛版(五四学制)(新教材)小学数学三年级上册(全册)教学设计(附目录P129)
- 【《复杂场景下的运动目标跟踪算法分析》开题报告4200字】
- 2025新疆交通投资(集团)有限责任公司所属公司招聘26人笔试历年典型考点题库附带答案详解2套试卷
- 2025榆林镇北台、红石峡景区招聘(26人)考试笔试模拟试题及答案解析
- 广东5年(2021-2025)高考生物真题分类汇编:专题04 遗传的基本规律(原卷版)
- 村干部考入事业编面试真题(含答案)
- 2025-2030律师事务所行业战略联盟与协同发展研究报告
评论
0/150
提交评论