白盒测试

白盒测试

白盒测试又称逻辑驱动测试或结构测试,允许检查内部的结构,基于应用程序内部逻辑的知识,通过语句、分支、路径和条件的覆盖率。
同黑盒测试的穷举输入类似,如果将程序中每条语句至少执行一次,即穷举路径测试,不切实际,即便实现还是有错误

原因如下:

  • 当这个程序本身就是错误的程序,就难以发现其错误
  • 当程序缺少了某些路径,穷举不能发现缺少的路径
  • 不会暴露数据敏感错误

逻辑驱动覆盖测试

逻辑驱动覆盖测试是以程序内部的逻辑结构为基础设计测试用例的方法,是最传统、最经典的白盒测试技术。
常见的覆盖标准有七种,如下所示:

  • 语句覆盖Statement Coverage(SC)
  • 判定覆盖Decision Coverage(DC)
  • 条件覆盖Condition Coverage(CC)
  • 判定/条件覆盖Decision/Condition Coverage(D/CC)
  • 多重条件覆盖Condition Combination Coverage(CCC)
  • 路径覆盖Path Coverage(PC)
  • 修订的条件/判定覆盖Modified Condition/Decision Coverage(MC/DC)

通过一段简单的小程序,来说明不同的覆盖标准。

1
2
3
4
5
6
j = 0
if x > 3 and z < 10:
j == 1
if x == 4 or y > 5:
j == 2
j == 3

程序流程图如下所示:

语句覆盖

设计若干测试用例,运行所测程序,使得每条语句至少都执行一次。语句覆盖是最弱的逻辑覆盖准则。(PS:这里的若干,尽量是越少越好)
应满足以下覆盖情况:执行路径abd。选择测试用例: x=4,y=5,z=5。
优点:直观的从代码中得到测试用例,不用细分每条判定表达式
缺点:对隐藏的条件和可能到达的隐式分支无法测试,它只在乎运行一次,而不考虑其他情况。

判定覆盖(分支覆盖)

使得程序中每个判断都至少有一个为真和为假的输出结果,即每条分支路径都必须至少遍历一次
判定覆盖是比语句覆盖更强的准则,比判定覆盖更强的是条件覆盖
应满足以下覆盖情况:执行路径abd和ace。
选择测试用例: x=4,y=5,z=5;x=2,y=5,z=5

优点:测试能力更强,无须细分每个判定即可得到测试用例,测试路径更多
缺点:对于多个逻辑条件组合而成的判定语句并不友好,如果仅判断最终结果,忽略每个条件的取值就会遗漏测试路径

条件覆盖

确保将一个判断中的每个条件的所有可能的结果都至少执行一次。
选择测试用例: x=4,y=6,z= 5;x=2,y=5,z=5;x=4,y=5,z=15。

优点:比判定覆盖增加了对符合判定情况的测试,增加了测试路径

缺点:如果每个判断中每个条件的可能取值至少满足一次,但是覆盖了条件的测试用例不一定会覆盖判定

判定/条件覆盖

同时满足判定覆盖和条件覆盖。将一个判断中的每个条件的所有可能的结果至少执行一次,将每个判断的所有可能的结果至少执行一次,将每个入口点都至少调用一次(看似所有条件的所有结果都执行了,实际由于有些特定条件会屏蔽其他条件,常常并不能全部都执行)
应满足以下覆盖情况:执行路径abd和ace。 选择测试用例: x=4,y=6,z=5;x=2,y=5,z=11。

优点:既满足判定覆盖又满足条件覆盖
缺点:不满足多重条件组合覆盖,又忽略了路径覆盖的问题,没有考虑单个判定对整体结果的影响,不能发现程序中的逻辑错误。

关于与和或,如果与表达式有个条件为假,那么无需计算该表达式中的后续条件
如果或表达式中有个条件为真,那么同样后续条件也无需计算,因此条件覆盖或判定/条件覆盖不一定能发现逻辑表达式中的错误

多重条件覆盖

可以部分解决上述问题,将每个判定中的所有可能的条件结果组合以及所有的入口点都至少执行一次

  • 每个判断的所有结果都至少执行一次
  • 将所有的程序入口都至少调用一次,以确保全部的语句都至少执行一次
  • 对于多重条件判断的程序,需要足够的测试用例,将每个判断的所有可能的条件结果的组合,以及所有的入口点都至少执行一次

路径覆盖

使程序中每一条可能的路径至少执行一次。
应满足以下覆盖情况:执行路径abd,ace,acd和abe
选择测试用例: x=4,y=6,z=5; x=2,y=5,z=5; x=4,y=5,z=15; x=5,y=5,z=9
缺点:不一定保证条件的所有组合都覆盖,需要设计大量的测试用例,要对循环,条件组合,分支选择都要进行测试。

休息一下,喝杯咖啡,继续创作