您的位置首页生活百科

简述白盒测试和方法

简述白盒测试和方法

的有关信息介绍如下:

简述白盒测试和方法

用最通俗说法解释,就是把软件程序比作一个完整盒子,白盒指盒子是敞开,内部机构和逻辑清晰可鉴,相对应的黑盒就指内部结构和逻辑是不可见的。而测试人员因为了解盒子的内部,就可以根据盒子结构逻辑原理去针对性的设计用例去测试,此类测试通常就被称为白盒测试也被称为代码测试。

因为测试人员了解程序内部代码逻辑结构、可以对所有代码逻辑路径进行测试验证,所以对测试人员的要求比较高,需要测试人员必须读懂代码,否则无法正常进行白盒测试。白盒测试工程师一般都是由部分开发人员或者测试开发工程师兼职。

白盒测试一般分为静态分析法和动态分析法两大类,下面我们对两类的白盒测试方法进行简单的介绍,方便大家对白盒测试有一个清晰的了解。

静态分析法是一种不执行程序而进行测试的技术。静态分析法的主要是检查软件的表示和描述是否一致,没有冲突或者没有歧义。具体通过两种手段实施:

1 )手动检查 :由测试人员进行代码走读分析,也称为code review。

2)自动检查 :使用code检查工具完成的静态分析。(如,Sonar等)

使用静态分析法进行测试,必须注意以下几点:

  ◆ 开发人员对检查过程必须采取积极和建设性的态度,否则检查会毫无效果。

  ◆ 把静态白盒测试的活动合理地融合到整体的开发进度计划中。

  ◆ 明确检查活动的工作流程,制定标准的工作文档,并且保留文档记录。

软件系统在模拟或真实环境中运行前、运行中以及运行后,对运行状态和结果进行分析。确认此系统在检查状态下是否正确运行。在动态分析技术中,最重要的技术是路径和分支测试。下面介绍六种覆盖测试方法。

语句覆盖

定义:

语句覆盖是最起码的结构覆盖要求,要求设计足够多的测试用例,使得我们设计的程序中每条语句至少被执行一次。

优点:

可以直观地从源代码中得到测试用例,无须关心每条判定表达式。

缺点:

由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支是无法测试的。

示例:

public class Test{

public static void main(String []args) {

int a,b,x;

x=b/a;

System.out.printf("the number is:%d",x);

}

}

输入:

a=2,b=0,x=3

结果:

使用以上的值,函数的代码覆盖率达到了100%,并且设计的case可以顺利通过测试。但显然该函数有一个很明显的bug,当 a=0 就会抛出异常,该错误语句未覆盖是测试不出问题。

判定覆盖

定义:

判定覆盖要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取True和取False各至少执行一次。

优点:

判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。

缺点:

大多数判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

示例:

if ((a>1)&&( b==0))

{

x= x/a;

}

if ((a==2) || ( x>1))

{

x =x+1;

}

输入:

a=3, b=0, x=2

a=2, b=2, x=5

结果:

假设异常是两个if里都为真的情况下才会出现,那么判定覆盖就将无法验证测试到这种情况发生。

条件覆盖

定义:

条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。

优点:

条件覆盖比判定覆盖增加了对符合判定情况的测试,增加了测试路径。使得判定中的每一个条件都取到了不同的结果,这一点判定覆盖则无法保证。

缺点:

要达到条件覆盖,就需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

示例:

if ((a> 1)&&( b==0))

{

x=x/a;

}

if ((a==2) || (x>1))

{

x=x+1;

}

输入:

a=2, b=3, x=5

a=1, b=0, x=1

结果:

虽然4个条件的真假都出现了一次,满足条件覆盖100%。但其中x=x/a语句并未在测试中被执行过。

判定/条件覆盖

定义:

判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。

优点:

满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。

缺点:

判定/条件覆盖准则的缺点是未考虑条件的组合情况。

示例:

if ((A > 1)&&( B == 0))

{

X = X / A;

}

if ((A == 2) || ( X > 1))

{

X = X + 1;

}

输入:

A=3, B=0, X=1

A=2, B=1, X=3

结果:

判定/条件覆盖似乎是比较合理的,但事实并非如此,因为大多数计算机不能用一条指令对多个条件作出判定,而是将源程序中对多个条件的判定分解成几个简单判定,所以较彻底的测试应保证每一个简单判定都真正能取到各种可能的结果。

条件组合覆盖

定义:

要求每个判定中条件结果的所有组合都需要至少出现一次,并需要设计足够的测试用例去满足这些条件。

优点:

条件组合覆盖是判定覆盖、条件覆盖和判定条件覆盖的组合。这样就很好的提高了测试用例的覆盖度。

缺点:

大量的增加了需要执行的测试用例数量。

示例:

if ((A > 1)&&( B == 0))

{

X = X / A;

}

if ((A == 2) || ( X > 1))

{

X = X + 1;

}

输入:

(1)A>1, B=0

(2)A>1, B!=0

(3)A≤1, B=0

(4)A≤1, B≠0

(5)A=2, X>1

(6)A=2,X≤1

(7)A≠2, X>1

(8)A≠2, X≤1

路径覆盖

定义:

设计测试用例时,覆盖程序中所有可能执行的条件和判断路径。

优点:

这种测试方法能对程序进行彻底的测试,比前面五种的覆盖面都深和广。

缺点:

但是由于路径覆盖需要对所有可能的路径进行测试,那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长,而在有些情况下,一些测试的执行路径是不可能被执行的。这样不仅降低了测试效率,而且大量的测试结果累积,也为排错带来麻烦。

  白盒测试是一种被广泛使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试。但是贯穿在程序内部的逻辑存在着不确定性和无穷性,尤其对于大规模复杂软件。因此我们不能穷举所有的逻辑路径,即使穷举也未必会带来好运(穷举不能查出程序逻辑规则错误,不能查出数据相关错误,不能查出程序遗漏的路径)。

  那么正确使用白盒测试,就要先从代码分析入手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径。