第一章 白盒测试
简介
白盒测试(White-Box Testing)是常用的软件测试方法之一,白盒测试的概念是与黑盒测试相对的概念。白盒测试和黑盒测试都是软件测试的手段之一,在测试过程中两者互为补充,共同来保证软件的质量。
17.1 初识白盒测试
17.1.1 什么是白盒测试
在前面的章节中我们学习的测试方法一般都是黑盒测试方法。黑盒测试主要是对可执行程序或系统进行的功能和非功能特性测试。在做黑盒测试的时候,把程序看做是一个黑盒子,设计测试用例后,加载到系统上,记录系统的实际输出结果。把输出结果同预期结果进行比较,来判断测试是否通过以及系统中是否存在缺陷。这种测试方法主要是在系统测试阶段采用,而测试需要贯穿产品开发过程的始终。白盒测试最适合在编码阶段采用,在单元测试和集成测试阶段更多地也是采用白盒测试。那为什么要做白盒测试呢?
1. 白盒测试的概念
白盒测试是测试被测单元内部如何工作的一种测试方法。它允许测试人员根据程序内部逻辑结构及有关信息来设计和选择测试用例,对程序的逻辑路径进行测试。基于一个应用代码的内部逻辑知识,该测试可覆盖全部代码、分支、路径和条件等。
2. 黑盒测试的概念
黑盒测试是测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试也被称为行为测试、分隔测试或逻辑驱动测试。黑盒测试除了关注系统的功能外,其他的非功能性测试也属于黑盒测试的范畴。
黑盒测试主要可能发现系统中的下面几类错误:
1) 界面错误。
2) 功能不正确或功能遗漏。
3) 外部数据库访问错误。
4) 性能问题。
5) 系统初始化和终止错误。
6) 系统接口错误等。
白盒测试可发现程序代码中逻辑结构、数据类型、算法、异常处理等错误。
17.1.2 为什么做白盒测试
原因如下:
1) 黑盒测试不能对程序源代码进行测试,有时虽然在黑盒测试中没有发现问题,但是并不能说明程序代码中没有缺陷了。
2) 程序代码中如果存在着一些内存泄漏,在测试中运行时间短并不能发现问题,但是在系统长时间运行后,由于内存泄漏的积累,导致整个系统内存消耗殆尽,最后瘫痪。
3) 程序中往往存在着很多的异常处理分支语句,在黑盒测试时,有些分支可能并没有测试到。没有测试到的代码不能保证其运行正确。在系统运行过程中,如果执行到这些分支语句,很可能出现问题。
4) 在测试过程中,白盒测试执行了多少分支和语句,可以作为衡量测试是否完整的一个指标。
5) 有时异常或错误情况在实验室条件中很难满足条件,这时需要白盒测试的方法分析源代码:何时能够触发这些代码运行,触发条件是否合理,能否达到要求。例如通讯中受干扰的现象,宇宙飞船和航天飞机、卫星等在太空中受电磁辐射等。
例1:我们在编制《软件测试工程师管理系统——Windows版》时,在处理月收入编辑框中输入的信息时,要求是可输入10位长度的浮点数据,而有的同学在处理数据时使用了下面的语句:
GetDlgItemText(hDlg,IDC_EDITBENEFIT,buffer,9);
MonthBenefit=(float)atof(buffer);
分析上面的程序语句,可以看出在读取数据时,只读取了前面的9位,这样如果在测试时没有使用10位数据进行测试,则很难发现这种缺陷。即使使用了10位数据,由于后面是一个小数,浮点运算本来就有误差,这时很可能就疏忽了这种缺陷。
例2:程序中使用了一个经过运算处理后的数据作为除数进行运算,如下面的代码:
float Div=1.0;
…
if (Div==0) {
printf("除数为0,退出") ;
return;
}
else {
mod=BeDiv/Div;
}
分析上面的代码,可以看出虽然对除数进行了判断,但是判断方法是不正确的。因为除数是一个浮点数据,当其值很小时,结果很可能溢出。不阅读代码一般很难发现这种缺陷。而如果程序中没有对除数进行判断,在系统运行测试中可能不会出现除数为0的情况,也就发现不了问题,而在系统交付使用后,在某些条件中很可能出现除数很小造成除法结果溢出的情况。这些错误都是黑盒测试中难于发现的。
17.1.3 白盒测试和黑盒测试比较
白盒测试和黑盒测试是两种不同的测试设计方法,两种测试方法从不同的角度出发,对软件进行测试。黑盒测试设计将系统看做一个“黑盒子”,因此,一般不关注系统的内部结构。通常认为黑盒测试设计关注功能需求和非功能需求方面的测试,而白盒测试设计深入到“盒子内部”,把盒子看做是透明的白盒子,关注软件的结构和逻辑细节,并依次进行测试用例的设计。
1. 白盒测试和黑盒测试的不同点
Ø 白盒测试一般需要源代码。而黑盒测试一般不需要源代码,有可执行程序文件即可。
Ø 白盒测试往往不需要运行程序,而黑盒测试往往需要运行程序。
Ø 白盒测试关心的是程序中的代码、结构和逻辑,而黑盒测试关注的是功能、非功能需求。
Ø 从测试依据看,黑盒测试依据用户能够看到的规格说明书设计测试用例。而白盒测试依据程序的内部结构,例如语句的控制结构、模块间的控制结构以及内部数据结构等设计测试用例。
Ø 从测试特点看,黑盒测试的特点是能够站在用户立场上进行测试,缺点是不能测试程序内部的特定部位,并且如果规格说明中存在错误,则无法发现。而白盒测试正好相反,其特点是能够对程序内部的特定部位进行覆盖测试,但是存在无法检验程序的外部特性的缺点,并且对没有实现规格说明的程序欠缺部分也无法测试。
Ø 从测试方法看,黑盒测试多使用等价类划分法、边界值分析法、因果图法、错误猜想法等,白盒测试主要使用语句覆盖、判定覆盖、条件覆盖、路径覆盖等覆盖测试方法。
2. 白盒测试和黑盒测试的相同点
Ø 单独使用黑盒测试或白盒测试都不能将软件中的错误全部发现,如果要求被测软件“做了所有该做的事,却没有做一点不该做的事”,就需要把两者结合起来使用。
Ø 白盒测试和黑盒测试往往结合起来,有时称为"灰盒测试"。例如覆盖率测试中,通过加载黑盒测试用例运行程序,而通过工具或其他方式查看程序代码的执行情况。如果程序中有代码没有执行到,说明黑盒测试用例设计不充分。
Ø 白盒测试需要对程序的内部实现十分熟悉,而黑盒测试是完全基于对系统需求的了解。这两种测试方法也应用于软件开发的不同阶段。传统的软件测试过程一般分解为下面的4个过程,单元测试、集成测试、系统测试和验收测试。
17.1.4 白盒测试的测试策略
白盒测试主要针对程序源代码。在软件过程的不同阶段,不同的团队都可能采用白盒测试的方法进行测试。一个软件的研发过程如何做好白盒测试呢?可以采取下面的策略。
1. 桌前检查(Desk Check)
在开发过程中由开发人员编写的一段代码,可能是一个函数或几个函数,也可能是一个类。这需要自己做代码检查,也称为桌前检查。这个过程并不需要运行程序,只是用眼睛检查代码,找出其中的错误,并修正错误。这个过程中如果需要也进行代码规则检查,检查编写的代码是否满足代码编写规范。当然如果有工具辅助进行代码规则检查会更好。
2. 单元测试(Unit Testing)
在代码检查后,需要进行单元测试。单元测试一般由程序员自己来做。单元测试往往需要编写桩模块和驱动模块。桩模块是测试单元程序需要调用的程序模块,一般需要模拟输入和模拟输出。驱动模块是由于被测试单元不能单独运行,往往需要一个上层模块传送参数或输入数据后,被测试单元才能运行。单元测试往往采用白盒测试和黑盒测试相结合的方法。有时白盒测试也需要测试人员的参与,做整个单元测试或对开发人员进行技术支持。
3. 代码会审(Code Review)
代码会审往往是在编写代码的初期或编写过程中采用的一种有同行参与的代码走查活动。代码编写初期有些程序员在编写代码时往往通过组织其他程序员共同查看程序,来找出问题,这样会使大家编写的代码风格一致或遵守代码编写规范。或者程序员在编写代码过程中,发现了问题,通过组织大家一起阅读代码,来很快地解决问题。这有利于提高解决问题的效率。因此,可以采用大家共同阅读代码的方法也可以采用开发人员讲解代码,其他同行边听边分析问题的方法进行代码会审。这个过程也可称为同行评审(Peer Review)。
4. 代码走查(Walkthrough)
如果由测试小组组织进行代码走查,需要开发人员提交有关的资料文档和源代码给测试人员,并进行必要的讲解。这样需要配置更多的人力资源单独进行测试。但正是因为测试人员的参与,才可能从不同的角度发现软件缺陷。
5. 静态分析(Static Analyze)
静态分析通常由测试小组来进行,静态分析通常需要有辅助工具来支持。静态分析通过提取代码信息,统计分析代码,结果来对源代码进行质量评估。代码规则检查也是静态分析的一个方面。
上面的测试策略,可能根据项目不同或公司情况不同而有所不同。而且组织形式和参加人员也可能不同。无论采取上面的哪种或几种方式,目的都是尽量提高代码本身的质量。
17.1.5 白盒测试的目的和意义
1. 白盒测试主要内容
1) 保证一个模块中的所有独立路径至少被执行一次。
2) 对所有的逻辑值均需要测试真、假两个分支。
3) 在上下边界及可操作范围内运行所有循环。
4) 检查内部数据结构以确保其有效性。
白盒测试的目的是测试源代码,从而提高代码的质量,并保证测试覆盖程序中的所有代码。白盒测试往往同黑盒测试相结合进行,从而保证系统的正确性。
2. 如何做好白盒测试
在黑盒测试中积累经验,如果被测试软件有源代码,最好把黑盒测试发现的错误定位到源代码上。这样日积月累,就会知道代码容易犯错误的地方,哪些地方要着重分析代码等。
17.1.6 白盒测试相关
1. 做白盒测试需要开发部门提供的材料
如果由第三方来做白盒测试,则开发方必须提供软件源代码、用户文档、使用指南、系统软、硬件环境、所有功能的具体设计和操作说明等。关键是软件源代码。但是还需要其他的文档资料,来帮助测试人员了解系统、了解功能等。
2. 常用的测试用例设计技术
1) 逻辑覆盖测试
2) 基本路径测试
3) 数据流分析
4) 信息流分析
3. 白盒测试的结果
白盒测试结果信息中包括图、表、数据库中的统计信息等。如果进行单元测试,则需要编写单元测试报告。如果是静态分析,往往工具自动给出一个质量报告。
4. 测试工具在白盒测试中所起的作用
据统计,在软件测试中发现问的题有70%-80%是通过人工测试发现的,虽然在黑盒测试阶段也需要大量的人工测试,但是因为白盒测试需要很大的工作量,往往需要耗费大量的人员和时间等,所以最好有测试工具的支持,以减少人员工作量。
5. 白盒测试对测试人员的要求
因为白盒测试主要是对程序源代码进行分析,所以常常需要有丰富经验的测试人员。测试人员最好了解编程技术、编程语言和方法,有编程方面的经验,这样更有利于发现代码中的错误。

