白盒测试是一种按照程序内部逻辑结构和编码结构设计测试数据或测试用例并完成测试的测试方法,又称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。
通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试。在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。
白盒测试一般分为静态分析方法和动态分析方法两大类。
静态分析是一种不通过执行程序而进行测试的技术。 主要是对软件的编程格式、结构等方面的评估。静态分析的关键功能是检查软件的表示和描述是否一致,有无冲突或者歧义。
动态分析是当软件系统在模拟的或真实的环境中执行之前、之中和之后,对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支测试。
- 可以构成测试数据,使特定程序部分得到测试;
- 有一定的充分性度量手段;
- 可获得较多工具的支持;
- 通常只用于单元测试。
白盒测试的测试方法:代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、路径覆盖和程序变异。
白盒测试的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
1、语句覆盖
设计足够多的测试用例,使得每条语句至少执行一次。
对于图例:测试用例:
a = 2,b = 0,x = 3
使得两个判别式都取真值,即可达到语句覆盖。但如果当第一个判别式中的“and”改成“or”,或者第二个判别式中的条件改成“x<1”,选取的测试用例则不能查出这些错误。因此,语句覆盖是很弱的覆盖标准。
优点:
- 检查所有语句;
- 结构简单的代码测试效果较好;
- 易实现自动化;
- 代码覆盖率高;
- 若是程序块覆盖,则不用考虑程序块中的源代码。
语句覆盖不能检查出的错误:
- 条件语句错误,例如:a > 1 & b == 0 → a > 0 & b ==0
- 逻辑运算(&,&&,||)错误,例如:a > 1 && b == 0 → a >1 || b == 0
- 循环语句错误(循环次数错误、跳出循环条件错误)
2、判断覆盖(分支覆盖)
设计足够多的测试用例,使得程序中每个判定的每个分支至少执行一次。 while语句、switch语句、异常处理、跳转语句和三目运算符等都可以使用分支覆盖来进行测试。
对于图例:测试用例:
(1) a = 3,b = 0,x = 1 (acd路径执行)
(2) a = 2,b = 1,x = 3 (abe路径执行)
设计以上两个测试用例即达到分支覆盖。
执行了分支覆盖,实际也执行了语句覆盖。判定覆盖与语句覆盖存在同样的缺点。
3、条件覆盖
执行足够多的测试用例,使得每个判定中的每个条件的可能取值至少满足一次,但未必能覆盖全部分支。
对于图例:流程图共有4个条件:a > 1, b = 0, a = 2, x > 1。在a点有:a > 1,a <= 1,b = 0, b != 0等结果;在b点有:a = 2 ,a != 2,x > 1,x <= 1等结果。测试用例:
(1) a = 2,b = 0,x = 1 (ace路径执行)
(2) a = 1,b = 1,x = 2 (abe路径执行)
设计以上两个测试用例即达到条件覆盖。
条件覆盖的利弊:
- 能检查所有的条件错误;
- 不能实现对每个分支的检查;
- 测试用例数增加。
4、判定/条件覆盖
设计足够多的测试用例,同时满足条件覆盖、判定覆盖,使得判定中的每个条件的所有可能取值至少满足一次,同时每个判断的的所有可能的判定结果至少执行一次。即:每个判定的所有可能的条件取值组合至少执行一次。
对于图例:测试用例:
(1) a = 2 ,b = 0,x = 4 (ace路径执行)
(2) a = 1 ,b = 1,x = 1 (abd路径执行)
设计以上两个测试用例即达到判定/条件覆盖,也可单独达到条件覆盖。因此,有时判定/条件覆盖并不比条件覆盖强。
分支-条件覆盖利弊:
- 既考虑每一个条件,又考虑每一个分支,发现错误能力强于分支覆盖和条件覆盖;
- 并不能全面覆盖所有路径;
- 测试用例数增加。
5、条件组合覆盖
设计足够多的测试用例,使得每个判定中条件的各种组合至少出现一次。
对于图例:流程图共有4个条件:a > 1, b = 0, a = 2, x > 1。因此测试用例应满足8种组合:
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
测试用例:
(1) a = 2 ,b = 0,x = 4 满足1、5组合
(2) a = 2 ,b = 1,x = 1 满足2、6组合
(3) a = 1 ,b = 0,x = 2 满足3、7组合
(4) a = 1 ,b = 1,x = 1 满足4、8组合
满足条件组合覆盖的测试用例,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。但满足条件组合覆盖并不一定能使程序中的每条路径都执行到,上面4组测试用例并未测试到路径acd。
6、路径覆盖
设计足够多的测试用例,使得程序中所有路径都至少执行一次。
对于图例:流程图共有4条路径:ace,abd,abe,acd。
测试用例:
(1) a = 2 ,b = 0,x = 3 覆盖ace
(2) a = 2 ,b = 1,x = 1 覆盖abe
(3) a = 1 ,b = 0,x = 1 覆盖abd
(4) a = 3 ,b = 0,x = 1 覆盖acd