软件工程教案7-实现_第1页
软件工程教案7-实现_第2页
软件工程教案7-实现_第3页
软件工程教案7-实现_第4页
软件工程教案7-实现_第5页
已阅读5页,还剩226页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教学目标了解程序设计语言对编码的重要性,掌握软件测试的基础知识教学重点各种软件测试方法及其特性及使用场景教学难点黑盒测试、白盒测试第7章实现通常把编码和测试统称为实现。程序的质量主要取决于软件设计的质量,但是,所选用的程序设计语言的特点及编码风格也将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。第7章实现软件测试在软件生命周期中横跨两个阶段。通常在编写出每个模块之后就对它做必要的测试(称为单元测试),模块的编写者和测试者是同一个人,编码和单元测试属于软件生命周期的同一个阶段。在这个阶段结束之后,对软件系统还应该进行各种综合测试,这是软件生命周期中的另一个独立的阶段,通常由专门的测试人员承担这项工作。第7章实现大量统计资料表明,软件测试的工作量往往占软件开发总工作量的40%以上.在极端情况,测试那种关系人的生命安全的软件所花费的成本,可能相当于软件工程其他开发步骤总成本的3倍到5倍。通过测试发现错误之后还必须诊断并改正错误,这就是调试的目的。调试是测试阶段最困难的工作。第7章实现第7章实现7.1编码7.2软件测试基础7.3单元测试7.4集成测试7.5确认测试7.6软件测试方法7.7小结与作业7.1编码7.1.1选择程序设计语言程序设计语言是的特点会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。编码之前的选择一种适当的程序设计语言是一项重要工作。高级语言明显优于汇编语言,在需要效率的某些场合,需要汇编语言,或者大型系统中执行时间非常关键的(或直接依赖于硬件的)一小部分代码需要用汇编语言书写之外,其他程序应该一律用高级语言书写。有理想的模块化机制,以及可读性好的控制结构和数据结构;为了便于调试和提高软件可靠性,语言特点应该使编译程序能够尽可能多地发现程序中的错误;为了降低软件开发和维护的成本,选用的高级语言应该有良好的独立编译机制。7.1.1选择程序设计语言机器语言,几乎不使用。汇编语言,特殊场合使用。高级语言,明显优于汇编语言。7.1.1选择程序设计语言程序设计语言的划代:

划代语言特点级别1GL机器语言程序不直观,编程出错率高运行效率高低级2GL汇编语言比机器语言直观,减少了出错率与机器码一样长特殊情况下才使用3GLBASICPASCALC、C++等利用类英语的语句和命令一条语句相当于5-10条机器码要规定详细的算法过程高级4GL数据库查询语言程序生成器图形语言与自然语言接近一条语句相当于30-50条机器码非过程化问题定义运行开销大,效率低(1)系统用户的要求。如果所开发的系统由用户负责维护,用户通常要求用他们熟悉的语言书写程序。(2)可以使用的编译程序。运行目标系统的环境中可以提供的编译程序往往限制了可以选用的语言的范围。(3)可以得到的软件工具。如果某种语言有支持程序开发的软件工具可以利用,则目标系统的实现和验证都变得比较容易。(4)工程规模。如果工程规模很庞大,现有的语言又不完全适用,那么设计并实现一种供这个工程项目专用的程序设计语言,可能是一个正确的选择。选择语言的主要实现标准(5)程序员的知识。虽然对于有经验的程序员来说,学习一种新语言并不困难,但是要完全掌握一种新语言却需要实践。如果和其他标准不矛盾,那么应该选择一种已经为程序员所熟悉的语言。(6)软件可移植性要求。如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的。(7)软件的应用领域。所谓的通用程序设计语言实际上并不是对所有应用领域都同样适用。因此,选择语言时应该充分考虑目标系统的应用范围。7.1.1选择程序设计语言源程序代码的逻辑简明清晰、易读易懂应该遵循下述规则:1.程序内部的文档包括恰当的标识符、适当的注解和程序的视觉组织等等。选取含义鲜明的名字,使它能正确地提示程序对象所代表的实体,这对于帮助阅读者理解程序是很重要的。如果使用缩写,那么缩写规则应该一致,并且应该给每个名字加注解。7.1.2编码风格注解非常有助于对程序的理解。每个模块开始处有序言性的注解:简要描述模块的功能、主要算法、接口特点、重要数据以及开发简史;程序中间与一段程序代码有关的注解:主要解释包含这段代码的必要性。不能滥用注释,应利用注解提供一些额外的信息。注解的内容一定要正确。程序清单的布局对于程序的可读性也有很大影响,应该利用适当的阶梯形式使程序的层次结构清晰明显。7.1.2编码风格2.数据说明数据说明的次序应该标准化。有次序就容易查阅,因此能够加速测试、调试和维护的过程。当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。7.1.2编码风格3.语句构造构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂。下述规则有助于使语句简单明了:不要为了节省空间而把多个语句写在同一行;尽量避免复杂的条件测试;尽量减少对“非”条件的测试;避免大量使用循环嵌套和条件嵌套;利用括号使逻辑表达式或算术表达式的运算次序清晰直观。7.1.2编码风格4.输入输出在设计和编写程序时应该考虑下述有关输入输出风格的规则:对所有输入数据都进行检验;检查输入项重要组合的合法性;保持输入格式简单;使用数据结束标记,不要要求用户指定数据的数目;明确提示交互式输入的请求,详细说明可用的选择或边界数值;当程序设计语言对格式有严格要求时,应保持输入格式一致;设计良好的输出报表;给所有输出数据加标志。7.1.2编码风格5.效率效率主要指处理机时间和存储器容量两个方面。应该清晰3条概念:首先,效率是性能要求,因此应该在需求分析阶段确定效率方面的要求。软件应该像对它要求的那样有效,而不应该如同人类可能做到的那样有效(需求分析相关);其次,效率是靠好设计来提高的(设计相关);第三,程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率(效率不是第一位的)。下面从三个方面进一步讨论效率问题。7.1.2编码风格程序运行时间详细设计确定的算法的效率决定系统的效率。程序的风格也能对程序的执行速度和存储器要求产生影响。为此应当知道下述规则:写程序之前先简化算术的和逻辑的表达式;仔细研究嵌套的循环,以确定是否有语句可以从内层往外移;尽量避免使用多维数组;尽量避免使用指针和复杂的表;7.1.2编码风格使用执行时间短的算术运算;不要混合使用不同的数据类型;尽量使用整数运算和布尔表达式。在效率是决定性因素的应用领域,尽量使用有良好优化特性的编译程序,以自动生成高效目标代码。7.1.2编码风格存储器效率在大型计算机中必须考虑操作系统页式调度的特点,一般说来,使用能保持功能域的结构化控制结构,是提高效率的好方法。在微处理机中如果要求使用最少的存储单元,则应选用有紧缩存储器特性的编译程序,在非常必要时可以使用汇编语言。提高执行效率的技术通常也能提高存储器效率。提高存储器效率的关键同样是“简单”。7.1.2编码风格7.1.2编码风格(3)输入输出的效率硬件之间的通信效率是很复杂的问题,但是,从写程序的角度看,却有些简单的原则可以提高输入输出的效率。例如:所有输入输出都应该有缓冲,以减少用于通信的额外开销;对二级存储器(如磁盘)应选用最简单的访问方法;二级存储器的输入输出应该以信息组为单位进行;这些简单原则对于软件工程的设计和编码两个阶段都适用。.小结:编码规范规范项规范内容1排版排版格式,如缩进、块语句、分行等2注释规范注释的格式3标识符命名规范标识符的命名规则4可读性为提高可读性所作的规范,如禁止使用技巧性高的语句5变量、结构规范变量和结构的定义,如禁止局部与全局变量同名等6函数、过程规范函数的定义,如“不要设计多用途面面俱到的函数”7可测性为提高可测性的规范,如“用断言确认函数的参数”等8程序效率为程序效率所作的规范,如“循环体内工作量最小化”9质量保证为提高软件质量所作的规范,如“防止内存操作越界”例1:注释/*ADDAMOUNTTOTOTAL*/TOTAL=AMOUNT+TOTAL/*ADDMONTHLY-SALESTOANNUAL-TOTAL*/TOTAL=AMOUNT+TOTAL例2:视觉组织——空格(A<-17)ANDNOT(B<=49)ORC(A<-17)ANDNOT(B<=49)ORC例3:视觉组织——移行IF(…)THENIF(…)THEN……ELSE……ENDIF……ELSE……ENDIF例4:数据说明标准化INTEGERsize,length,width,cost,priceINTEGERcost,length,price,size,width例5:一行一条语句FORI:=1TON-1DOBEGINT:=I;FORJ:=I+1TONDOIFA[J]<A[T]THENT:=J;IFT<>ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=WORK;ENDEND;FORI:=1TON-1DOBEGINT:=I;FORJ:=I+1TONDOIFA[J]<A[T]THENT:=J;IFT<>ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=WORK;ENDEND;例6:强调清晰性A[I]=A[I]+A[T];A[T]=A[I]-A[T];A[I]=A[I]-A[T];WORK=A[T];A[T]=A[I];A[I]=WORK;例7:简单直接

for(i=1;i<=n;i++)for(j=1;j<=n;j++)V[i][j]=(i/j)*(j/i)

for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j)V[i][j]=1;elseV[i][j]=0;例8:避免不必要的转移IF(X<Y)GOTO30IF(Y<Z)GOTO50SMALL=ZGOTO7030IF(X<Z)GOTO60AMALL=ZGOTO7050SMALL=YGOTO7060SMALL=X70CONTINUESMALL=X;IF(Y<SMALL)SMALL=Y;IF(Z<SMALL)SMALL=Z;例9:避免使用空ELSE和IF…THENIF…语句if(char>=’a’)if(char<=’z’)cout<<“Thisisaletter.”;elsecout<<“Thisisnotaletter.”;if(char>=’a’&&char<=’z’)cout<<“Thisisaletter.”;elsecout<<“Thisisnotaletter.”;例10:少用否定条件if(!(char<’0’||char>’9’))if(char>=‘0’&&char<=‘9’)程序文档的例子/************************************************Modualname:gameserverFunction:gameserverforrealtimegameinformationprocessAuthor:chejinhuiCreatedate:2003/11/12Platform:IA32,WindowsModifylist:

2003/11/14line28">"shouldbe">="2003/11/15line29......***********************************************/程序文档的例子/*----------------------------------------------------------includestdio&socketlibarary-----------------------------------------------------------*/#include<iostream.h>#include<winsock2.h>

/*----------------------------------------------------------Globalvararea-----------------------------------------------------------*/

intiUserCount;程序文档的例子/*---------------------------------------------------InitializeSocketSubsysteminput:noneoutput:DLLinitializeresult0:faultother:success---------------------------------------------------*/7.2软件测试基础软件开发过程必须伴有质量保证活动。软件测试是软件质量保证的关键元素,代表了规约、设计和编码的最终检查。

软件产品最大的成本是检测软件错误、修正软件错误的成本。

在整个软件开发中,测试工作量一般占30%~40%,甚至≥50%。

在人命关天的软件(如飞机控制、核反应堆等)测试所花费的时间往往是其它软件工程活动时间之和的三到五倍软件是人编的—所以不完美实例:Intel的pentium处理器1994年浮点除法缺陷2000年8月28日,1.13MHZ处理器一个可能导致运行程序被挂起的执行指令问题1999年12月3日,美国航天局火星极地登陆飞船失踪1991年爱国者导弹防御系统系统时钟错误积累造成跟踪系统失去精确度千年虫,世界各地解决2000年错误超过数亿美元测试的定义:为了发现程序中的错误而执行程序的过程。具体地说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计出一批测试用例,并利用测试用例来运行程序,以发现程序错误的过程。软件测试中常见的错误类型按照错误的影响和造成的后果进行分类,可分为:较小错误,中等错误,较严重错误,严重错误,非常严重的错误,最严重的错误。按照软件生存周期各个阶段分类,可分为:问题定义错误、需求分析规格说明错误、设计错误、编码错误等等。这里重点介绍一种按照错误的性质和范围进行分类的方法,可以将错误分为如下几类:按照错误的性质和范围进行分类1.功能错误①需求规格说明错误。主要是指其中有错误、多余或遗漏的功能,有二义性或自相矛盾。②设计实现错误。设计或实现的功能不是规格说明或用户所要求的功能。按照错误的性质和范围进行分类2.系统错误①外部接口错误。如与打印机的接口错误。②内部接口错误。指各程序模块间的联系存在错误。如输入/输出、数据保护、子程序访问等。③硬件结构错误。如错误地理解I/O指令、中断处理、设备启动和初始化等而引起的错误。④软件结构错误。由于软件结构不合理或不清晰所引起的错误。往往在系统满载时才能发现。⑤操作系统错误。该类错误是由于不了解操作系统而引起的,操作系统本身也有错误。⑥控制与顺序错误。包括事件的时间顺序不正确、等待一个不可能发生的事件等等。⑦资源管理错误。既资源使用不当。资源死锁等。按照错误的性质和范围进行分类3.加工错误(算法错误)①计算与操作错误。指计算、函数求值和一般操作过程中的错误。②初始化错误。如忘记了初始化工作区、数据区,错误地对循环变量赋初值,不正确的初始化等等。③局部控制和次序错误。如遗漏路径、不可达到的代码段、循环嵌套或终止条件不正确、死循环等等。④逻辑错误。如多分支、判断条件不正确等。按照错误的性质和范围进行分类4.数据错误①动态数据错误。②静态数据错误。静态数据指直接或间接地出现在程序或数据库中的数据,其内容和格式都是固定的。因此在内容或格式上都可能存在错误。③数据内容错误。是指由于内容被破坏或被错误地解释而造成的错误。④数据结构错误。包括数据结构说明错误和数据结构使用错误。⑤数据属性错误。数据属性是指数据内容的含义或语义,如整数、字符等。数据属性错误是指对数据属性的错误解释和错误使用而导致的错误。按照错误的性质和范围进行分类5.代码错误代码错误主要包括语法错误、键入错误、对语句的理解错误等。例如,Myers(1976)指出,美国第一个去金星的太空任务的失败是由于在一个Fortrando循环中缺少一个逗号。7.2软件测试基础7.2.1软件测试的目标关于测试的一些规则:(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误的测试。由于测试的目标是暴露程序中的错误,从心理学角度看,由程序的编写者自己进行测试是不恰当的。因此,在综合测试阶段通常由其他人员组成测试小组来完成测试工作。“程序测试能证明错误的存在,但不能证明错误不存在.”

测试的目的是发现程序中的错误,是为了证明程序有错,而不是证明程序无错.预防错误:几乎不可实现唯一方法:发现错误为了能设计出有效的测试方案,主要的测试准则:(1)所有测试都应该能追溯到用户需求。正如上一小节讲过的,软件测试的目标是发现错误。从用户的角度看,最严重的错误是导致程序不能满足用户需求的那些错误。(2)应该远在测试开始之前就制定出测试计划。完成需求模型可着手制定测试计划,在建立了设计模型之后就可以立即开始设计详细的测试方案。(3)Pareto原理:测试发现的错误中的80%很可能是由程序中20%的模块造成的。当然,问题是怎样找出这些可疑的模块并彻底地测试它们。7.2.2软件测试准则(4)应该从“小规模”“大规模”测试。首先重点测试单个程序模块,然后把测试重点转向在集成的模块簇中寻找错误,最后在整个系统中寻找错误。(5)穷举测试是不可能的。所谓穷举测试就是把程序所有可能的执行路径都检查一遍的测试。此路不通!因此,测试只能证明程序中有错误,不能证明程序中没有错误。但是,精心地设计测试方案,有可能充分覆盖程序逻辑并使程序达到所要求的可靠性。(6)为了达到最佳的测试效果,应该由独立的第三方从事测试工作。7.2.2软件测试准则

用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。但这是不可能的。假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试:可能采用的测试数据组:232×232

=264

如果测试一组数据需要1毫秒,一年工作365×24小时,完成所有测试需5亿年。穷举测试是不现实的。如上图,设循环体应执行30次,循环体中有4个独立的分支,则最多有430≈1018个逻辑路径,假设每运行一个测试用例平均花费1毫秒,则需花费3千多万年。一般选用少量最有效的测试用例,以便覆盖每一个条件、每一个路径和每一个语句,从而以最少的代价发现尽可能多的错误。开始结束测试有两种方法,即黑盒测试和白盒测试:如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用——黑盒测试;如果知道产品的内部工作过程,可以通过测试来检验产品内部动作是否按照规格说明书的规定正常进行——白盒测试。7.2.3测试方法黑盒测试—闭着眼睛测试软件软件输入不深入代码细节的测试方法称为动态黑盒测试。软件测试员充当客户来使用它。输出白盒测试—带上X光眼镜测试软件??????????????3581322.293419985680302829734315250*(1+0.015)*((1+0.015)^360-1)/0.015250*(1+0.015)*((1+0.015)^360-1)/0.015假如知道一个盒子包含一台计算机,而另一个盒子是人用纸笔计算,就会选择不同的测试用例了解软件的运作方式会影响测试手段黑盒测试法把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。黑盒测试又称为功能测试。白盒测试法与黑盒测试法相反,它的前提是可以把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。白盒测试又称为结构测试。7.2.3测试方法黑盒测试与白盒测试比较

黑盒测试是从用户观点,按规格说明书要求的输入数据与输出数据的对应关系设计测试用例,是根据程序外部特征进行测试。

白盒测试是根据程序内部逻辑结构进行测试。黑盒测试与白盒测试优缺点比较

黑盒测试

白盒测试

优点缺点性质①适用于各阶段测试②从产品功能角度测试③容易入手生成测试数据①可构成测试数据使特定程序部分得到测试②有一定的充分性度量手段③可或较多工具支持①某些代码得不到测试②如果规格说明有误,则无法发现③不易进行充分性测试①不易生成测试数据(通常)②无法对未实现规格说明的部分进行测试③工作量大,通常只用于单元测试,有应用局限是一种确认技术,回答“我们在构造一个正确的系统吗?”是一种验证技术,回答“我们在正确地构造一个系统吗?”根据第4条测试准则,应该从“小规模”“大规模”测试,测试过程也必须分步骤进行。大型软件系统通常的测试过程基本上由下述几个步骤组成:模块测试模块测试的目的是保证每个模块作为一个单元能正确运行,所以模块测试通常又称为单元测试。在这个测试步骤中所发现的往往是编码和详细设计的错误。

子系统测试将若干经单元测试的模块放在一起形成一个子系统,进行的测试称为子系统测试。这个步骤着重测试模块的接口。7.2.4测试步骤

系统测试将经过测试的子系统装配成一个完整的系统来的测试。在这个过程中不仅应该发现设计和编码的错误,还应该验证系统确实能提供需求说明书中指定的功能,而且系统的动态特性也符合预定要求。在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明中的错误。不论是子系统测试还是系统测试,都兼有检测和组装两重含义,通常称为集成测试。7.2.4测试步骤验收测试验收测试内容与系统测试基本类似,但是它是在用户积极参与下进行的,而且可能主要使用实际数据(系统将来要处理的信息)进行测试。验收测试的目的是验证系统确实能够满足用户的需要,在这个测试步骤中发现的往往是系统需求说明书中的错误。验收测试也称为确认测试。7.2.4测试步骤平行运行平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。这样做的具体目的有如下几点:(1)可以在准生产环境中运行新系统而又不冒风险;(2)用户能有一段熟悉新系统的时间;(3)以验证用户指南和使用手册之类的文档;(4)能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。7.2.4测试步骤软件测试的过程被测模块单元测试设计信息集成测试被测模块单元测试被测模块单元测试测试过的模块确认测试系统测试软件需求其它系统元素装配好的软件确认的软件可运行的软件如图所示描绘了测试阶段的信息流,输入信息有两类:(1)软件配置,包括需求说明书、设计说明书和源程序清单等;(2)测试配置,包括测试计划和测试方案(测试用例、预定要检验的功能以及预期的正确输出);比较测试的实际结果和预期结果,若两者不一致则很可能是程序中有错误。设法确定错误的准确位置并且改正它,这就是调试的任务。与测试不同,通常由程序的编写者负责调试。7.2.5测试阶段的信息流如果出现要求修改设计的严重错误,软件的质量和可靠性是值得怀疑的,应该进一步仔细测试;同上述相反,功能完成得很正常,遇到的错误也很容易改正,则仍然应该考虑两种可能:(1)软件的可靠性是可以接受的;(2)所进行的测试尚不足以发现严重的错误。这些错误最终将被用户发现,而且需要在维护阶段改正它们(但是改正同一个错误需要付出的代价比在开发阶段高出许多倍)。7.2.5测试阶段的信息流.7.3单元测试单元测试:测试模块。单元测试和编码属于软件过程的同一个阶段。在编写出源程序代码并通过了编译程序的语法检查之后,就可以用详细设计作指南,对重要的执行通路进行测试,以便发现模块内部的错误。可用人工测试和计算机测试两种测试方法,完成单元测试工作。单元测试主要使用白盒测试技术,而且对多个模块的测试可以并行地进行。模块错误处理模块接口局部数据结构重要的执行路径边界条件单元测试着重从5个方面对模块进行测试:1.模块接口首先应该对通过模块接口的数据流进行测试,主要检查下述几个方面:参数的数目、次序、属性或单位系统与变元是否一致;是否修改了只作输入用的变元;全局变量的定义和用法在各个模块中是否一致。7.3.1测试重点2.局部数据结构对于模块来说,局部数据结构是常见的错误来源。应该仔细设计测试方案,以便发现局部数据说明、初始化、默认值等方面的错误。3.重要的执行通路由于通常不可能进行穷尽测试,因此,在单元测试期间选择最有代表性、最可能发现错误的执行通路进行测试就是十分关键的。应该设计测试方案用来发现由于错误的计算、不正确的比较或不适当的控制流而造成的错误。7.3.1测试重点4.出错处理通路好的设计适当的处理错误的通路。应该认真测试这种通路。当评价出错处理通路时,应该着重测试下述一些可能发生的错误:(1)对错误的描述是难以理解的;(2)记下的错误与实际遇到的错误不同;(3)在对错误进行处理之前,错误条件已经引起系统干预;(4)对错误的处理不正确;(5)描述错误的信息不足以帮助确定造成错误的位置。7.3.1测试重点5.边界条件边界测试是单元测试中最后的也可能是最重要的任务。使用刚好小于、刚好等于和刚好大于最大值或最小值的数据结构、控制量和数据值的测试方案,非常可能发现软件中的错误。7.3.1测试重点代码审查即人工测试源程序,由审查小组正式进行,它是一种非常有效的程序验证技术,对于典型的程序来说,可以查出30%~70%的逻辑设计错误和编码错误。审查小组最好由下述4人组成:(1)组长,应该是一个很有能力的程序员,而且没有直接参与这项工程;(2)程序的设计者;(3)程序的编写者;(4)程序的测试者。7.3.2代码审查审查之前,小组成员应该先研究设计说明书,力求理解这个设计。一般先由设计者扼要地介绍他的设计,再由程序的编写者解释他是怎样用程序代码实现这个设计的,小组其他成员仔细倾听并力图发现其中的错误。另外一项工作,是对照程序设计常见错误清单,分析审查这个程序。当发现错误时由组长记录下来,审查会继续进行(审查小组的任务是发现错误而不是改正错误)。7.3.2代码审查代码审查比计算机测试优越的是:一次审查会上可以发现许多错误。实践表明,对于查找某些类型的错误来说,人工测试比计算机测试更有效;对于其他类型的错误来说则刚好相反。因此,人工测试和计算机测试是互相补充,相辅相成的,缺少其中任何一种方法都会使查找错误的效率降低。7.3.2代码审查代码审查的主要项目变量交叉引用表标号交叉引用表子程序、宏、函数等价性检查常量检查标准检查风格检查比较控制流程序的规格说明7.3.2代码审查7.3.2代码审查代码审查的规则代码缺陷审查表………..命名规则程序版式文件结构结论审查项重要性7.3.2代码审查单元测试必须为每个单元测试开发驱动软件和(或)存根软件。通常驱动程序也就是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果。存根程序代替被测试的模块所调用的模块。因此存根程序也可以称为“虚拟子程序”。它使用被它代替的模块的接口,可能做最少量的数据操作,印出对入口的检验或操作结果,并且把控制归还给调用它的模块。7.3.3计算机测试.7.4集成测试集成测试是测试和组装软件的系统化技术,有同子系统测试,主要目标是发现与接口有关的问题。例如:数据穿过接口时可能丢失;一个模块对另一个模块可能由于疏忽而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有问题等等。不幸的是,可能发生的接口问题多得不胜枚举。由模块组装成程序时有两种方法:非渐增式测试方法:这种方法是先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序进行测试;渐增式测试方法:是把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。这两种方法哪种更好一些呢?下面对比它们的主要优缺点:7.4集成测试7.4集成测试非渐增式测试一下子把所有模块放在一起,极端困难,难于定位,难于改正。渐增式测试比较容易定位和改正错误;对接口可以进行更彻底的测试;可以使用系统化的测试方法。因此,目前在进行集成测试时普遍采用渐增式测试方法。当使用渐增方式把模块结合到程序中去时,有自顶向下和自底向上两种集成策略。7.4.1自顶向下集成①以主控模块作为驱动模块,其直接调用的下属模块都用“桩模块”代替;②依据所选用的集成策略(深度优先或广度优先)所规定的次序,每次只用一个实际模块替代一个对应的桩模块;③每结合进一个模块立即测试一遍;④为了检测加入新模块是否引入了新的错误,每次都需要进行回归测试(即部分或全部地重复以前做过的测试)。重复执行步骤②、③、④,每重复一次,增加一个模块,直至构造起整个软件结构为止。第2步:根据深度优先或宽度优先的策略,每次用一个实际模块代换一个stub。第3步:在结合进一个模块的同时进行测试。MS1S2M1S3S4M2S2第4步:回归测试(regressiontesting)——全部或部分地重复以前做过的测试。第1步:测试顶端模块,用存根程序(stub)代替直接附属的下层模块

图:被测软件系统结构图深度优先策略:①以M1作为驱动模块,首先将模块M2加入其中,此时模块M3、M4、M5、M6分别以桩模块S3、S4、S5、S6代替,于是对由M1、M2、S3、S4、S5、S6组成的子系统测试一遍;M1M2M4M5M6M7M8M3M1M2S4S3S5S6深度优先策略:②用M5代替S5,并将M8用桩模块S8代替,对由M1、M2、M5、S3、S4、S8、S6组成的子系统再测试一遍;M1M2M4M5M6M7M8M3M1M2S4S3M5S6S8深度优先策略:③用M8代替S8,对由M1、M2、M5、M8、S3、S4、、S6组成的子系统再测试一遍;M1M2M4M5M6M7M8M3M1M2S4S3M5S6M8深度优先策略:④用M6代替S6,对由M1、M2、M5、M8、M6、S3、S4组成的子系统再测试一遍;M1M2M4M5M6M7M8M3M1M2S4S3M5M6M8深度优先策略:⑤用M3代替S3,并以S7代替M7,对由M1、M2、M5、M8、M6、M3、S7、S4组成的子系统再测试一遍;M1M2M4M5M6M7M8M3M1M2S4M3M5M6M8S7深度优先策略:⑥用M7代替S7,对由M1、M2、M5、M8、M6、M3、M7、S4组成的子系统再测试一遍;M1M2M4M5M6M7M8M3M1M2S4M3M5M6M8M7深度优先策略:⑦用M4代替S4,对由M1、M2、M5、M8、M6、M3、M7、M4组成的子系统再测试一遍;至此,整个系统测试完。M1M2M4M5M6M7M8M3M1M2M4M3M5M6M8M7自顶向下集成的优缺点自顶向下集成的特点是不需要驱动模块,但需要大量的桩模块。优点是能够尽早地验证程序的主要控制和判断机制,可以较早发现此类错误,从而减少以后的返工。缺点是在测试较高层模块时,低层模块采用较简单的桩模块来代替,不能反映实际情况,测试可能不充分。7.4.2自底向上集成即从程序结构的最底层模块开始组装和测试。这种测试需要一定数量的驱动模块,而不需要桩模块。自底向上集成测试的具体步骤:①把低层模块组织成实现某个特定的软件子功能的模块群(modulecluster);②为每一个模块群开发一个驱动模块,控制测试数据的输入和测试结果的输出;③对每个模块群进行测试;④去掉测试用的驱动模块,用较高层模块将几个模块群组成新的更大的模块群。上述的②、③、④步重复执行,直至整个程序构造完毕。自底向上集成Bottom-uptesting第1步:把低层模块组合成族,每族实现一个子功能。第2步:用驱动程序(Driver)协调测试数据的I\O,测试子功能族。DM1M2第3步:去掉Driver,自下而上把子功能族合成更大的子功能族。MMMMMMMMMMMMDDDDDD注意:两种策略的优、缺点刚好互补,但单用其中任一种都不实际,通常根据软件的特点将二者混用。7.4.2自底向上集成.自底向上集成优缺点优点:①只需设计驱动模块,不需要设计桩模块,测试用例的设计也相对简单。②由于涉及到复杂算法和直接输入输出的模块最先得到组装和测试,可以在早期解决这些最容易出问题的部分;③自底向上集成可以实施多个模块并行测试。缺点:对高层控制与判断进行测试的时间较晚,如果到测试的后期才发现整体存在较严重问题,就不得不进行较大的返工,此时代价将是巨大的。.7.4.3不同集成测试策略的比较集成测试策略非渐增式渐增式自顶向下自底向上深度优先宽度优先.不同集成测试方法的比较:方法优点缺点非渐增式没有错误隔离手段主要设计错误发现迟潜在可重用代码测试不充分需要驱动程序和存根程序自顶向下具有错误隔离手段主要设计错误发现早不需要驱动程序潜在可重用代码测试不充分需要存根程序自底向上具有错误隔离手段潜在可重用代码能充分测试不需要存根程序主要设计错误发现迟需要驱动程序混合具有错误隔离手段主要设计错误发现早潜在可重用代码能充分测试.混合策略:改进的自顶向下测试方法基本上使用自顶向下的测试方法,但是在早期使用自底向上的方法测试软件中的少数关键模块。能在测试的早期发现关键模块中的错误;测试关键模块时需要驱动程序。混合法对软件结构中较上层使用的自顶向下方法与对软件结构中较下层使用的自底向上方法相结合。兼有两种方法的优缺点,当被测试的软件中关键模块比较多时,这种混合法可能是最好的折衷方法。.7.4.4回归测试回归测试是指重新执行已经做过的测试的某个子集,以保证测试过程中的变化没有带来非预期的副作用。回归测试就是用于保证由于调试或其他原因引起的变化,不会导致非预期的软件行为或额外错误的测试活动。回归测试可以通过重新执行全部测试用例的一个子集人工地进行,也可以使用自动化的捕获回放工具自动进行。

.7.5确认测试确认测试也称为验收测试,它的目标是验证软件的有效性。那么,什么样的软件才是有效的呢?软件有效性的一个简单定义是:如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的。需求分析阶段产生的软件需求规格说明书,准确地描述了用户对软件的合理期望,因此是软件有效性的标准,也是进行确认测试的基础。确认测试必须有用户积极参与,或者以用户为主进行。确认测试(有效性测试)(验收测试)有效性测试软件配置审查管理机构裁决选择测试人员软件计划用户文档开发文档源程序文本支持环境交用户运行维护测试报告软件配置构造测试用例实际运行测试专家鉴定会验收测试需要采用一系列的黑盒测试来完成。参加人员有:专门的测试人员,必须有用户或客户参加。文档:需求规格说明书、用户手册等,应事先制定测试计划,确定测试的种类、测试进度、设计具体的测试用例。软件验收测试的中心任务是测试软件是否满足合同规定的所有功能和性能,文档资料是否齐全,人机界面以及可移植性、兼容性、可维护性、容错能力等方面是否达到了用户的期望。经过验收测试后,其结果可能是以下两种情况之一:

1)功能、性能等各项指标满足需求规格说明的要求,用户可以接受;

2)功能、性能等各项指标不满足需求规格说明的全部要求,用户不能接受。对于第二种结果,应提交一份问题分析报告。确认测试通常使用黑盒测试法。应该仔细设计测试计划和测试过程,保证软件能满足所有功能要求,能达到每个性能要求,文档资料是准确而完整的,此外,还应该保证软件能满足如安全性、可移植性、兼容性和可维护性等的要求。7.5.1确认测试的范围确认测试的一个重要内容是复查软件配置。复查的目的是保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,具有完成软件维护所必须的细节,而且已经编好目录。7.5.2软件配置复查Alpha测试由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试。开发者负责记录发现的错误和使用中遇到的问题。总之,Alpha测试是在受控的环境中进行的。Beta测试由软件的最终用户们在一个或多个客户场所进行,开发者通常不在Beta测试的现场。用户记录在Beta测试过程中遇到的问题,并且定期把这些问题报告给开发者。接收到在Beta测试期间报告的问题之后,开发者对软件产品进行必要的修改,并准备向全体客户发布最终的软件产品。7.5.3Alpha和Beta测试.测试阶段主要依据测试人员测试方式主要测试内容单元测试系统设计文档开发小组白盒测试接口测试路径测试子系统测试系统设计文档需求文档独立测试小组白盒测试黑盒测试接口测试路径测试功能测试性能测试系统测试需求文档独立测试小组黑盒测试功能测试健壮性测试性能测试用户界面测试安全性测试压力测试可靠性测试安装/反安装测试验收测试需求文档用户黑盒测试测试总结:.1.接口测试每个接口可能有多个输入参数,每个参数有“典型值”、“边界值”、“异常值”之分。根据接口的定义,可以推断某种输入应当产生什么样的输出。输出包括函数的返回值和输出参数。观察是否有程序语句从来没有被执行过。要特别留意函数体内的错误处理程序块。

.2.路径测试想遍历测试几乎是不可能的,不测试或者胡乱找几条路径测试却又不行。输入与对应的输出之间的路径是唯一的。由于接口测试时的输入是有代表性的,因此相应的路径也具有代表性。路径测试检查表:数据类型、变量值、逻辑判断、循环、内存管理、文件I/O、错误处理。.3.功能测试功能测试的基本方法是构造一些合理输入(在需求范围之内),检查输出是否与期望相同。功能测试有两种比较好的测试方法:等价划分法和边界值分析法。等价划分是指把输入空间划分为几个“等价区间”,在每个“等价区间”中只需要测试一个典型值就可以了。边界值测试法是对等价划分法的补充。除了典型值外还要用边界值作为测试用例。

.4.健壮性测试健壮性是指在异常情况下,软件能正常运行的能力。健壮性有两层含义:容错能力。容错性测试通常构造一些不合理的输入来引诱软件出错。恢复能力。恢复测试重点考察以下几项:系统能否重新运行;有无重要的数据丢失;是否毁坏了其它相关的软件硬件。

.5.性能测试性能测试即测试软件处理事务的速度,一是为了检验性能是否符合需求,二是为了得到某些性能数据供人们参考。有时人们关心测试的“绝对值”。有时人们关心测试的“相对值”。

.6.用户界面测试绝大多数软件拥有图形用户界面。图形用户界面的测试重点是正确性、易用性和视觉效果。在评价易用性和视觉效果时,主观性非常强,应当考虑多个人的观点。

.7.信息安全测试信息安全性是指防止系统被非法入侵的能力,既属于技术问题又属于管理问题。信息安全性测试有如下步骤:为非法入侵设立目标;邀请(或悬赏)一些人扮演黑客,让他们想尽办法入侵系统,实现“目标”。如果有人成功了,请他详述入侵的过程。.8.压力测试压力测试也叫负荷测试,即获取系统能正常运行的极限状态。压力测试的主要任务是:构造正确的输入,使劲折腾系统却让它刚好不瘫痪。压力测试的一个变种是敏感测试。敏感测试目的是发现什么样的输入可能会引发不稳定现象。

.9.可靠性测试可靠性是指在一定的环境下、给定的时间内、系统不发生故障的概率。软件可靠性测试可能会花费很长时间。比较实用的办法是,让用户使用该系统,记录每一次发生故障的时刻。计算出相邻故障的时间间隔,注意要去掉非工作时间。统计出不发生故障的“最小时间间隔”、“最大时间间隔”和“平均时间间隔”。

.10.安装/反安装测试目前市面上有非常流行的、专门制作安装/反安装程序的一些工具,如InstallShelled。主要测试工作:至少在标准配置和最低配置两种环境下测试;如果有安装界面,应当尝试各种选项,如选择“全部”、“部分”、“升级”等。

.7.6白盒测试技术软件测试方法分为两类:静态分析、动态测试。一、静态分析方法指以人工的、非形式化的方法对程序进行分析和测试。桌前检查(DeskChecking):由程序员检查自己的程序,对源代码进行分析、检验。代码会审(CodeReadingReview):由程序员和测试员组成评审小组,按照“常见的错误清单”,进行会议讨论检查。步行检查(Walkthroughs):与代码会审类似,也要进行代码评审,但评审过程主要采取人工执行程序的方式,故也称为“走查”。通过选择适当的测试用例,执行程序。常用的方法:1、白盒法分析程序的内部逻辑结构,注意选择适当的覆盖标准,设计测试用例,对主要路径进行尽可能多的测试。2、黑盒法不考虑程序的内部结构与特性,只根据程序功能或程序的外部特性设计测试用例。二、动态测试方法7.6.1逻辑覆盖白盒法又称为逻辑覆盖法,其测试用例选择,是按照不同覆盖标准确定的。语句覆盖判定覆盖条件覆盖判定条件覆盖条件组合覆盖弱强路径覆盖例:用白盒法测试以下程序段:Procedure(VARA,B,X:REAL);BEGINIF(A>1)AND(B=0)THENX:=X/A;IF(A=2)OR(X>1)THENX:=X+1END;1)选择逻辑覆盖标准。2)按照覆盖标准列出所有情况。3)选择确定测试用例。4)验证分析运行结果与预期结果。白盒法步骤:Procedure(VARA,B,X:REAL);BEGINIF(A>1)AND(B=0)THENX:=X/A;IF(A=2)OR(X>1)THENX:=X+1END;

A>1

AND

B=0X:=X/A

A=2

OR

X>1X:=X+1YNYN白盒法举例:画出程序流程图问题:若AND错写为OR,或X>1错写为X<1,则错误无法由上例测出。入口A>1ANDB=0TA=2ORX>1TX=X/AX=X+1返回FFTestcase:A=2,B=0,X=4.

1、语句覆盖(Statementcoverage):

每个语句至少执行一次。语句覆盖是较弱的覆盖判定覆盖仍然是较弱的覆盖2、判定覆盖(Branchcoverage):在1的基础上每个判定的每个分支至少执行一次Testcases:①A=3,B=0,X=3②A=2,B=1,X=1问题:若X>1错写为X<1,仍然无法被测出。入口A>1ANDB=0TA=2ORX>1TX=X/AX=X+1返回FF3、条件覆盖(Conditioncoverage):在1的基础上,使每个判定表达式的每个条件都取到各种可能的结果。Testcases:①A=2,B=0,X=4(满足A>1,B=0;A=2,X>1)②A=1,B=1,X=1(满足A1,B0;A2,X1)问:条件覆盖?判定覆盖

答:不一定。反例:①A=2,B=0,X=1②A=1,B=1,X=2

4、判定/条件覆盖:即判定覆盖条件覆盖

入口A>1ANDB=0TA=2ORX>1TX=X/AX=X+1返回FF 同时满足判断覆盖和条件覆盖。4、判定/条件覆盖Testcases:①A=2,B=0,X=4(满足A>1,B=0;A=2,X>1)②A=1,B=1,X=1(满足A1,B0;A2,X1)入口A>1ANDB=0TA=2ORX>1TX=X/AX=X+1返回FF这两组测试数据就是满足条件测试的两组数据,故判定/条件测试覆盖并不比条件测试强!5、条件组合覆盖:每个判定表达式中条件的各种可能组合都至少出现一次。入口A>1ANDB=0TA=2ORX>1TX=X/AX=X+1返回FF全部可能的条件组合为:①A>1,B=0②A>1,B0③A1,B=0④A1,B0⑤A=2,X>1⑥A=2,X1⑦A2,X>1⑧A2,X1Testcases:①A=2,B=0,X=4(TT)②A=2.B=1,X=1(FT)③A=1,B=0,X=2(FT)④A=1,B=1,X=1(FF)问题:没有测试到(TF)的情形考察controlflowgraph的角度,还可考虑下述覆盖:

6.点覆盖

7.边覆盖=语句覆盖8.路径覆盖(Pathcoverage):

每条可能的路径都至少执行一次,若图中有环,则每个环至少经过一次。=判定覆盖Testcases:①A=1,B=1,X=1②A=1,B=1,X=2③A=3,B=0,X=1④A=2,B=0,X=49.路径覆盖条件组合覆盖三角形问题使用基本路径设计测试用例方法推导三角形问题的测试用例81-8687889299-10093102959697-9889-9094三角形问题环复杂度环复杂度闭合区域的数目=5二值判定节点个数+1=4+1=5边的数目-节点的数目+2=15-12+2=581-8687889299-10093102959697-9889-9094基本路径和测试用例(1)基本路径和测试用例81-86->87->88->92->93->95->97-98->102相应的测试用例:测试输入=(68,68,56)预期结果=这是一个等腰三角形!81-86->87->88->92->93->95->96->102相应的测试用例:测试输入=(68,60,56)预期结果=这是一个不等边三角形!81-8687889299-10093102959697-9889-9094基本路径和测试用例81-86->87->88->92->93->94->102相应的测试用例:测试输入=(68,68,68)预期结果=这是一个等边三角形!81-86->87->89-90->92->99-100->102相应的测试用例:测试输入=(68,8,60)预期结果=这不是一个三角形!基本路径和测试用例(2)81-8687889299-10093102959697-9889-90947.6.2控制结构测试一、基本路径测试基本路径测试是TomMcCabe提出的一种白盒测试技术。使用这种技术设计测试用例时,首先计算过程设计结果的逻辑复杂度,并以该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取true(真)和false(假)值。使用基本路径测试技术设计测试用例的步骤如下。基本路径测试法通过分析由控制构造的环路的复杂性,导出基本路径集合,从而设计测试用例,保证这些路径至少通过一次。基本路径测试步骤:导出程序流程图的拓扑结构-流图程序图)

计算流图G的环路复杂度V(G)

确定只包含独立路径的基本路径集设计测试用例独立路径独立路径:至少沿一条新的边移动的路径1762,38910114,5路径1:1-11路径2:1-2-3-4-5-10-1-11路径3:1-2-3-6-8-9-10-1-11路径4:1-2-3-6-7-9-10-1-11对以上路径的遍历,就是至少一次地执行了程序中的所有语句。【例】试用基本路径测试法对如下的PDL描述或如下图所示的程序流程图设计测试用例。该例子描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。PROCEDUREaverageINTERFACERETURNSaverage,sum,n1;*n1为有效成绩的个数。*

INTERFACEACCEPTSscore;

TYPEscore[1,50]ISSCALARARRAY;

TYPEaverage,n1,n2,sumISSCALAR;*n2为输入值的个数。*

TYPEiISINTEGER;

i=1;n1=n2=0;sum=0;

DOWHILE(score[i]<>–1)AND(n2<50)

n2加1;

IF(score[i]>=0)AND(score[i]<=100)

THENn1加1;

sum=sum+score[i];

ENDIF;

i加1;

ENDDO;

IFn1>0THENaverage=sum/n1;

ELSEaverage=–1;

ENDIF;ENDaverage过程average的程序流程图开始

i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112解:可按如下步骤设计测试用例:步骤1:根据详细设计或代码导出过程average的流图。共有16条边

6个区域

12个结点

5个判定123456789111012R1R2R3R4R5R6步骤2:据流图确定环形复杂性度量V(G):1)V(G)=E–N+2=16–12+2=6;其中E为流图中的边数,N为结点数;2)V(G)=6(个区域);3)V(G)=P+1=5+1=6;其中P为判定结点的个数。在流图中,结点2、3、5、6、9是判定结点。步骤3:确定基本路径集合(即独立路径集合)。一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。于是可确定6条独立的路径:路径1:1—2—9—10—12路径2:1—2—9—11—12路径3:1—2—3—9—10—12路径4:1—2—3—4—5—8—2…路径5:1—2—3—4—5—6—8—2…路径6:1—2—3—4—5—6—7—8—2…步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。1)路径1的测试用例:

score[k]=有效分数值,当k<i;

score[i]=–1,2≤i≤50;期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。2)路径2的测试用例:

score[1]=–1;期望的结果:average=–1,其他量保持初值。3)路径3的测试用例:输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数;期望结果:n1=50、且算出正确的总分和平均分。4)路径4的测试用例:

score[i]=有效分数,当i<50;

score[k]<0,k<i;期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。5)路径5的测试用例:

score[i]=有效分数,当i<50;

score[k]>100,k<i;期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。6)路径6的测试用例:

score[i]=有效分数,当i<50;期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。二、条件测试条件测试是检查程序模块中所包含逻辑条件的测试用例设计方法主要用于测试程序中条件错误和程序的其他错误一般的说,如果程序的测试集能够有效地检测程序中的条件错误,则该测试集可能也会有效地检测程序中的其他错误条件测试策略主要优点条件测试的覆盖率计算相对简单程序的条件测试覆盖率为产生另外的程序测试提供了指导条件式分析一个简单条件是一个布尔变量或一个可能带有NOT操作符的关系表达式,形式为:

E1<关系操作符>E2

其中E1和E2是算术表达式,而<关系操作符>是下列之一: “<”、“≤”、“=”、“≠”(“!=”)、“>”、或“≥”复杂条件由简单条件、布尔操作符和括弧组成设可用于复杂条件的布尔算子包括OR,AND和NOT,不含关系表达式的条件称为布尔表达式。所以条件的成分类型包括:布尔操作符布尔变量布尔括弧(括住简单或复杂条件)关系操作符或算术表达式条件式错误如果条件不正确,则至少有一个条件成分不正确条件错误一般有以下类型布尔操作符错误布尔变量错误布尔括弧错误关系操作符错误算术表达式错误三、循环测试1)对于最多为n次的单循环,可设计测试用例实现下列测试:①跳过循环,即一次也不执行;②仅循环1次;③循环2次;④循环m次,m<n;⑤分别循环n–1次,n次,n+1次。2)对于嵌套循环的测试:①从最内层循环开始测试,此时外层循环都取最小值,对内层进行单循环的测试;②向外退一层进行测试,此时其内层循环取一些典型值,其外层循环仍取最小值;③继续向外层扩展,直至测试完成。7.7黑盒测试技术等价分类法边值分析法不考虑程序的内部结构与特性,只根据程序功能或程序的外部特性设计测试用例。主要是测试软件是否满足功能需求。黑盒测试主要测试的错误类型有:①不正确或遗漏的功能;②接口错误;③性能错误;④数据结构或外部数据访问错误;⑤初始化或终止条件错误等等。黑盒测试设计测试用例的方法:等价类的划分、边界值分析、错误推测、组合数据测试等。黑盒测试主要应考虑问题:1)怎样测试功能的有效性?2)那些类型的输入可构成好的测试用例?3)系统是否对特定的输入值特别敏感?4)怎样划分数据类的边界?5)系统能够承受什么样的数据率和数据量?6)数据的特定组合对系统运行产生什么影响?黑盒测试测试标准:测试用例尽可能少;一个测试用例能指出一类错误。7.7.1等价划分等价划分是一种黑盒测试技术,把程序的输入域划分成若干个数据类,据此导出测试用例。等价划分法力图设计出能发现若干类错误的测试用例,从而减少测试用例的数目。

每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。使用等价划分法设计测试方案首先需要划分输入数据的等价类。常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。等价类划分的启发式规则:如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值);例输入值是学生成绩,范围是0~1000100

有效等价类1≤成绩≤100无效等价类成绩>100

无效等价类成绩<0等价类划分的启发式规则:如果规定了输入数据的个数,则类似地也可划分出一个有效的等价类和两个无效的等价类;如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值);例:输入条件说明学历可为:专科、本科、硕

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论