从被测试对象的角度分类,测试方法可以分为黑盒测试、白盒测试、灰盒测试三种,这也是我们最常看到的分类方法。
任何一个程序在测试时都由这几部分组成:输入、程序的处理过程和输出三部分,如图1-1 所示。黑盒测试是指在整个测试过程中只关注输入和输出,如果输入一个测试数据,输出的结果是正确的,我们就认为这个功能是正确的。如输入测试数据(2,2),结果如果输出为4,就认为是正确的,其中程序是如何处理的,测试工程师并不关注,这里有可能是2×2、2+2,也可能是22。当然如果不知道程序是怎么处理的,那么再另一组数据后,可能得到的结果就不一定正确了,如输入(3,3),那结果就不一定会正确了。
白盒测试与黑盒测试不同的地方是,白盒测试不仅仅关注输入与输出的结果是否正确,同时还关注程序是如何处理的,同样是上面的例子,输入测试数据(2,2),白盒测试不仅仅关注测试结果是否为4,同时还关注这个程序的内部逻辑处理过程。
关于黑盒测试和白盒测试其实还像社会的两种人,黑盒测试就相当于黑道,白盒测试就相当于白道。黑道的老大如果要解决什么事情,他们会派下属去处理,并且老大只关注结果,至于中间是如何处理的,与他没有关系。而白道的人即我们说的公务员,他们对办事的整个流程或法律体系都很了解。举个例子,你亲戚和别人打架了,把别人打了,你第一件事不会去报案,而是联系朋友看法院、派出所或其他的相关部门是否有熟人,因为这些人对法律流程很熟悉,他们很清楚如何将你亲戚的责任最小化。
但是这个社会还有一类人,是黑白通吃的,这就是我们测试分类里面的灰盒测试,灰盒测试是界于黑盒测试和白盒测试之间的一种测试。之所以存在灰盒测试,是因为按测试阶段来划分,整个测试的流程包括单元测试、集成测试、系统测试,而白盒测试对应单元测试,黑盒测试对应系统测试,那么在正确的测试过程中,应该是先测试单元模块,单元模块测试完成之后,并没有立即进入系统测试,而是集成测试,这个时候其使用的方法就是灰盒测试,即我们测试完成单个模块后,虽然单个模块没有问题,但并不代表这些模块组合在一块时就一定没有问题。那么要验证这些功能模块组合在一起有没有问题,这就是我们说的集成测试,其使用方法就是灰盒测试。
从某种角度来说,白盒测试显然比黑盒测试更全面,因为他们不仅关注测试结果,还注重程序内部的逻辑结构,所以有人提出为什么不能只有白盒测试就可以呢?答案显然是肯定的。讨论这个极端的问题,其反过来的问题就是黑盒测试的内容有哪些是白盒测试不可能做到的。我们说黑盒测试是更接近用户使用的测试,所以关于用户使用流程、易用性等方面并不是白盒测试可以测试到的,也就是如果白盒测试没问题后,并不能保证程序的易用性、界面显示、业务流程等内容就一定没有错误。同样的道理,显然只有黑盒测试也是不够的,因为黑盒测试虽然可以更好地站在用户的角度进行测试,但黑盒测试并不能像白盒测试那么有效地测试程序内部结构。所以不能极端地认为只有白盒测试或只有黑盒测试可以测试好系统。
所以现在一个完善的测试体系中有这三类方法:黑盒测试、白盒测试、灰盒测试。只有将这三种完美的结合起来,才能更好的保证系统的质量。从软件测试发展的历程来看,包括国内软件测试,其实都是先有黑盒测试才有白盒测试,不可能先做白盒测试再做黑盒测试,并且在现阶段国内很少公司做白盒测试,之所以出现这种情况是因为白盒测试对测试工程师的技能要求会高出许多,同时还有一个原因是因为当前国内软件测试发展还是处于初级阶段,所以白盒测试开展的并不理想。