从软件测试看芯片验证-白盒测试

White-Box Testing

白盒测试是关注测试用例覆盖程序逻辑(源代码)的程度。最终的白盒测试是执行程序中的每个路径。但对于大多数的程序(例如带有循环的程序),完全意义上的全路径覆盖是不现实的。

Logic Coverage Testing

你可能会觉得一个值得追求的目标是至少执行程序中的每一条语句。不幸的是,这是一个很弱的标准。假设下面这个图表示一个要测试的小程序。相应的Java代码片段如下:

从软件测试看芯片验证-白盒测试_第1张图片 从软件测试看芯片验证-白盒测试_第2张图片

你可以通过编写一条单独的测试用例来执行到路径ace。也就是说,在a点设置A=2,B=0和X=3,每个语句将被执行一次。

不幸的是,这个标准相当差。

  • 第一个条件可能是而不是。如果是这样,这个bug将不会被检测到。

  • 第二个条件如果是是X>0,这个bug也不会被检测到。

  • 此外,程序中有一条路径,X没有改变(路径abd)。如果这里存在一个错误,也不会被检测到。


更强的逻辑覆盖标准称为条件覆盖或分支覆盖。这个标准规定,你必须编写足够的测试用例,使每个条件至少有一个true和一个false。以及每个分支方向必须至少遍历一次。分支或条件语句的例子包括switch-case、do-while和if-else语句,以及在某些编程语言(如Fortran)中的多路径GOTO语句。

在上图中,分支覆盖可以用两个测试用例覆盖路径ace和abd,或者覆盖路径acd和abe。如果我们选择后者,那么两个测试用例的输入分别是A=3, B=0, X=3和A=2, B=1, X=1。条件覆盖是比语句覆盖更强的标准,但它仍然很弱。因为,此时我们仍然没有探索到x没有改变的路径(abd)。

如果第二个判断有误(写成X<1而不是X>1),那么这个bug就不会被前面的测试用例(A=2, B=1, X=1)检测到。

有时比分支覆盖更强的标准是条件覆盖。在这种情况下,你需要编写足够的测试用例来确保每个条件至少有一次取得所有可能的结果。上图中有四个条件: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。

尽管条件覆盖标准乍一看似乎满足分支覆盖标准,但并不总是如此。例如,两个测试用例 A = 1,B = 0,X = 3 和A = 2,B = 1,X = 1 涵盖了所有条件结果,但只涵盖了四个分支中的两个(它们都涵盖了路径abe,因此不会执行第一个分支的true结果和第二个分支的false结果)。

摆脱这种困境的明显方法是一种称为分支+条件覆盖的标准。它需要足够的测试用例,以便每个分支判断中的每个条件至少有一次取得所有可能的结果。

最后,大家再思考下,现有的仿真验证的代码覆盖率有哪些类型的代码覆盖率,其实是会考虑所有分支里面的所有条件的输入和输出结果的组合的

另外请再思考下,功能覆盖率能够覆盖哪些代码覆盖率无法描述的场景组合呢?

你可能感兴趣的:(从软件测试看芯片验证-白盒测试)