2020年2月19日软件测试讲义1第二章白盒测试2020年2月19日第二章白盒测试2白盒测试概述白盒测试(White-boxTesting)也称为玻璃盒测试(Glass-boxTesting),是一种基于源程序或代码的测试方法,分为静态和动态两种类型。静态方法是指按一定步骤直接检查源代码来发现错误,而不用生成测试用例并驱动被测程序运行来发现错误,也称为代码检查法;动态方法是指按一定步骤生成测试用例并驱动被测程序运行来发现错误。2020年2月19日第二章白盒测试32.1基本路径测试1.流图符号基本路经测试是TomMcCabe首先提出的一种白盒测试技术,基本路径测试给测试用例设计者提供方法来求出程序或过程设计中的逻辑复杂性测度,并使用该测度为指南来定义执行路径的基本集。sequenceifcasewhileuntil符号○为控制流图的一个结点,表示一个或多个无分支的PDL语句或源程序语句。箭头为边,表示控制流的方向。2020年2月19日第二章白盒测试42.1基本路径测试上述映射的前提是设计图的判定中不包含复合条件。如果设计图的判定中包含了复合条件,那么必须先将其转换成等价的简单条件设计图。123456c)对应的流图a)含复合条件的设计图x=1x=2tfy=0b)只含简单条件的设计图ttffx=1x=1abcdx=2123456y=0aborcd2020年2月19日第二章白盒测试52.1基本路径测试流程图流图2020年2月19日第二章白盒测试62.1基本路径测试2020年2月19日第二章白盒测试72.1基本路径测试2.独立程序路径把流图中由结点和边组成的闭合部分称为一个区域(region),在计算区域数时,图的外部部分也作为一个区域。例如,上图(b)所示的流图的区域数为3。独立路径是指程序中至少引进一个新的处理语句序列或一个新条件的任一路径,在流图中,独立路径至少包含一条在定义该路径之前未曾用到过的边。在基本路径测试时,独立路径的数目就是流图的区域数。2020年2月19日第二章白盒测试82.1基本路径测试2.独立程序路径例如,在第六页流图所示的控制流图中,一组独立的路径是:path1:1-11path2:1-2-3-4-5-10-1-11path3:1-2-3-6-8-9-10-1-11path4:1-2-3-6-7-9-10-1-11路径path1,path2,path3,path4组成了控制流图的一个基本路径集。2020年2月19日第二章白盒测试92.1基本路径测试3.环形复杂性环形复杂性是一种为程序逻辑复杂性提供定量测度,该度量用于基本路径测试方法,计算所得的值给除了程序基本集的独立路径数量,可用如下方法计算复杂性:(1)流图中区域的数量=环形复杂性(2)给定流图G的环形复杂性CC(G),定义CC(G)=E-N+2,其中E是流图中边的数量,N是流图节点数量;(3)给定流图G的环形复杂性CC(G),定义CC(G)=P+1,其中P是流图G中判定结点的数量。2020年2月19日第二章白盒测试102.1基本路径测试3.环形复杂性左图可用下列方法计算:(1)流图有4个区域;(2)CC(G)=11条边-9个节点+2=4;(3)CC(G)=3个判定节点+1=4。因此,左图的环形复杂性是4。2020年2月19日第二章白盒测试112.1基本路径测试4.导出测试用例Procedurepurge(varL:list)Varp,q:…//定义p,qBegin(1)p:=FIRST(L);(2)beginwhilepEND(L)do(3)q:=next(p,L);(4)beginwhileqEND(L)do(5)ifAq=Apthen(6)delete(Aq,L);(7)elseq:=next(q,L);(8)end(9)p:=next(p,L);(10)end;end.2020年2月19日第二章白盒测试122.1基本路径测试4.导出测试用例(1)以详细设计或源程序为基础,导出程序流程图的拓朴结构——程序图。12begin3451098end67p=END(L)pEND(L)q=END(L)Aq=AppEND(L)2020年2月19日第二章白盒测试132.1基本路径测试4.导出测试用例(2)计算程序图G的环路复杂性CC(G)。McCabe定义程序图的环路复杂性为此平面图中区域的个数。区域个数为边和结点圈定的封闭区域数加上图形外的区域数1。CC(G)=4个区域CC(G)=14条边-12个节点+2=4CC(G)=3个判定节点+1=42020年2月19日第二章白盒测试142.1基本路径测试4.导出测试用例(3)确定只包含独立路径的基本路径集。独立路径是指包括一组以前没有处理的语句或条件的一条路径。一条独立路径是至少包含有一条在其他独立路径中未有过的边的路径,例如,在本节所示的图中,一组独立的路径是:路径1:1—2—10路径2:1—2—3—4—8—9—2—10路径3:1—2—3—4—5—6—4—8—9—2—10路径4:1—2—3—4—5—7—4—8—9—2—102020年2月19日第二章白盒测试152.1基本路径测试4.导出测试用例(4)准备测试用例,强制执行基本集中每条路径。测试人员可选择数据以便在测试每条路径时适当设置判定节点的条件。路径1测试用例:•输入条件:L=(),即列表为空•期望结果:L=(),无列表清理处理路径2测试用例:•输入条件:L=(Ap)•期望结果:L=(Ap)2020年2月19日第二章白盒测试162.1基本路径测试4.导出测试用例(4)准备测试用例,强制执行基本集中每条路径。测试人员可选择数据以便在测试每条路径时适当设置判定节点的条件。路径3测试用例:•输入条件:L=(Ap,Aq)且Ap=Aq•期望结果:L=(Ap),从列表中清理Aq路径4测试用例:•输入条件:L=(Ap,Aq)且ApAq•期望结果:L=(Ap,Aq)2020年2月19日第二章白盒测试172.1基本路径测试5.图矩阵法图矩阵(GraphMatrix)是一个正方形矩阵,其大小(即列数和行数)等于流图的节点数。每行和每列都对应于标识的节点,矩阵项对应于节点间的连接(边)。13425aefgbcdadbcfge12345节点连到节点123452020年2月19日第二章白盒测试182.1基本路径测试5.图矩阵法简单说,连接权值是1或0,还有更有趣的属性:执行连接(边)的概率;穿越连接的处理时间;111111112345节点连到节点12345穿越连接时所需的内存;穿越连接时所需的资源。连接1-1=02-1=12-1=12-1=1连接矩阵ConnectionMatrix环形复杂性3+1=42020年2月19日第二章白盒测试192.2控制结构测试2.数据流测试设程序的每条语句都赋予了独特的语句号而且每个函数都不改变其参数和全局变量。对于语句号为S的语句,DEF(S)={X|语句S包含X的定义}USE(S)={X|语句S包含X的使用}若语句S是if或循环语句,它的DEF集为空而USE集取决于S的条件。如果存在从S到S’的路径并该路径不含X的其他定义,则称变量X在语句S处的定义在语句S’仍有效。一个变量可以是计算使用(c-use)或断言使用(p-use)。变量X的定义-使用链(DU链)形如[X,S,S’],X在DEF(S)和USE(S’)中,而且语句S定义的X在语句S’有效。2020年2月19日第二章白盒测试202.2控制结构测试2.数据流测试DU测试策略:要求覆盖每个DU链至少一次。数据流测试策略可用于为包含嵌套if和循环语句的程序选择测试路径。它能有效地发现错误,但它的覆盖率的测量和路径选择比条件测试更为困难。fooA(){(1)x=read();(2)If(x0)(3)printx-1;(4)else(5)printx;}entryfooA()1253exitc-use[x,4]def(1)={x}p-use[x,2,3]p-use[x,2,4]c-use[x,3]2020年2月19日第二章白盒测试212.2控制结构测试3.循环测试2020年2月19日第二章白盒测试222.2控制结构测试3.循环测试循环也是程序的主要逻辑结构,要覆盖含有循环结构的所有路径是不可能的,但可通过限制循环次数来测试。(1)单循环设n为可允许执行循环的最大次数。设计以下情况的测试用例:(1)跳过循环。(2)(3)执行循环m次,其中m<n(4)执行循环n-1次,n次,n+1次。2020年2月19日第二章白盒测试232.2控制结构测试(2)嵌套循环按照下列规则设计测试用例:①先测试最内层循环:所有外层的循环变量置为最小值,最内层按简单循环测试;②由里向外,测试上一层循环:测试时此层以外的所有外层循环的循环变量取最小值,此层以内所有嵌套内层循环的循环变量取“典型”值,该层按简单循环测试;③重复上一条规则,直到所有各层循环测试完毕;④对全部各层循环同时取最小循环次数,或者同时取最大循环次数。3.循环测试2020年2月19日第二章白盒测试242.2控制结构测试(3)串接循环如果串接的各个循环互相独立,则可以分别用简单循环的方法进行测试;但如果第一个循环的循环变量与第二个循环控制相关,则两个循环不独立,此时,把第一个循环看作外循环,第二个循环看作内循环,然后用测试嵌套循环的办法来处理。(4)非结构循环这类循环应先将其结构化,然后再测试。3.循环测试2020年2月19日第二章白盒测试252.3代码检查法1.代码审查(1)代码审查小组代码审查是由若干个程序员和测试人员组成一个审查小组,通过阅读、讨论和争议,对程序进行静态分析的过程。主持人:负责保证审查以既定的速度进行,使其既能保证效率,又能发现尽可能多的错误;作者:是直接参与代码设计和编写的人,这是相对次要的角色;评论员:是同代码有直接关系,但又不是作者的人;记录员:将审查会议期间发现的错误,以及指派的任务记录下来。2020年2月19日第二章白盒测试262.3代码检查法1.代码审查(2)代码审查步骤计划(Plan):主持人确定会议时间、地点、核对表发给众人;概述(OverviewMeeting):作者描述代码的背景;准备(Preparation):评论员独立对代码审查,找出错误;审查会议(InspectionMeeting):主持人指定某人阅读代码,解释,其他人提出问题并讨论,会议时间最佳在90-120分钟之间,大多数审查每小时讨论150行代码;审查报告(Report):会议之后主持人写出每个缺陷,包括类型和严重级别;返工(Rework):主持人将缺陷分配给某人(作者)修复;跟进(Follow-up):主持人监督审查过程中的返工任务。2020年2月19日第二章白盒测试272.3代码检查法1.代码审查(2)代码审查步骤审查前代码计划审查会议审查报告返工跟进审查后代码概述准备2020年2月19日第二章白盒测试282.3代码检查法1.代码审查(3)代码审查注意事项代码审查采用讲解、提问方式进行,一般有正式的计划、流程和结果。要注意以下几个问题:以会议形式,制定会议目标、流程和规则,结束后要编写报告;按代码核对表逐项检查;发现问题适当记录,避免现场修改;发现重大缺陷,改正后会议需要重开;检查要点是代码核对表,所以该表要根据项目不同不断积累完善。2020年2月19日第二章白盒测试292.3代码检查法1.代码审查(4)代码核对表数据引用错误•引用变量是否初始化?•数组下标是否越界?•数组下标是否是整数值?•内存中的值和某个引用它的变量类型是否一致?•分配内存比可寻址空间小的时候是否有明显的寻址问题?•使用指针或引用变量时,是否与引用值类型相同?•数据结构在多个子程序中使用时的定义是否一致?•字符串读写或者引用数组下标时,是否超出了字符串或数组末尾?•面向对象的语言中,所有的继承条件是否都在实现类中满足?2020年2月19日第二章白盒测试302.3代码检查法数