资源描述
,*,单击此处编辑母版标题样式,软件工程 - 2010 - 第七章 实现,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第七章,实现,1,软件工程 - 2010 - 第七章 实现,第七章内容概要,编码,软件测试基础,单元测试,集成测试,确认测试,白盒测试技术,黑盒测试技术,调试,软件可靠性,2,软件工程 - 2010 - 第七章 实现,编码和测试统称为实现,编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。,软件测试很重要,它对软件可靠性的影响巨大,软件测试在软件生命周期中横跨两个阶段,测试工作量占软件开发总成本的,40%,以上,测试的目标是发现错误,调试的目的是诊断并改正错误,测试是确定可靠性模型的依据,实现概述,3,软件工程 - 2010 - 第七章 实现,编码阶段的任务是把详细设计阶段中用,伪代码,写成的程序转换成用程序设计语言实现的程序。,程序设计语言的,特性,和程序设计,风格,会深刻地影响软件的质量和可维护性。,为保证编码的质量,程序员必须深刻理解、熟练掌握并正确地运用程序设计语言的特性。此外,还要求源程序具有良好的结构性和良好的程序设计风格。,从设计向编码过渡,4,软件工程 - 2010 - 第七章 实现,系统用户的要求。,可以使用的编译程序。,可以得到的软件工具。,工程规模。,程序员的知识。,软件可移植性要求。,软件的应用领域。,选择程序设计语言的实用标准,5,软件工程 - 2010 - 第七章 实现,好程序的代码逻辑简明清晰、易读易懂,:,程序的内部文档,数据说明,语句构造,输入输出方法,效率问题,编码风格,6,软件工程 - 2010 - 第七章 实现,标识符的命名,:,标识符即符号名,包括模块名、变量名、常量名、标号名、子程序名、数据区名以及缓冲区名等。,这些名字应能反映它所代表的实际东西,应有一定实际意义。,(,例如,表示次数的量用,Times,,表示总量的用,Total,,表示平均值的用,Average,,表示和的量用,Sum,等。,),名字不是越长越好,应当选择精炼的意义明确的名字。,必要时可使用缩写名字,但这时要注意缩写规则要一致,并且要给每一个名字加注释。,在一个程序中,一个变量只应用于一种用途。,编码风格:程序的内部文档,7,软件工程 - 2010 - 第七章 实现,程序的注解,:,夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。,注释决不是可有可无的。,一些正规的程序文本中,注释行的数量占到整个源程序的,1,3,到,1,2,,甚至更多。,注释分为,序言性注释,和,功能性注释,。,编码风格:程序的内部文档,8,软件工程 - 2010 - 第七章 实现,序言性注释:,通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。,有关项目包括:,程序标题;,有关本模块功能和目的的说明;,主要算法;,接口说明:包括调用形式,参数描述,子程序清单;,有关数据描述:重要的变量及其用途,约束或限制条件,以及其它有关信息;,模块位置:在哪一个源文件中,或隶属于哪一个软件包;,开发简历:模块设计者,复审者,复审日期,修改日期及有关说明等。,编码风格:程序的内部文档,9,软件工程 - 2010 - 第七章 实现,功能性注释,:,功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在,做什么工作,,或是执行了下面的语句会怎么样。而,不要解释下面怎么做,。,编码风格:程序的内部文档,10,软件工程 - 2010 - 第七章 实现,视觉组织,:,空格、空行和缩进。,恰当地利用空格,可以突出运算的优先性。,自然的程序段之间可用空行隔开。,缩进也叫做向右缩格或移行。它是指程序中的各行不必都在左端对齐,都从第一格起排列。这样做使程序完全分不清层次关系。,对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。使程序的逻辑结构更加清晰。,编码风格:程序的内部文档,11,软件工程 - 2010 - 第七章 实现,在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格,。,为了使程序中数据说明更易于理解和维护,必须注意以下几点,:,数据说明的次序应当规范化;,说明语句中变量安排有序化;,使用注释说明复杂数据结构。,编码风格:数据说明,12,软件工程 - 2010 - 第七章 实现,数据说明的次序应当规范化:,数据说明次序规范化,使数据属性容易查找,也有利于测试,排错和维护,。,原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护的需要,最好使其规范化,使说明的先后次序固定,。,例如,在类型说明中可按如下顺序排列:,整型量说明,实型量说明,字符量说明,逻辑量说明,编码风格:数据说明,13,软件工程 - 2010 - 第七章 实现,说明语句中变量安排有序化,:,当多个变量名在一个说明语句中说明时,应当对这些变量按字母的顺序排列。 例如,把,integer size, length, width, cost, price,写成,integer cost, length, price , size, width,编码风格:数据说明,14,软件工程 - 2010 - 第七章 实现,使用注释说明复杂数据结构,:,如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的特点。,例如,对,C,的链表结构和,Pascal,中用户自定义的数据类型,都应当在注释中做必要的补充说明。,编码风格:数据说明,15,软件工程 - 2010 - 第七章 实现,在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单、直接,不能为了片面追求效率而使语句复杂化。,下面是关于语句构造的一些启发规则:,编码风格:语句构造,16,软件工程 - 2010 - 第七章 实现,1.,在一行内只写一条语句。,2.,避免采用过于复杂的条件测试。,3.,尽量减少 “非”条件的测试。,IF NOT (CHAR9) THEN ,IF (CHAR=0) AND (CHAR=9) THEN ,4.,避免大量使用循环嵌套和条件嵌套。,5.,利用括号使逻辑表达式或算术表达式的运算次序清晰直观。,编码风格:语句构造,17,软件工程 - 2010 - 第七章 实现,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;,18,软件工程 - 2010 - 第七章 实现,7.程序要能直截了当地说明程序员的用意。,对比下面两个程序段,哪个更直接地表达了自己的意图?,编码风格:语句构造,for ( i = 1; i = n; i+ ) for ( j = 1; j = n; j+ ),Vij,=,(,ij,) * (,ji,),for ( i1; i = n; i+ ) for ( j1; j =A) THEN,IF (CHAR=Z) THEN,PRINT “This is a letter.”,ELSE,PRINT “This is not a letter.”,15.,不要单独进行浮点数的比较,而是采用,|x0-x1|1 and B=0,X=X/A,A=2 or X1,X=X+1,入口,返回,s,(2,0,4),(2,0,3)sacbed,!判断,a,中,and-or,判断,b,中,or-and,89,软件工程 - 2010 - 第七章 实现,判定覆盖,判定覆盖又叫分支覆盖,它的含义是,不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次。,换言之,就是设计若干个测试用例,运行被测程序,使得程序中每个判定的取真分支和取假分支至少经历一次。,90,软件工程 - 2010 - 第七章 实现,e,c,F,F,d,T,T,b,a,A1 and B=0,X=X/A,A=2 or X1,X=X+1,入口,返回,s,(2,0,4),(2,0,3) sacbed,(1,1,1),(1,1,1) sabd,(3,0,3),(3,0,1) sacbd,(2,1,1),(2,1,2) sabed,!判断,2,中,x1,错写成,x1,,,A1,,,B,0,,,B0,在,b,点有下述各种结果出现:,A,2,,,A2,,,X1,,,X1,只需要使用下面两组测试数据就可以达到上述覆盖标准:,I,A,2,,,B,0,,,X,4,(,满足,Al,,,B,0,,,A,2,和,Xl,的条件,执行路径,sacbed),A,l,,,B,1,,,X,1,(,满足,A1,,,B0,,,A2,和,X1,的条件,执行路径,sabd),93,软件工程 - 2010 - 第七章 实现,e,c,F,F,d,T,T,b,a,A1 and B=0,X=X/A,A=2 or X1,X=X+1,入口,返回,s,94,软件工程 - 2010 - 第七章 实现,e,c,F,F,d,T,T,b,a,A1 and B=0,X=X/A,A=2 or X1,X=X+1,入口,返回,s,(2,1,1),(2,1,2),满足:,A1,B,0,A,=,2,X,1,(1,0,2),(1,0,3),满足:,A,1,B=0,A,2,X1,!条件覆盖通常比判定覆盖强,但也可能,满足条件覆盖标准而并不满足判定覆盖标准,95,软件工程 - 2010 - 第七章 实现,判定,/,条件覆盖,选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。,96,软件工程 - 2010 - 第七章 实现,e,c,F,F,d,T,T,b,a,A1 and B=0,X=X/A,A=2 or X1,X=X+1,入口,返回,s,(2,0,4),(2,0,3),执行路径,sacbed,,,满足条件,:,A1,B=0,A=2,X1,判定,a,为真,,判定,b,为真,(1,1,1),(1,1,1),执行路径,sabd,,,满足条件,:,A1,B0,A2,X1,,,判定,a,为假,判定,b,为假,!由于条件隐藏,使得逻辑表达式中的错误不一定都能查得出来。,97,软件工程 - 2010 - 第七章 实现,条件组合覆盖,条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判定中条件的所有可能组合至少出现一次。,98,软件工程 - 2010 - 第七章 实现, A1, B0, A1, B0 A,1, B0, A,1, B0, A2, X1 A2, X,1 A2, X1 A2, X,1,下面的,4,组测试数据可以使上面列出的,8,种条件组合每种至少出现一次:,I,A,2,,,B,0,,,X,4,(,针对,l,,,5,两种组合,执行路径,sacbed),A,2,,,B,l,,,X,1,(,针对,2,,,6,两种组合,执行路径,sabed),A,1,,,B,0,,,X,2,(,针对,3,,,7,两种组合,执行路径,sabed),A,1,,,B,1,,,X,1,(,针对,4,,,8,两种组合,执行路径,sabd),99,软件工程 - 2010 - 第七章 实现,条件组合覆盖,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定条件覆盖标准。因此,,条件组合覆盖是前述几种覆盖标准中最强的,。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。,例如上述,4,组测试数据都没有测试到路径,sacbd,100,软件工程 - 2010 - 第七章 实现,点覆盖,要求选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次,由于流图的每个结点与一条或多条语句相对应,显然,,点覆盖标准和语句覆盖标准是相同的。,101,软件工程 - 2010 - 第七章 实现,边覆盖,要求选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常,边覆盖和判定覆盖是一致的。,102,软件工程 - 2010 - 第七章 实现,路径覆盖,路径覆盖就是设计足够的测试用例,程序的每条可能路径都至少执行一次,(,如果程序图中有环,则要求每个环至少经过一次,),。,103,软件工程 - 2010 - 第七章 实现,下面给出了用盒图描绘的一个程序内部逻辑,试设计给出分别满足语句覆盖和条件覆盖的测试方案,每个方案必须要写出,给定输入,的内容和,预期输出,的内容。,104,软件工程 - 2010 - 第七章 实现,此题答案不唯一,下述答案仅供参考,达到语句覆盖:,令第一判断(,A2,),and,(,B0,)和第二判断(,C,A,),or,(,D,B,)都为假:,给定输入:,A,1,,,B,1,,,C,0,,,D,2,;,预期输出:,X,2,,,Y,2,;,令第一判断(,A2,),and,(,B0,)和第二判断(,C,A,),or,(,D,B,)都为真:,给定输入:,A,2,,,B,1,,,C,3,,,D,0,;,预期输出:,X,1,,,Y,3,;,达到条件覆盖:,第一判断处有如下各种条件取值情形:,A2,,,A,2,,,B0,,,B,0,;,第二判断处有如下各种条件取值情形:,C,A,,,CA,,,D,B,,,DB,;,可以使用下面两组测试数据达到条件覆盖的要求:,满足,A2,,,B0,,,C,A,,,D,B,:,给定输入:,A,2,,,B,1,,,C,3,,,D,0,;,预期输出:,X,1,,,Y,3,;,满足,A,2,,,B,0,,,CA,,,DB,:,给定输入:,A,1,,,B,0,,,C,1,,,D,1,;,预期输出:,X,1,,,Y,2,;,本题凡给出具体数据测试用例的先得,2,分,没有给出具体数据测试用例的不得此,2,分。该程序有四条语句,每覆盖一条得,1,分。该程序有四个条件表达式,每个表达式取是与非各一次为覆盖该条件表达式,每覆盖一个得,1,分。,105,软件工程 - 2010 - 第七章 实现,控制结构测试,控制结构测试是根据程序的控制结构设计测试数据的技术,基本路径测试,条件测试,循环测试,106,软件工程 - 2010 - 第七章 实现,基本路径测试,使用这种技术设计测试用例时,首先计算程序的环形复杂度,并用该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。,107,软件工程 - 2010 - 第七章 实现,基本路径测试,第一步,根据过程设计结果画出相应的流图。,第二步,计算流图的环形复杂度。,第三步,确定线性独立路径的基本集合。,独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边。,程序的环形复杂度决定了程序中独立路径的数量,而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界,第四步,设计可强制执行基本集合中每条路径的测试用例。,108,软件工程 - 2010 - 第七章 实现,1: i=1;,total.input,=,total.valid,=0;,sum=0;,2:DO WHILE value,i, -999,3: AND,total.input,=minimum,6: AND value,i,0,11: THEN average=sum/,total.valid,;,12: ELSE average=-999;,13:ENDIF,END average,109,软件工程 - 2010 - 第七章 实现,路径,l,:,l-2-10-11-13,路径,2,:,l-2-10-12-13,路径,3,:,l-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,:,l-2-3-4-5-6-7-8-9-2,110,软件工程 - 2010 - 第七章 实现,路径,1: 1-2-10-11-13,value k=,有效输入值,其中,ki,value i=-999,其中,2i100,预期结果,:,基于,k,的正确平均值和总数,路径,2: 1-2-10-12-13,value 1=-999,预期结果,: average=-999,其它都保持初始值,111,软件工程 - 2010 - 第七章 实现,路径,3: 1-2-3-10-11-13,试图处理,101,个或更多个值,前,100,个数值是有效输入值,预期结果,:,前,100,个数的平均值,总数为,100,路径,4: 1-2-3-4-5-8-9-2,value i=,有效输入值,其中,i100,Value k,minimun,其中,ki,预期结果,:,基于,k,的正确平均值和总数,112,软件工程 - 2010 - 第七章 实现,路径,5: 1-2-3-4-5-6-8-9-2,value i=,有效输入值,其中,i,maximun,其中,ki,预期结果,:,基于,k,的正确平均值和总数,路径,6: 1-2-3-4-5-6-7-8-9-2,value i=,有效输入值,其中,i0),。在这种情况下,这些路径必须作为另一个路径的一部分来测试。,114,软件工程 - 2010 - 第七章 实现,条件测试,用条件测试技术设计出的测试用例,能够检查程序模块中包含的逻辑条件。,两个基本概念,简单条件:一个简单条件是一个布尔变量或一个关系表达式,在布尔变量或关系表达式之前还可以有一个,NOT,算符。,复合条件:由两个或多个简单条件、布尔算符和括弧组成。布尔算符有,OR,、,AND,和,NOT,。,条件错误的类型如下:,布尔算符错、布尔变量错、布尔括弧错、关系算符错、算术表达式错。,115,软件工程 - 2010 - 第七章 实现,条件测试,分支测试,:对于复合条件,C,来说,,C,的真分支和假分支以及,C,中的每个简单条件,都应该至少执行一次。,域测试,:对于关系表达式,E1E2,如果,错误而,E1,和,E2,正确,需要,3,个测试分别使,E1,的值大于、等于或小于,E2,的值。,为了发现,E1,和,E2,中的错误,让,E1,值大于或小于,E2,值的测试数据应该使这两个值之间的差别尽可能小。,116,软件工程 - 2010 - 第七章 实现,条件测试,BRO(Branch and Relation Operation),如果在条件中所有布尔变量和关系算符都只出现一次而且没有公共变量,则,BRO,测试保证能发现该条件中的分支错和关系算符错。,117,软件工程 - 2010 - 第七章 实现,条件测试,包含,n,个简单条件的条件,C,的,条件约束,定义为,(D,1,,,D,2,,,,,D,n,),,其中,D,i,(0,、,=,或,。,如果在条件,C,的一次执行过程中,,C,中每个简单条件的输出都满足,D,中对应的约束,则称,C,的这次执行覆盖了,C,的条件约束,D,。,118,软件工程 - 2010
展开阅读全文