浅谈白盒测试技术
某 某
(**,**,** **)
关键字 白盒测试 逻辑覆盖 测试方法
ON THE WHITE-BOX TESTING TECHNIQUES
Mou Mou
(**,**,** **)
一、引 言
近年来,软件质量关注度日益提高,软件测试已经成为了软件工程中一个非常重要的热点话题。软件测试时伴随着软件工程技术的发展起来的,然而,由于软件规模的不断增大,软件模块之间以及不同软件系统之间的联系变得更为错综复杂,原有的软件测试方法已不能满足测试需求。系统化的软件测试方法应运而生。目前,可以通过三种典型的方法对软件进行测试:黑盒测试、白盒测试以及灰盒测试。其中白盒测试是一种非常行之有效的测试手段,在程序的编写过程中,代码的笔误是随机且无可避免的,因此,需要通过白盒测试方法达到提高软件质量的目的。
二、白盒测试
1、白盒测试的概念
白盒测试是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。白盒测试一般用来分析程序的内部结构,对测试者而言是透明的,测试者可以看到被测程序源代码,并分析其内部结构。因此,白盒测试也叫结构测试或透明测试。
2、白盒测试的策略
- 桌前检查(Desk check)。
- 单元测试(Unit testing)。
- 代码评审(Code review)。
- 同行评审(Peer review)。
- 代码走查(Walkthrough)。
- 静态分析(Static analyse)。
3、白盒测试的原则
- 保证一个模块中所有独立路径至少被使用1次。
- 对所有逻辑值需测试true和false。
- 在上下边界及可操作范围内运行所有循环。
- 检查内部数据结构以确保其有效性。
4、白盒测试的实验步骤
- 测试计划阶段:根据需求规格说明书,制定测试计划。
- 测试设计阶段:依据详细设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。
- 测试执行阶段:输入测试用例,执行测试,得到测试结果。
- 测试评审阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。
5、代码质量的度量方法
代码行:代码行(Lines-of-code, LOC)[3]的计算通常是针对可执行语句,用程序中的代码行多少来表示程序大小和复杂性。
Halstead软件科学法:Halstead从计算机科学中区分出软件科学.其把编程任务看作是由有限书库的程序富豪的选择和安排组成,这些符 是编译器可区分的基本语法单位。根据软件科学,计算机程序被看作是符 的集合,这些符 主要分为运算符和运算元.
结构度量:结构度量是将产品或系统中模块间的交互量化的方法.最常用的设计结构度量是扇人(fan-in)和扇出(fan-out)度量。
扇人:调用给定模块的模块数目;
扇出:给定模块所调用的模块数。
6、白盒测试方法
(1)代码检查法
代码检查主要针对代码的设计、标准依从、逻辑表达和结构等方面进行检查,常规的检查方式有桌面检查、代码审查和走查三种方式。代码检查应在编译和动态测试之前进行,其优势是能够快速发现大量软件逻辑设计和编码缺陷,而且代码检查找到的是缺陷本身而非其表现形式,劣势是耗费大量时间,而且对检查者自身积累的知识和经验要求较高。
(2)静态结构分析法
测试者通过测试工具对程序源代码的系统结构、数据结构、数据接口、内部控制逻辑等内部结构进行分析,进而生成函数调用关系图、模块控制流图、内部文件调用关系图、子程序、表、宏和函数参数表等各类图形图表。通过静态结构分析可以明确软件系统的组成和结构,便于测试者对其阅读及理解,通过对图形图表进行深入分析,判断软件是否存在缺陷或错误[3]。
(3)静态质量度量法
ISO/IEC 9126国际标准将软件质量分为六个方面,包括:功能性、可靠性、可用性、有效性、可维护性和轻便性。以ISO 9126质量模型作为基础,我们可以构造质量度量模型,用于评估软件的每个方面[6]。
(4)逻辑覆盖法
针对逻辑覆盖法,覆盖准则是对“测试执行到合适才是足够的定量回答,作为测试软件的一种度量标准,描述程序源码被测试程度。包含语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖等6中方法。
(5)基本路径测试法
基本路径测试法是在程序控制流图的基础上,首先对控制构造的环路复杂性进行分析,其次将可执行路径集合导出,最后以此为基础设计科学合理的测试用例。基本路径测试法要求所设计的测试用例在被测程序的每个可执行语句至少执行一次。针对复杂条件,可以将其分解成为多个单一条件,并通过组合映射成控制流图。
(6)其他白盒测试法
白盒测试方法还有域测试、符 测试、Z路径覆盖等方法。域测试是一种基于程序结构的测试方法,主要是针对域错误进行的程序测试。符 测试的基本思想是允许程序的输入不仅仅是具体的数值数据,而且包括符 值。Z路径测试是将程序中的循环次数加以限制,通常为循环I次或。次,这样就将循环结构变为分支结构,Z路径测试能有效降低被测程序的路径数。
三、逻辑覆盖测试方法
覆盖率测试用例设计方法是一种常用的白盒测试方法。覆盖率不是目标,只是一种手段。测试的目标是尽可能地去发现错误,去寻找被测试对象与规定的不一致的地方。
目前,比较常用的覆盖测试用例方法包括语句覆盖、判定覆盖、条件覆盖、组合覆盖、路径覆盖。为了便于理解,这里结合一个实例来分析讲解这几种方法。伪代码如下:
1—- Input (A, B)
2—- If (A >= 20 and B >= 20)
3—- C = A + B
4—- Else
5—- If (A + B >= 30 and (A >=25 or B >=25))
6—- C = A – B
7—- Else
8—- C = A / B
9—- Endif
10– Output(C)
1、语句覆盖
(1)主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多测试用例,使得程序中每条语句至少被执行1次。
(2)测试用例:
表1 语句覆盖测试用例表
测试用例 |
A |
B |
路径 |
1 |
30 |
10 |
MBCN |
(3)优点:可以直观地从源代码得到测试用例,无须细分每条判定表达式。
(4)缺点:这种测试方法仅仅针对程序逻辑中显示存在的语句,但对隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。在本例中路径A就没有执行。对于多个if-else判断时,这种现象很明显,语句对于多个分支的逻辑运算时无法全面反映的,对于do-while语句,可能仅仅只运行一次,而不考虑其他情况。
2、判定覆盖
(1)主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次问假值,即:程序中的每个分支至少执行一次,每个判断的取真、取假至少执行1次。
(2) 测试用例:
表2 判定覆盖测试用例表
测试用例 |
A |
B |
路径 |
1 |
30 |
30 |
MAN |
2 |
30 |
10 |
MBCN |
3 |
10 |
10 |
MBDN |
(3)优点:对分支考虑的比较全面具体。
(4)缺点:未考虑到条件中真假不同的情况。
3、条件覆盖
(1)主要特点:条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。
(2)测试用例:
表3 条件覆盖测试用例表
测试用例 |
A |
B |
路径 |
1 |
30 |
10 |
MBCN |
2 |
10 |
30 |
MBCN |
3 |
10 |
10 |
MBDN |
(3)优点:每条语句中各条件的真假都有测试。
(4)缺点:未考虑到条件中真假不同的情况。
4、判定/条件覆盖
(1)主要特点:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。
(2)测试用例:
表4 判定/条件覆盖测试用例表
测试用例 |
A |
B |
路径 |
1 |
30 |
30 |
MAN |
2 |
10 |
30 |
MBCN |
3 |
10 |
10 |
MBDN |
(3) 优点:覆盖/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。
(4) 缺点:覆盖/条件覆盖准则的缺点是未考虑到条件的组合情况。
5、条件组合覆盖
(1)主要特点:更强的逻辑覆盖标准。
(2)测试用例:
表5 条件组合覆盖测试用例表
测试用例 |
A |
B |
路径 |
1 |
30 |
30 |
MAN |
2 |
10 |
30 |
MBCN |
3 |
10 |
10 |
MBDN |
(3)优点:满足条件组合覆盖的测试数据必然满足判定覆盖、条件覆盖和判定/条件覆盖准则。
(4)缺点:线性增加了测试数据的数量;满足条件覆盖标准的测试数据并不一定能使程序中的每条路径都覆盖。
6、路径覆盖
(1)主要特点:设计足够多的测试用例,覆盖程序中所有可能的路径。
(2)测试用例:
表6 路径覆盖测试用例表
测试用例 |
A |
B |
路径 |
1 |
30 |
30 |
MAN |
2 |
30 |
10 |
MBCN |
3 |
10 |
10 |
MBDN |
(3)优点:对程序进行了更为彻底的测试,覆盖面广。
(4)缺点:由于路径覆盖需要对所有可能的路径进行测试,这样一来需要设计大量、复杂的测试用例,使得工作量呈指数增大,而在有些情况下,一些执行路径是不能被执行的,如:
If(!A)C++;
If(!A)D++;
这两条语句实际值只包括了2条执行路径,即A为真或假时候对C和D的处理,真或假不可能都存在,而路径覆盖测试,则认为是包含了真与假的4条执行路径,这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。
四、结 论
白盒测试是一种被广泛使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试,但是贯穿在程序内部的逻辑存在着不确定性和无穷性,尤其对于大规模复杂软件,因此我不能穷举所有的逻辑路径,即使穷举也未必会带来好运。
那么正确使用白盒测试,就要先从代码分析人手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的,逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径。
参 考 文 献
[1] 王冠基本路径测试中的Mc;Cabe算法改进及应用田哈尔滨理工大学学 ,2010, 15 (1) :48.
[2] 全春灵基本路径法测试_典型排序程度的测试用例设计田山西师范大学学 :自然科学版,2004, 19 (1) :92.
[3] 刘洋.白盒测试技术概述[J].广西大学学 (自然科学版),2008,33(S1) :146-149.
[4] 张少龙.白盒测试[D]:西安财经学院,2011.
[5] 杜庆峰,李娜白盒测试基路径算法[Pl.计算机工程.2009(15).
[6] 刘慧梅,徐华宇.软件测试中代码分析与插装技术的研究[[J].
[7] 田鹏,张文博,过峰.浅析白盒测试技术与方法[J].电子科学技术,2015,02(03):329-333.
[8] 佘凤.软件测试中白盒测试覆盖方法[J].电子商务,2012(12):59-60.
[9] 张炯.软件测试用例设计方法研究[J].计算机光盘软件与应用,2012,15(21):211-212.
[10] 卫延伟. 白盒测试系统的设计与研究[D].华中师范大学,2013.
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!