第 33卷 增 刊
2008年 6月
广西大学学报(自然科学版)
Journal of Guangxi University(Nat Sci Ed)
Vo1.33,Sup.
June,2008
文章 编号 :1001-7445(2008)增-0146-04
白盒测试技术概述
刘 洋
(北大青鸟南宁状元廊中心,广西 南宁 530004)
摘要 :白盒测试又称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试.白盒测试是测试被测单元内
部如何工作的一种方法.其 目的是通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试.本文介
绍6种白盒测试方法和适用场合:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖.
关键词 :白盒测试;逻辑覆盖测试;循环覆盖测试
中图分 类号 :TP307 文献标识码 :A 、
white box testing overview
LIU Yang
(Beijing APTECH Beida Jade Bird Information Technology Co,LTD)
Abstract:W hite box testing,or structure testing,is a kind of test which is based on code
testing or logic drive test.White Box Testing (WBT )is a method to test how the tested
unit works in order to operate testing in logic path in the soft wares.This paper introduces
six W BT methods and occasions to apply for,which include:statement coverage,decision
coverage,condition coverage,decision—conditions coverage,branch condition combination
coverage and path coverage.
Key words:W hite Box Testing;logic coverage;loop coverage
白盒测试是测试被测单元内部如何运作的一
种方法.其 目的是通过检查软件内部的逻辑结构,
对软件中的逻辑路径进行覆盖测试;在程序不同
的地方设立检查点,检查程序的状态,以确定实际
运行状态与预期状态是否一致.它允许测试人员
对程序内部逻辑结构及有关信息来设计和选择测
试用例,对程序的逻辑进行测试,提高代码质量.
由于逻辑错误和不正确假设与一条程序路径
被运行的可能性成反比.由于相信某逻辑路径不
可能被执行,而事实上,它可能在正常的情况下
被执行.由于代码中的笔误是随机且无法杜绝的,
因此要进行 白盒测试.
1.1 自盒测试的策略
(1)桌前检查 (Desk check).
(2)单元测试(Unit testing).
(3)代码评审(Code review).
(4)同行评审(Peer review).
(5)代码走查(Walkthrough).
(6)静态分析(Static analyse).
1.2 白盒 的测试的原则
(1)保证一个模块中的所有独立路径至少被
使用1次.
(2)对所有逻辑值均需测试 true和 false。
(3)在上下边界及可操作范围内运行所有循
环.
(4)检查内部数据结构以确保其有效性.
i 收稿B期 :2008—03—04;修订B期:2008—04—23
作者简介:刘 洋(1979一),男,湖南几,北大青鸟南宁状元廊中心助理工程师;E—mail:draculax@263.net.
维普资讯
增刊 刘 洋:白盒测试技术概述 147
1.3 自盒测试的实施步骤
(1)测试计划阶段:根据需求规格说明书,制
定测试计划.
(2)测试设计阶段:依据详细设计说明书,按
照一定规范化的方法进行软件结构划分和设计测
试用例。
(3)测试执行阶段:输入测试用例,执行测
试,得到测试结果.
(4)测试评审阶段:对比测试的结果和代码
的预期结果,分析错误原因,找到并解决错误.
1。4 代码质量的度量方法
(1)代码行.代码行(Lines-of-code,LOC)的
计算通常是针对可执行语句.用程序中的代码行
多少来表示程序大小和复杂性.
(2)Halstead软件科学法.Halstead从计算
机科学中区分出软件科学.其把编程任务看作是
由有限书库的程序富豪的选择和安排组成,这些
符号是编译器可区分的基本语法单位.根据软件
科学,计算机程序被看作是符号的集合,这些符号
主要分为运算符和运算元.
(3)结构度量.结构度量是将产品或系统中
模块间的交互量化的方法.最常用的设计结构度
量是扇入(fan—in)和扇出(fan—out)度量.
扇入.调用给定模块的模块数目;
扇出.给定模块所调用的模块数.
(4)圈复杂性(McCabe).McCabe的圈复杂
性测度被用来量化程序的可测性和可理解性.该
理论来源于经典图论中的圈数,也就是图中区域
数.
2 逻辑覆盖测试方法
首先为了下文的举例描述方便,这里先给出
一 张程序流程图.
2.1 语句覆盖
(1)主要特点.语句覆盖是最起码的结构覆盖
要求,语句覆盖要求设计足够多的测试用例,使得
程序中每条语句至少被执行 1次.
(2)用例设计.(如果此时将A路径上的语句 1
一T去掉,那么用例如下)
(3)优点。可以很直观地从源代码得到测试用
例,无须细分每条判定表达式。
(4)缺点.由于这种测试方法仅仅针对程序逻
辑中显式存在的语句,但对于隐藏的条件和可能到
达的隐式逻辑分支,是无法测试的.在本例中去掉
了语句 1一T去掉,那么就少了一条测试路径.在if
结构中若源代码没有给出else后面的执行分支,那
么语句覆盖测试就不会考虑这种情况.但是我们不
能排除这种以外的分支不会被执行,而往往这种错
误会经常出现.再如,在Do—whi1e结构中,语句覆
盖执行其中某一个条件分支.那么显然,语句覆盖
对于多分支的逻辑运算是无法全面反映的,它只在
乎运行一次,而不考虑其他情况.
2。2 判定覆盖
(1)主要特点.判定覆盖又称为分支覆盖,它要
求设计足够多的测试用例,使得程序中每个判定至
少有一次为真值,有 次为假值,即:程序中的每个
分支至少执行一次.每个判断的取真、取假至少执
行 1次.
(2)用例设计.
X
h— —
90
50
9O
Y
- — —
90
50
70
路径
OAE
OBDE
OBCE
(3)优点.判定/条件覆盖满足判定覆盖准则和
维普资讯
148 广西大学学报(自然科学版) 第 33卷
条件覆盖准则,弥补了二者的不足。
(4)缺点.判定/条件覆盖准则的缺点是未考虑
条件的组合情况.
2.3 条件覆盖
(1)主要特点.条件覆盖要求设计足够多的测
试用例,使得判定中的每个条件获得各种可能的结
果,即每个条件至少有一次为真值,有一次为假值.
(2)用例设计.
(3)优点.显然条件覆盖比判定覆盖,增加了对
符合判定情况的测试,增加了测试路径.
(4)缺点.要达到条件覆盖,需要足够多的测试
用例,但条件覆盖并不能保证判定覆盖.条件覆盖
只能保证每个条件至少有一次为真,而不考虑所有
的判定结果.
2.4 判定/条件覆盖
(1)主要特点.设计足够多的测试用例,使得判
定中每个条件的所有可能结果至少出现一次,每个
判定本身所有可能结果也至少出现一次
(2)用例设计
(3)优点.判定/条件覆盖满足判定覆盖准则和
条件覆盖准则,弥补了二者的不足.
(4)缺点.判定/条件覆盖准则的缺点是未考虑
条件的组合情况.
2.5 组合覆盖
(1)主要特点.要求设计足够多的测试用例,使
得每个判定中条件结果的所有可能组合至少出现
一 次.
(2)用例设计
(3)优点.多重条件覆盖准则满足判定覆盖、条
件覆盖和判定/条件覆盖准则.更改的判定/条件覆
盖要求设计足够多的测试用例,使得判定中每个条
件的所有可能结果至少出现一次,每个判定本身的
所有可能结果也至少出现一次.并且每个条件都显
示能单独影响判定结果.
(4)缺点.线性地增加了测试用例的数量.
2.6 路径覆盖
(1)主要特点.设计足够的测试用例,覆盖程序
中所有可能的路径.
(2)用例设计
(3)优点.这种测试方法可以对程序进行彻底
的测试,比前面五种的覆盖面都广.
(4)缺点.由于路径覆盖需要对所有可能的路
径进行测试(包括循环、条件组合、分支选择等),那
么需要设计大量、复杂的测试用例,使得工作量呈
指数级增长.而在有些情况下,一些执行路径是不
可能被执行的,如:
If(j A)B++ ;
If(!A)D一一 ;
这两个语句实际只包括了2条执行路径,即A
为真或假时候对B和D的处理,真或假不可能都存
在,而路径覆盖测试则认为是包含了真与假的4条
执行路径.这样不仅降低了测试效率,而且大量的
测试结果的累积,也为排错带来麻烦.
3 循环覆盖测试方法
前文所述的测试均针对程序逻辑的,其主要建
立在分支的基础上,我们知道在程序中还使用另一
种控制结构 ,即循环语句.
循环语句可以分为以下 4种:简单循环、串接
循环、嵌套循环和不规则循环.
3.1 简单循环
维普资讯
增刊 刘 洋:白盒测试技术概述 149
对于以上2种简单循环,可以使用以下方法来
设计测试用例,其中Ⅳ 是允许通过循环的最大次
数:
(1)跳过整个循环.
(2)只有1次通过循环.
(3)M 次通过循环,其中M<Ⅳ.
(4)Ⅳ一1,Ⅳ 次通过循环.
3.2 嵌套循环
(1)从最内层循环开始,将其它循环设置为最
小值.
(2)对最内层循环使用简单循环,而使外层循
环的迭代参数(即循环计数)最小,并为测试范围外
的值或已经陪排除的值增加其他测试.
(3)由内向外构造下一个循环的测试,设置其
他的外层循环为最小值,并使其他的嵌套循环为
“典型”值.
(4)继续上述步骤,直到测试完所有的循环.
3.3 串接循环
如果串接循环的循环彼此独立,可以使用简单
循环的策略测试.但如果两个循环串接起来,并且
第一个循环是第二个循环的初始值,则这两个循环
并不是独立的.如果不独立,则推荐使用嵌套循环
的方法进行测试.
3.4不规则循环
不能测试,尽量重新设计成结构化的程序结构
后再进行测试.
4 总 结
自盒测试是一种被广泛使用的逻辑测试方法,
是由程序内部逻辑驱动的一种单元测试方法.只有
对程序内部十分了解才能进行适度有效的白盒测
试.但是贯穿在程序内部的逻辑存在着不确定性和
无穷性,尤其对于大规模复杂软件.因此我不能穷
举所有的逻辑路径,即使穷举也未必会带来好运
(穷举不能查出程序逻辑规则错误,不能查出数据
相关错误,不能查出程序遗漏的路径).
那么正确使用白盒测试,就要先从代码分析人
手,根据不同的代码逻辑规则、语句执行情况,选用
适合的覆盖方法.任何一个高效的测试用例,都是
针对具体测试场景的.逻辑测试不是片面的测试正
确的结果或是测试错误的结果,而是尽可能全面地
覆盖每一个逻辑路径.
参考文献 :
[1] (美 )Glenford J.Myers.The Art of Software
Testing,Second Edition[M].John Wiley&Sons,
2006.
[2] 朱少民.软件测试方法和技术[M].北京:清华大学出
版社 ,2005.
[3] 陈能技.软件测试技术大全[M].北京:人民邮电出版
社 ,2008.
(责任编辑 梁碧芬)
维普资讯