白盒测试浪潮软件集团有限公司软件评测实验室软件测试部2目录白盒测试基本概念白盒测试基本方法单元测试12/20/2019Inspurgroup3浪潮软件评测实验室白盒测试概念白盒测试也称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试,是一种测试用例设计方法,它从程序的控制结构导出测试用例。白盒测试使用被测单元内部如何工作的信息,允许测试人员对程序内部逻辑结构及有关信息来设计和选择测试用例,对程序的逻辑路径进行测试。基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。12/20/2019Inspurgroup4浪潮软件评测实验室测试覆盖标准覆盖标准从低到高分别是:语句覆盖:一个较弱的测试标准。它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。它是最弱的逻辑覆盖,效果有限,必须与其它方法交互使用。判定覆盖(分支覆盖):执行足够的测试用例,使得程序中的每一个分支至少都通过一次。判定覆盖比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判断条件中存在的错误。条件覆盖:执行足够的测试用例,使程序中每个判断的每个条件的每个可能取值至少执行一次;条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。2019/12/20Inspurgroup5浪潮软件评测实验室测试覆盖标准判定/条件覆盖:执行足够的测试用例,使判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。判定/条件覆盖有缺陷。从表面看,它测试了所有条件的取值。但事实并非如此。往往某些条件掩盖了另一些条件。会遗漏某些条件取值错误的情况。为彻底地检查所有条件的取值,需要将判定语句中给出的复合条件表达式进行分解,形成由多个基本判定嵌套的流程图。这样就可以有效地检查所有的条件是否正确了。条件组合覆盖:执行足够的用例,使得每个判定中条件的各种可能组合都至少出现一次。这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。测试还不完全。路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。2019/12/20Inspurgroup6浪潮软件评测实验室语句覆盖语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。如,例1:PROCEDIF(A1)AND(B=0)THENX:=X/A;IF(A=2)ORUREM(VARA,B,X:REAL);BEGIN(X1)THENX:=X+1;END.为使程序中每个语句至少执行一次,只需设计一个能通过路径ace的例子就可以了,例如选择输入数据为:A=2,B=0,X=3就可达到“语句覆盖”标准。2019/12/20Inspurgroup语句覆盖7浪潮软件评测实验室分支覆盖比“语句覆盖”稍强的覆盖标准是“分支覆盖”(或称判定覆盖)标准。含义是:执行足够的测试用例,使得程序中的每一个分支至少都通过一次。对例1的程序,如果设计两个例子,使它们能通过路径ace和abd,或者通过路径acd和abe,就可达到“判定覆盖”标准,为此,可以选择输入数据为:①A=3,B=0,X=1(沿路径acd执行);②A=2,B=1,X=3(沿路径abe执行)2019/12/20Inspurgroup8浪潮软件评测实验室分支覆盖2019/12/20Inspurgroup判定覆盖判定覆盖A=3,B=0,X=1(沿路径acd执行)A=2,B=1,X=3(沿路径abe执行)9浪潮软件评测实验室条件覆盖一个判定中往往包含了若干个条件,如例1的程序中,判定(A>1)AND(B=0)包含了两个条件:A>1以及B=0,所以可引进一个更强的覆盖标准——“条件覆盖”。“条件覆盖”的含义是:执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。2019/12/20Inspurgroup10浪潮软件评测实验室条件覆盖例1的程序有四个条件:A>1、B=0、A=2、X>1为了达到“条件覆盖”标准,需要执行足够的测试用例使得在a点有:A>1、A≤1、B=0、B≠0等各种结果出现,以及在b点有:A=2、A≠2、X>1、X≤1等各种结果出现。现在只需设计以下两个测试用例就可满足这一标准:①A=2,B=0,X=4(沿路径ace执行);②A=1,B=1,X=1(沿路径abd执行)。2019/12/20Inspurgroup11浪潮软件评测实验室条件覆盖2019/12/20Inspurgroup条件覆盖条件覆盖A=2,B=0,X=4(沿路径ace执行)A=1,B=1,X=1(沿路径abd执行)12浪潮软件评测实验室分支/条件覆盖针对上面的问题引出了另一种覆盖标准——“分支/条件覆盖”,它的含义是:执行足够的测试用例,使得分支中每个条件取到各种可能的值,并使每个分支取到各种可能的结果。对例1的程序,前面的两个例子①A=2,B=0,X=4(沿ace路)②A=1,B=1,X=1(沿abd路径)是满足这一标准的。2019/12/20Inspurgroup13浪潮软件评测实验室条件组合覆盖条件组合覆盖”。它的含义是:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“分支覆盖”、“条件覆盖”和“分支/条件覆盖”的。2019/12/20Inspurgroup14浪潮软件评测实验室条件组合覆盖再看例1的程序,我们需要选择适当的例子,使得下面8种条件组合都能够出现:1)A1,B=02)A1,B≠03)A≤1,B=04)A≤1,B≠05)A=2,X16)A=2,X≤17)A≠2,X18)A≠2,X≤15)、6)、7)、8)四种情况是第二个IF语句的条件组合,而X的值在该语句之前是要经过计算的,所以还必须根据程序的逻辑推算出在程序的入口点X的输入值应是什么。2019/12/20Inspurgroup15浪潮软件评测实验室条件组合覆盖下面设计的四个例子可以使上述8种条件组合至少出现一次:①A=2,B=0,X=4使1)、5)两种情况出现;②A=2,B=1,X=1使2)、6)两种情况出现;③A=1,B=0,X=2使3)、7)两种情况出现;④A=1,B=1,X=1使4)、8)两种情况出现。2019/12/20Inspurgroup16浪潮软件评测实验室条件组合覆盖上面四个例子虽然满足条件组合覆盖,但并不能覆盖程序中的每一条路径,例如路径acd就没有执行,因此,条件组合覆盖标准仍然是不彻底。2019/12/20Inspurgroup17浪潮软件评测实验室路径覆盖测试前面提到的5种逻辑覆盖都未涉及到路径的覆盖。事实上,只有当程序中的每一条路径都受到了检验,才能使程序受到全面检验。路径覆盖的目的就是要使设计的测试用例能覆盖被测程序中所有可能的路径。2019/12/20Inspurgroup18浪潮软件评测实验室路径测试测试用例通过路径A=2、B=0、X=3aceA=1、B=0、X=1abdA=2、B=1、X=1abeA=3、B=0、X=1acd2019/12/20Inspurgroup路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。对于例1,下面的测试用例则可对程序进行全部的路径覆盖。19浪潮软件评测实验室基本路径测试例1是很简单的程序函数,只有四条路径。但在实践中,一个不太复杂的程序,其路径都是一个庞大的数字,要在测试中覆盖所有的路径是不现实的。为了解决这一难题,只得把覆盖的路径数压缩到一定限度内,如,程序中的循环体只执行一次。基本路径测试就是这样一种测试方法,它在程序控制图的基础上,通过分析控制构造的环行复杂性,导出基本可执行路径集合,从而设计测试用例。设计出的测试用例满足语句覆盖。在介绍基本路径方法之前,必须先介绍一种简单的控制流表示方法,即流图。2019/12/20Inspurgroup20浪潮软件评测实验室控制流图流图只有二种图形符号图中的每一个圆称为流图的结点,代表一条或多条语句,一个处理框序列和一个条件判定框(假设不包含复合条件)。流图中的箭头称为边或连接,代表控制流。任何过程设计都要被翻译成控制流图。2019/12/20Inspurgroup21浪潮软件评测实验室控制流图在将程序流程图简化成控制流图时,应注意:包含条件或多分支的节点被称为判定节点(也叫谓词节点),在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。如下页图所示2019/12/20Inspurgroup22浪潮软件评测实验室控制流图2019/12/20Inspurgroup1762,38910114,57623184511910节点边区域区域:由边和解点封闭起来的区域计算区域:不要忘记区域外的部分待测试程序用流图表示的待测试程序23浪潮软件评测实验室控制流图如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。例如:1ifaorb2x3else4y对应的逻辑为:2019/12/20Inspurgroup24浪潮软件评测实验室独立路径2019/12/20Inspurgroup独立路径:至少沿一条新的边移动的路径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对以上路径遍历,能满足语句覆盖。25浪潮软件评测实验室基本路径测试基本路径测试方法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。包括以下4个步骤:1.程序的控制流图:描述程序控制流的一种图示方法。2.程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。3.导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。4.准备测试用例:确保基本路径集中的每一条路径的执行。以下详细描述:2019/12/20Inspurgroup26浪潮软件评测实验室基本路径测试第一步:画出控制流图可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。流程图用来描述程序控制结构。在流图中,每一个结点,代表一个或多个语句。一个流程图的处理方框序列和一个菱形决测框可被映射为一个流图结点;流图中的边或连接,代表控制流,类似于流程图中的箭头。流图中一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:if-else-then结构)。由边和结点限定的范围称为区域。计算区域时应包括图外部的范围。2019/12/20Inspurgroup27浪潮软件评测实验室基本路径测试例4:有下面的C函数,用基本路径测试法进行测试voidSzT1(intiRecordNum,intiType)1.{2.intx=0;3.inty=0;4.while(iRecordNum--0)5.{6.if(0==iType)7.{x=y+2;break;}8.else9.if(1==iType)10.x=y+10;11.else12.x=y+20;13.}14.}2019/12/20Inspurgroup28浪潮软件评测实验室基本路径测试画出其程序流程图和对应的控制流图如下2019/12/20Inspurgroup46791012131429浪潮软件评测实验室基本路径测试-计算圈复杂度第二步:计算圈复杂度圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,该度量用于计算程序基本独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。有以下三种方法