计算机应用与软件程杰俊:白盒技术综述白盒测试技术综述程杰俊1(南昌航空大学软件学院江西南昌230063)摘要白盒测试又称为透明盒测试,与黑盒测试一样为软件测试技术中最基础的测试技术,在软件生命周期中扮演着重要的作用,是软件质量保证的一个重要手段。白盒测试主要根据程序内部的工作过程来发现缺陷,是按照程序内部的结构测试程序,用来检验程序的各条通路是否都能正常工作。白盒测试可分为静态测试以及动态测试,静态测试不运行程序,用于纠正程序在描述、表示以及规格上的错误。动态测试主要验证程序在检查状态下是否会发生错误。动态测试技术有路径测试、程序插桩以及逻辑覆盖。其中逻辑覆盖尤为重要,本文会较为详细的表述逻辑覆盖等一些白盒的测试技术。关键词白盒测试软件质量保证逻辑覆盖WHITEBOXTESTINGSUMMARIZEChengJiejun(NanchangHangkongUniversitySoftwareCollege,JiangxiNanchang230063)AbstractWhiteboxtestingandblackboxtestingisfundamentalforsoftwaretesting,Softwaretestingisimportantforsoftwarelifecycle,Testoutsideofsoftwareisblackboxtesting,Testoutsideofsoftwareiswhiteboxtesting,Whiteboxtestingmainfindingdefectsaccordingtotheproceduresofinternalworkprocess,Inspectionproceduresofvariouspathwayswhethercanworknormally.Whiteboxtestingcanbedividedintostatictestinganddynamictesting,Dynamictestingcanbedividedintologic-coveragetestingandpathtestingcoverageandProgramInstrumentation.Inthisarticlewillfocusonlogic-coverage.KeywordsSoftwareWhiteboxtestingLogic-coverage1引言随着计算机硬件的不断发展,软件产业同样得到了飞速的发展,甚至在发展的速度上超过了硬件。而伴随着发展如此之快的软件产业,软件测试这一行业也逐渐的发展了起来,软件测试,顾名思义就是对做的软件来进行测试的,发现软件存在的一系列缺陷与错误,来确保软件的质量。在软件的生产过程中,代码的编写人员有时随机地也会输入一些输入值,通过输出值来观察代码的正确性,由于输入值的数量少以及随机性,往往检测不出代码的一些缺陷与漏洞,效率低下。软件测试就是采用科学的方法,用较少的测试用例、时间以及人力资源来检测出软件中潜在的缺陷以及错误。在软件测试中有两种基本的测试方法,黑盒测试以及白盒测试。这里先来说说白盒测试的一些测试技术。2白盒测试2.1静态测试在白盒测试里可以分为静态测试以及动态测试,静态测试不需要程序运行,它是根据对程序源代码的分析,以及设计规格书、常见的错误清单等一系列文档,分析设计一些测试用例,使软件在逻辑运行,通过测试人员对逻辑输入输出进行分析,从而发现软件的缺陷和错误。静态测试不需要软件的运行,所以最常见的静态测试即为编码过程中编译器来检查语法错误,静态测试里有代码的检查、静态结构的分析等。代码的检查主要通过桌面检查、代码审查、走查等方式来检查代码和设计的一致性、代码的可读性、逻辑表达的正确性等等。桌面检查通常都是由程序的开发人员进行的,由于他们对编写的代码理解程度高,往往能发现在编码过程中出现的一些问题。代码审查由测试人员以及开发人员一起组成审查小组,根据一系列的文档,通过分析代码以及文档来对代码进行测试,发现其中出现的缺陷和错误。走查则是分析代码的逻辑运行来设计一些测试用例,从逻辑的角度来对代码进行测试。静态结构分析通过生成各种图表来帮助测试人员对源程序进行深入的了解,以及静态错误分析。静态错误分析主要对变量的类型以及单位分析、引用分析、接口分析以及对逻辑表达式的分析,结合设计文档来发现程序存在的一些错误。类型及单位分析主要就是查看变量的定义过程中类型是否选择正确,引用分析针对变量的使用。表达式分析就是分析表达式是否括号使用错误、数组下表是否越界、除数是否为0等内容。接口分析是检查模块之间接口是否一致以及与外部数据库接口的一致性。通过静态测试能够发现一些代码,编码风格以及一些逻辑上的错误。计算机应用与软件2.2动态测试动态测试是设计一些测试用例运行程序,根据输出的结果来分析程序中存在的一些问题,不同于黑盒测试,动态测试是先分析代码,根据代码来设计测试用例,发现程序存在的逻辑错误等。动态测试方法主要有:程序插桩、逻辑覆盖、路径测试等方法。程序插桩即为在代码中添加一些代码,实现探测点的作用,了解程序在执行过程中某些语句被执行的次数以及变量的变化情况,进而从中发现错误。逻辑覆盖是白盒测试中重要的一个测试方法,所谓覆盖,就是指程序要执行到该表达式,全面、而且没有遗漏。它里面包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖等,在后面的白盒测试实例中会较详细的分析。路径测试是在程序控制流图的基础上,通过分析得到基本的可执行路径的集合,设计的测试用例要保证基本可执行路径的集合中每条语句都要被至少执行一次。3白盒测试实例先通过一个实例来了解逻辑覆盖以及路径测试程序代码:VoidTesting(intx,inty,intz){inta=0,intb=0,intc=0;if((x3)&&(z10)){a=1;}If(x==4||y5){b=2;}c=3;}根据程序代码我们能够得到程序的流程图如图1图1程序流程图(1)语句覆盖设计若干个测试用例,使得程序的每一条可执行语句都能够被至少执行一次。在该实例中,执行语句块有三个,故而只需设计能够执行这三条语句的测试用例即可。通过分析可以知道“x=4,y=5,z=6”该测试用例满足语句覆盖。语句覆盖能够很直观地从程序的源代码里得到测试用例,但是这样的测试用例只覆盖到了每一条可执行的语句,并没有考虑到判定表达式取其他的情况,不能发现某些错误,故而在逻辑覆盖准则里,语句覆盖是最弱的,也是最不充分的。(2)判定覆盖由于语句覆盖太过于不充分,因而出现了判定覆盖,判定覆盖旨在设计测试用例,使得程序的每个判定表达式都能够至少取一次真值与一次假值,即每个判断的真假值都被至少取到过一次。在该实例中有两个判定的表达式,因而需要设计测试用例,使得两个判定表达式都取到一次真值与一次假值。通过分析我们得到x=4,y=5,z=11这个测试用例包括了一个判断均取真值的情况一个取假的情况,这样继续设计测试用例就需要包括一个判断均取假值的情况以及另一个判断取真值的情况,故而2.x=2,y=5,z=5判定覆盖较语句覆盖更为的完善,因为每个判定的分支都执行过了,故而满足了语句覆盖,但是并没有执行过两个条件均取真值的情况,因而并不充分,所以有了条件覆盖较为完善得设计测试用例。(3)条件覆盖上述讲到判定覆盖也不是太充分,所以条件覆盖指的是要使判定表达式的各个条件均分别取真值或假值个至少一次。分析上述实例可以得到共有四个条件,,分别为X3,Z10,X=4,Y5,根据条件覆盖可以得到三个测试用例分别为1:x=4,y=6,z=5;2:x=2,y=6,z=5,;3:x=4,y=5,z=15;这三个测试用例覆盖了上面的四个条件,在执行的过程中我们会发现这三个测试用例虽然满足条件覆盖,但是第二个判断表达式并没有取过假值,故而我们发现条件覆盖并不一定能过包含判定覆盖,这种覆盖方式也同样不充分,所以有一种新的覆盖方式,将判定覆盖于条件覆盖结合在一起使用使程序的测试更加完善。(4)判定条件覆盖上述中条件覆盖的测试用例并没有将判定覆盖包含在内,所以在设计测试用例的时候让它同时满足判定覆盖以及条件覆盖,这样的方式较前两种更为充分一些针对上述的实例我们可以设计测试用例为1:x=4,y=6,z=5;2:x=2,y=5,z=15,;这两个测试用例包含了四个条件各自取一次真值一次假值程杰俊:白盒测试技术综述的情况,同时也包括了判定覆盖的要求,故而判定条件覆盖更为的充分一些,看上去条件覆盖更为充分,实则不然,在判定表达式X3&&Z10里,当X不满足条件,即X3取假时判定表达式即取假值,根本不管Z的取值,所以并没有判断Z的值,这时程序不能发现一些逻辑的错误了,同样判定条件覆盖也同样不够充分。(5)条件组合覆盖条件组合覆盖为设计足够多的测试用例,使得各个判定表达式中各个条件取不同值的各种可能组合至少出现一次,在上述的实例中有两个判定表达式,各有两个条件,所谓条件组合,即为每个判定表达式中的条件取真假值,然后进行笛卡尔积,经过笛卡尔积后我们能得到各个条件的组合,根据组合来设计测试用例。条件总共有四个,分别设为1,2,3,4,取真为T,假为F,可以得到这些条件组合T1T2,T1F2,F1T2,F1F2,T3T4,T3F4,F3T4,F3F4,共八个,条件1,2为第一个判定表达式的,3,4,为第二个判定表达式。设计测试用例为:T1T2T3T4:x=4,y=6,z=5;T1F2T3F4:x=4,y=5,z=15;F1T2F3T4:x=2,y=6,z=5;F1F2F3F4:x=2,y=5,z=15;则可分别在前四个条件取一个,后四个条件取一个,保证每个组合都取到即可。条件组合覆盖包含了判定覆盖以及条件覆盖,较为充分,但是一旦程序中判定条件增多,条件组合将会增加非常多,所需要的测试用例数量也是巨大的。在实际的测试中我们要根据测试对象来选择覆盖方式,从而设计优质的测试用例。路径测试根据上方的程序流程图可以将其映射成控制流程图如下由图可以得到有三条独立的路径3711,35711,37911有两种得到路径总数的方法,其一按照公式环路的复杂性为:V(G)=E-N+2其中E为边的数目,N为结点数。其二按照公式:V(G)=p+1P为控制流图里面判定结点的数目。环路的复杂性为构成独立路径的上界。即环路复杂性为多少即独立路径有多少条。故而能够设计三个测试用例来进行测试:1:x=2y=3z=4;2:x=5y=3z=4;3:x=2y=6z=15;这三组测试用例满足路径测试通过这个实例我们了解了各种的测试方法都不是完全完备的,如何正确地选择方法来设计优质的测试用例是每个测试人员所需具备的素质,在合适的案例里选择合适的方法,使得设计的测试用例足够优质,以尽可能少的测试用例来发现程序中所出现的缺陷。4结论白盒测试在软件测试里是很重要的一项测试技术。能够发现代码中存在的一些错误,白盒测试技术较黑盒测试技术较为麻烦,但是往往能够发现一些错误,在软件测试中应用较多,虽存在一些技术性,却不可或缺。白盒测试的一些方法往往需要测试人员对代码了解程度较高,对程序的结构有较为深入的了解,由于程序内部逻辑的不确定性因素较多我们不能够将每一种可能都给做成一个测试用例,利用白盒测试的方法能够以较少的测试用例来发现较多程序存在的错误。白盒测试技术只是测试程序内部的错误,并没有测试需求是否完整,所以通常情况下需与黑盒测试结合在一起,这样才能更好地发现程序的缺陷,从而保证软件的质量。参考文献[1]佟伟光,软件测试[M],北京:人民邮电出版社,2015.[2]刘洋,“白盒测试技术概述”,《广西大学学报》,2008,33(增):146~149.[3]徐青翠、柴政,“白盒测试技术方法与研究”,《电脑科学与技术》,2010,6(16):4431~4432,4435.