您好,欢迎访问三七文档
《软件测试技术及实践》第2章白盒测试技术詹慧静陈燕段相勇本章学习目标软件测试技术的基本理论白盒测试常用的测试方法软件测试技术可分为白盒测试技术和黑盒测试技术两大类,任何软件产品都可以使用这两种技术进行测试。通常软件产品的测试采用黑盒测试和白盒测试相结合的方法。白盒测试(WhiteboxTesting)又称结构测试、逻辑驱动测试或基于程序的测试。白盒测试的对象是源程序,通过对程序的内部逻辑进行分析,来设计测试用例,对程序细节进行严密检验,对软件的逻辑路径进行测试。在程序的不同点检验“程序的状态”以判定其实际情况是否和预期的状态相一致。黑盒测试(BlackboxTesting)又称功能测试、数据驱动的测试或基于规格说明的测试,是一种从用户观点出发的测试。用这种方法进行测试时,被测程序被当作一个黑盒,在不考虑程序内容结构和内部特征,测试者只知道该程序输入和输出之间的关系或程序的功能的情况下,依靠能够反映这一关系和程序功能的需求规格说明书,考虑确定测试用例和推断测试结果的正确性。软件的黑盒测试被用来证实软件功能的正确性和可操作性。白盒测试检查的内容如下:1)对程序模块的所有独立的执行路径至少测试一遍。2)对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测试一遍。3)在循环的边界和运行的界限内执行循环体。4)测试内部数据结构的有效性等。黑盒测试主要是能发现以下几类错误:1)功能错误或功能遗漏。2)接口错误,输入及输出数据是否能通过接口正确的被传递。3)界面错误。4)数据结构或外部数据库访问错误。5)性能错误,如:性能不能满足需求。6)初始化和终止错误。为了能够掌握对软件进行白盒测试,需要掌握:•静态测试方法•动态测试方法白盒测试技术又可分为静态测试方法和动态测试方法。静态测试检查代码,代码被测试而不执行。动态测试则执行代码,代码被执行而不必检查。静态测试是指不需要运行被测程序,而是使用人工和借助软件工具自动的来检查程序代码的语法、结构、过程、接口可能存在的错误,并检查软件的界面或文档可能存在的错误。最常见的静态测试是找出源代码的语法错误,这类测试可由编译器来完成,因为编译器可以逐行的分析检验程序的语法,找出错误并报告。而对于非语法类的错误,编译器无法检查。非语法错误的静态测试主要有代码检查、静态结构分析等。它可以由人工检测,也可以借助于软件工具自动进行。1.代码检查法代码检查包括桌面检查、代码审查、代码走查等。在代码检查中,需要依据被测软件的特点,选用适当的标准与规则、规范。代码检查可使用测试工具或人工检查。可利用桌面检查、代码走查、代码审查等人工检查的方法仔细检查程序的结构、逻辑等方面的缺陷。在使用测试工具进行自动化代码检查时,测试工具一般会内置许多的编码规则。代码检查法可以发现如下软件缺陷:•代码是否遵循设计标准、代码和设计是否一致。•代码逻辑表达的正确性。•代码结构的合理性。•代码编写是否符合代码规约、代码的可读性、编程风格是否一致。1.代码检查法代码检查需要检查的内容如下:变量交叉引用表:检查未说明的变量和违反了类型规定的变量,以及变量的引用和使用情况。检查标号的交叉引用表:验证所有标号的正确性以及转向指定位置的标号是否正确。检查子程序、宏、函数:验证每次调用与所调用位置是否正确,调用的子程序、宏、函数是否存在,参数是否一致,以及检查调用方式与参数顺序、个数、类型上的一致性。等价性检查:检查全部等价变量的类型的一致性。常量检查:确认常量的取值、数制、数据类型。标准检查:检查程序是否有违反标准的问题。风格检查:检查程序的设计风格。比较控制流:比较设计控制流图和实际程序生成的控制流图的差异。选择、激活路径:在设计控制流图中选择某条路径,到实际的程序中激活这条路径。补充文档:根据以上检查项目,可以编制代码规则、规范和检查表等文档。对照程序的规格说明,详细阅读源代码:比较实际的代码,从中发现程序的问题和错误。1.代码检查法1)桌面检查桌面检查由程序员检查自己编写的程序。程序员对源程序代码进行分析、检验并补充相关文档,目的是发现程序中的错误。由于程序员熟悉自己的程序及其程序设计风格,桌面检查由程序员自己进行可以节省很多的检查时间,但应避免主观片面性。1.代码检查法2)代码审查由程序员和测试人员组成审查小组,通过阅读、讨论对程序进行静态分析的过程。代码审查分两个步骤:(1)小组负责人提前把设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给小组成员,作为审查的依据,小组成员充分阅读这些材料。(2)召开程序审查会。在会上,首先由程序员逐句讲解程序的逻辑。在此过程中,程序员或其他小组成员可以提出问题,展开讨论,审查错误是否存在。实践表明,程序员在讲解过程中能发现许多原来自己没有发现的错误,而讨论和争议则促进了问题的暴露。1.代码检查法3)代码走查由程序员和测试人员组成审查小组,通过逻辑运行程序发现问题的过程。与代码审查基本相同,代码走查也分为两个步骤:(1)小组负责人把设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给走查小组的每个成员,小组成员充分阅读这些材料。(2)召开程序走查会。首先由测试组成员为被测试程序设计有代表性的测试用例,使用这些测试用例逻辑运行程序。在对程序进行逻辑运行时,随时记录程序的踪迹,供分析和讨论用。借助测试用例的媒介作用,对程序的逻辑和功能提出各种疑问,结合问题开展热烈的讨论和争议,能够发现更多的问题。2.静态结构分析静态结构分析主要是以图形的方式表现程序的内部结构,静态结构分析通过应用程序各函数之间的调用关系展示了系统的结构,并可以直观地展示一个函数的内部逻辑结构。这两个功能可用函数调用关系图、模块控制流图完成。2.静态结构分析1)函数调用关系图函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系。通过查看函数调用关系图,可以检查函数之间的调用关系是否符合要求,是否存在递归调用,函数的调用是否过深,有没有独立存在没有被调用的函数。从而可以发现系统是否存在结构缺陷,发现哪些函数是重要的,哪些是次要的,需要使用什么级别的覆盖要求。2)模块控制流图模块控制流图是由许多节点和连接节点的边组成的一种图形,其中一个节点代表一条语句或数条语句,边代表节点间控制流向,它显示了一个函数的内部逻辑结构。通过检查这些模块控制流图,能够很快发现软件的错误与缺陷。2.静态结构分析静态结构主要分析以下内容:1)函数的调用关系是否正确。2)是否存在孤立的函数没有被调用。3)明确函数被调用的频繁度,对调用频繁的函数可以重点检查。动态测试(DynamicTesting),是指实际运行被测程序,输入相应的测试数据,检查输出结果和预期结果是否相符的过程。动态测试方法的主要特征是计算机必须真正运行被测试的程序,通过输入测试用例,对其运行情况(输入/输出的对应关系)进行分析。在动态测试中,通常使用白盒测试和黑盒测试从不同的角度设计测试用例,查找软件中的错误。动态测试的黑盒测试方法及测试用例的设计在第3章中讲解,本节介绍动态测试的白盒测试方法及测试用例的设计。1.程序插桩技术程序插桩,最早是由J.C.Huang教授提出的,它是在保证被测程序原有逻辑完整性的基础上,在程序的相应位置上插入一些探针(又称为“探测器”),通过探针的执行而得到程序运行的特征数据,通过对这些特征数据的分析,了解程序的内部行为和特征。这些探针实际上就是进行信息采集的代码段,可以是赋值语句、计数语句或采集覆盖信息的函数调用等,通过这些探针可以了解最为关注的信息,以判断程序执行过程中的一些动态特性。1.程序插桩技术由于程序插桩技术通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。目标代码插桩需要对目标代码进行必要的分析以确定需要插桩的位置和内容。目标代码的格式主要和操作系统相关,与具体的编程语言及版本无关。目标代码插桩有着广泛的应用,例如在需要对内存进行监控的软件中。但是,由于目标代码中语法、语义信息不完整,而插桩技术需要对代码词法的分析有较高的要求,因此在覆盖测试工具中多采用源代码插桩。源代码插桩是在对源代码进行完整的词法分析和语法分析的基础上进行的,这可以保证对源代码的插桩具有很高的准确度和针对性。源代码插桩需要接触到源代码,工作量较大,而且会因为编码语言及版本的不同而做适当的修改。1.程序插桩技术【例2-1】计算整数X和整数Y的最大公约数程序,通过插桩技术了解该程序在某次运行中所有可执行语句被覆盖的情况,既每个语句的实际执行次数。其插桩后的流程图如下。Q=Q-RR=R-QC⑸=C⑸+1Q≠R入口出口C⑴=C⑴+1Q=XR=YQ≠RC⑵=C⑵+1C⑶=C⑶+1C⑷=C⑷+1C⑹=C⑹+11.程序插桩技术设计插桩程序时要考虑和确定以下问题:•明确要探测哪些信息。可根据需要和具体情况确定。•在程序的什么部位插入探测点。•需要插入多少个探测点。就是要考虑如何能插入最少的点,来完成实际的探测问题。•程序中特定部位插入某些用以判断变量特性的语句。在程序中的特定部位插入某些用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程序的运行特性得到证实,把这些插入的语句称为断言语句。断言语句的作用是当程序执行到它的时候必须应该与之前的假设一致,否则,就会产生错误。例如,除法运算之前,加一条分母不为0的断言语句,可以有效的防止分母为0错误。断言语句对程序中隐藏很深,用其它方法很难发现的问题很有效。1.程序插桩技术在实际测试中通常在下面一些部位设置探测点。•程序块的第一个可执行语句之前。•for、do、dowhile、dountil等循环语句处。•If、else、else及endif等条件语句各分支处。•函数、过程、子程序调用语句之后。•Return语句之后。•Goto语句之后。2.逻辑覆盖逻辑覆盖也是白盒测试主要的动态测试方法之一,是以程序内部的逻辑结构为基础的测试技术,是通过对程序逻辑结构的遍历实现程序的覆盖,这一方法要求测试人员对程序的逻辑结构有清楚的了解。根据覆盖源程序语句的详细程度,逻辑覆盖包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖。为了理解各种逻辑覆盖标准,根据下面源代码程序(用C语言书写),分别讨论不同的覆盖标准设计测试用例。2.逻辑覆盖【例2-2】有下列程序,其流程图如下图所示。Voidsp(intA,intB,intC){intx=0;y=0;if(A0&&B6)X=A+Bif(A=5||c1)Y=A*C;prinf(x,y);}NYYX=0,Y=0A0andB6A=5orc1X=A+BY=A×C输出X,Y开始结束Nacbde2.逻辑覆盖1)语句覆盖(StatementCoverage)语句覆盖的标准是设计足够的测试用例,运行被测程序,使被测程序中每条可执行语句至少执行一次。对于例2-2,为达到“语句覆盖”的标准,只需设计一个能通过路径a-b-d的数据就可以使程序中每条可执行语句至少执行一次,为此可设计以下测试用例。TestCase1:A=3,B=-1,C=5优点:语句覆盖可以很直观地从源代码得到测试用例,无须细分每条判定表达式。缺点:语句覆盖的测试用例虽然覆盖了所有可执行语句,但并不能检查每个判断逻辑是否有问题,例如在第一个判断中把&&错误的写成了||,则上面的测试用例仍可以覆盖所有的执行语句。因此语句覆盖是很不充分的一种标准,是最弱的逻辑覆盖标准。2.逻辑覆盖2)判定覆盖(DecisionCoverage)比语句覆盖稍强的覆盖标准是判定覆盖。判定覆盖的标准是设计足够的测试用例,运行被测程序,使被测程序中每个判断的“真”和“假”分支均至少执行一次,即判断的真假值均曾被满足。判定覆盖又称为分支覆盖。对于例2-2,为达到“判定覆盖”的标准,只需设计通过路径a-c-d和a-b-e,或通过路径a-b-d和a-c-e,就可达到判定覆盖标准,为此可设计以下测试用例。TestCase1:A=5,B=10
本文标题:软件测试技术第2章
链接地址:https://www.777doc.com/doc-7925918 .html