白盒测试:通过检测软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。
白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑测试、基路测试等,主要用于软件内部结构的验证。
主要包含六种测试方法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。
覆盖测试用例表:
编号 | …… | 执行路径 | 备注 |
---|
注意:设计测试用例时,最好把已经覆盖的条件划掉,以免重复或遗漏,直到所有条件都被划掉。
例子
以下是一个程序段:
if((a>1)&&(b=0))
c = c/a;
if((a=2)||(c>1))
c = c+1;
对应的程序流程图如下:
语句覆盖
语句覆盖(Statement Coverage, SC):是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。
测试用例:
编号 | a | b | c | 执行路径 | 备注(语句) |
---|---|---|---|---|---|
1 | 2 | 0 | 5 | ACE | (a>1)... c=c/a (a=2)... c=c+1 |
这样,(a>1)...、c=c/a、(a=2)...、c=c+1上面所有语句都被覆盖了。
- 优点:
很直观地从代码中得到测试用例,无需细分每条判定表达式。 - 缺点:
对于隐藏的条件和可能到达的隐式分支是无法测试的。它只在乎运行一次,而不考虑其他情况,可以说语句覆盖是最弱的逻辑覆盖准则。
判定覆盖
判定覆盖(Decision Coverage, DC):又称分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少,即 程序中的每个分支至少执行一次。
测试用例:
编号 | a | b | c | 执行路径 | 备注(分支) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | ACE |
2 | 1 | 0 | 1 | ABD | BD |
这样,ABCDE所有分支都被覆盖了。
- 优点:
分支覆盖是比语句覆盖更强的测试能力,比语句覆盖要多几乎一倍的测试路径。它无需细分每个判定中的条件就可以得到测试用例。 - 缺点:
往往大部分的判定语句是多个逻辑条件组合而成,若仅仅判断其最终结果,而忽略每个条件的取值必然会遗漏部分的测试路径。未深入测试复合判定表达式的细节,仍存在测试漏洞。
条件覆盖
条件覆盖(Condition Coverage, CC):要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即 每个条件至少都获得一次“真”值和“假”值。
注意:这里的条件和判定并不是一个概念,而是多个条件组成一个判定。
判定一条件:a>1,b=0
判定二条件:a=2,c>1判定一条件所有可能结果:a>1,a≤1; b=0,b≠0;
判定二条件所有可能结果:a=2,a≠2; c>1,c≤1;
测试用例:
编号 | a | b | c | 执行路径 | 备注(条件) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | a>1,b=0,a=2,c>1 |
2 | 1 | 1 | 1 | ABD | a≤1,b≠0,a≠2,c≤1 |
设计测试用例时,最好把已经覆盖的条件划掉,以免重复或遗漏,直到:
- 判定一条件所有可能结果:
a>1,a≤1,b=0,b≠0 判定二条件所有可能结果:
a=2,a≠2,c>1,c≤1优点:
条件覆盖比分支覆盖增加了对符合判定情况的测试,增加了测试的路径。缺点:
设计若干测试用例,执行被测程序以后,要使每个判断中每个条件可能的取值至少满足一次;但覆盖了条件的测试用例不一定覆盖了判定。例如:(1,0,3)和(2,1,1),满足条件覆盖,但不满足判定覆盖。
判定/条件覆盖
判定/条件覆盖(Decision/Condition Coverage, D/CC):要求设计足够多的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的值。
注意:判定是很好取各种值的,但是条件比较多可能存在遗漏,所以先满足条件后满足判定。
判定一条件所有可能结果:a>1,a≤1; b=0,b≠0;
判定二条件所有可能结果:a=2,a≠2; c>1,c≤1;判定一:T、F
判定二:T、F
编号 | a | b | c | 执行路径 | 备注(判定/条件) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | a>1,b=0,a=2,c>1 T,T |
2 | 1 | 1 | 1 | ABD | a≤1,b≠0,a≠2,c≤1 F,F |
- 优点:
判定/条件覆盖测试既满足判定覆盖准则又满足条件覆盖准则,弥补了二者的不足。 - 缺点:
判定/条件覆盖测试既未满足条件组合覆盖,又忽略了路径覆盖的问题。其没有考虑单个判定对整体结果的影响,无法发现程序中的逻辑错误。
条件组合覆盖
条件组合覆盖(Condition Combination Coverage, CCC):要求设计足够多的测试用例,使得每个判定中条件的各种组合都至少出现一次。
- 判定一条件组合:
- ①:a>1,b=0
- ②:a>1,b≠0
- ③:a≤1,b=0
- ④:a≤1,b≠0
- 判定二条件组合:
- ⑤:a=2,c>1
- ⑥:a=2,c≤1
- ⑦:a≠2,c>1
- ⑧:a≠2,c≤1
编号 | a | b | c | 执行路径 | 备注(条件组合) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | ①⑤ |
2 | 2 | 1 | 1 | ABC | ②⑥ |
3 | 1 | 0 | 3 | ABE | ③⑦ |
4 | 1 | 1 | 1 | ABD | ④⑧ |
优点:
条件组合覆盖使得每个判定中条件的各种可能组合都至少出现一次。缺点:
条件组合覆盖忽略了路径覆盖的问题。
路径覆盖
路径覆盖(Path Coverage, PC):要求设计足够多的测试用例,使得程序中所有可能的路径组合都被覆盖。
- 判定一分为两条路径:T、F
判定二分为两条路径:T、F
编号 | a | b | c | 执行路径 | 备注(路径组合) |
---|---|---|---|---|---|
1 | 1 | 0 | 1 | ABD | F,F |
2 | 2 | 1 | 1 | ABE | F,T |
3 | 3 | 0 | 1 | ACD | T,F |
4 | 2 | 0 | 3 | ACE | T,T |
优点:
路径覆盖是经常要用到的测试覆盖方法,它比普通的判定覆盖准则和条件覆盖准则覆盖率都要高。缺点:
路径覆盖不一定能保证条件的所有组合都覆盖。由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。注意:为了解决这个难题,只有把覆盖路径压缩到一定的限度内,如 程序中的循环体只执行一次。
在实际测试中,即使对于数目很有限的程序已经做到路径覆盖,仍然不能保证被测程序的正确性,还需要采取其他测试方法进行补充。