白盒测试一般用来分析程序的内部结构,前提条件是:已知程序的内部工作过程,清除其语句、变量状态、逻辑结构和执行路径等关键信息。白盒测试重视测试覆盖率的度量。
包括桌面检查、走查、代码审查。代码检查比动态测试更重要。应当在程序编译和动态检查之前进行。
通过测试工具,分析程序的系统结构、数据结构、数据接口、控制逻辑等内部结构,生成各类图表,从而清晰呈现整个系统的组织机构。通过分析这些图表,测试人员可以有效发现程序中潜在错误。
主要包括:语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖和路径覆盖。(前提:在设计测试用例时,对其内部逻辑结构有清晰了解)
定义:设计若干个测试用例,使被测程序中的每一条可执行语句至少执行一次。
特性:语句覆盖是最弱的逻辑覆盖标准。虽然能够执行所有语句,但是不能覆盖所有的判定分支。因此,语句覆盖只针对程序中显式存在的语句,而无法测试隐藏的条件和可能的逻辑分支。
定义:判定覆盖又称为分支覆盖,是指设计若干个测试用例,使被测程序中的每个判定的取真分支和取假分支至少被执行一次,即每个判定的真假值均被满足。
注意:判定分支可以是单条件A,也可以是双条件(A && B),注意语法(双条件的A为假,则不会判断B是否为真)。
特性:判定覆盖的测试充分性仍然很弱,它只是判断整个判定表达式的最终取值结果,而不考虑表达式中每个条件的取值情况,因此必然会漏检一些条件错误。判定表达式往往由多个条件组合而成,某个条件的取值结果可能会掩盖其它条件的取值结果情况。
定义:条件覆盖是指,设计足够多的测试用例,使每个判定中的每个条件的真假取值都至少被满足一次。(每个判定分支里面都有各种条件语句。如上面讲的双条件语句(A && B),判定覆盖要求(A && B)要有真、假两种情况出现,这里,我们要求测试用例中,A要出现真、假,B也要出现真、假。)
定义:结合判定覆盖和条件覆盖,由前面介绍可知,判定覆盖不一定满足条件覆盖,条件覆盖不一定满足判定覆盖,所以创造出判定-条件覆盖,其满足这两者的要求。
特性:设计足够多的测试用例,使被测程序中每个判定的每个条件的可能取值至少被执行一次,并且每个可能的判定结果也至少被执行一次。
从测试充分性上来看,满足判定-条件覆盖就一定能够满足条件覆盖、判定覆盖和语句覆盖。
定义:设计足够多的测试用例,使被测程序中每个判定的所有可能的条件取值组合至少被执行一次。
注意:与条件覆盖差异点是,它不仅要求每个条件都能有真假两种取值结果,而且要求这些结果的所有可能组合都至少出现一次。(笛卡尔积)
特性:条件组合覆盖是一种很强的覆盖标准,能够有效地测试各种条件取值组合是否正确。但是,条件组合覆盖也线性地增加了测试用例的数量,提高了测试用例设计、实施和维护的成本。
定义:路径覆盖就是设计足够多的测试用例,使被测程序的每条可执行路径都至少执行一次。(画出流程图或者控制流图后,看着图想着dfs即可)
特点:相比其他逻辑覆盖方法,它的测试覆盖率最大。路径覆盖不一定满足条件覆盖,但一定满足语句覆盖和判定覆盖。随着代码复杂度上升,路径数目可能指数级增长!
定义:在程序控制流图的基础上,设计测试用例的方法。设计出的测试用例需要保证被测程序的每一条可执行语句至少被执行一次。
步骤
以详细设计或源代码为基础,绘制程序控制流图
根据程序控制流图,计算程序环路复杂度(注意控制流图,双条件之类的要分开)
确定独立路径的集合
生成测试用例
![]() |
![]() |
#include using namespace std; int main() { int year; scanf("%d",&year); if( year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0)) printf("%d是闰年",year); else printf("%d不是闰年",year); return 0; } |
![]() |
![]() |
设置判定P1、P2、P3
P1:year % 4 == 0
P2:year % 100 == 0
P3:year % 400 == 0
①语句覆盖
编号 |
测试用例 |
P1 |
P2 |
P3 |
路径(字母为流程图红字部分) |
1 |
year=2000 |
T |
T |
T |
OABCE |
2 |
year=2001 |
F |
F |
F |
ODE |
②判定覆盖
编号 |
测试用例 |
P1 |
P2 |
P3 |
路径(字母为流程图红字部分) |
1 |
year=2000 |
T |
T |
T |
OABCE |
2 |
year=2001 |
F |
F |
F |
ODE |
3 |
year=2004 |
T |
F |
F |
OACE |
4 |
year=2500 |
T |
T |
F |
OABDE |
③条件覆盖
编号 |
测试用例 |
P1 |
P2 |
P3 |
路径(字母为流程图红字部分) |
1 |
year=2000 |
T |
T |
T |
OABCE |
2 |
year=2001 |
F |
F |
F |
ODE |
3 |
year=2004 |
T |
F |
F |
OACE |
4 |
year=2500 |
T |
T |
F |
OABDE |
④判定--条件覆盖(由于判定都是单条件的,所以不单独设C1,C2,C3)
编号 |
测试用例 |
P1 |
P2 |
P3 |
路径(字母为流程图红字部分) |
1 |
year=2000 |
T |
T |
T |
OABCE |
2 |
year=2001 |
F |
F |
F |
ODE |
3 |
year=2004 |
T |
F |
F |
OACE |
4 |
year=2500 |
T |
T |
F |
OABDE |
⑤路径覆盖
编号 |
测试用例 |
P1 |
P2 |
P3 |
路径(字母为流程图红字部分) |
1 |
year=2000 |
T |
T |
T |
OABCE |
2 |
year=2001 |
F |
F |
F |
ODE |
3 |
year=2004 |
T |
F |
F |
OACE |
4 |
year=2500 |
T |
T |
F |
OABDE |