测试基础理论(3)-白盒理论

白盒测试

  • 白盒测试是一种测试手段,多用于单元测试阶段,测试对象是函数代码等。追求的目标叫做:逻辑覆盖率。其测试方法为:
  • 语句覆盖
  • 判定覆盖
  • 条件覆盖
  • 判定/条件覆盖
  • 条件组合
  • 路径覆盖

语句覆盖

  • 让每句代码都至少执行一次的方法

  • 比如下面代码

    1
    2
    3
    4
    5
    if(a > 2){
    System.out.print(">");
    }else{
    System.out.print("<");
    }
  • 若是要保证每条语句都至少执行一次的话,你就需要俩条用例即可:a = 1 和 a = 3

判定覆盖

  • 分支覆盖,目的是让每个判定的 真假 都至少出现一次

  • 比如下面代码

    1
    2
    3
    4
    5
    if(a > 2 or b > 3){
    System.out.print(">");
    }else{
    System.out.print("<");
    }
  • 若要保证每个判定真假都至少出现一次,则最少需要俩条用例:a = 3 和 a =1,b=1,这样 就保证了 判定(a>2orb>3) 真假至少出现了一次

条件覆盖

  • 保证代码中每个条件的真假都至少出现一次

  • 比如下面代码

    1
    2
    3
    4
    5
    if(a > 2 or b > 3){
    System.out.print(">");
    }else{
    System.out.print("<");
    }
  • 若要保证条件(a>1)和(b>2)和(else)都至少出现一次真假,那么用例如下:

  • a = 0,b = 0 :此时条件(a>1)和(b>2)都出现了假

  • a = 4, b=4 :此时条件(a>1)和(b>2)都出现了真

判定条件覆盖

  • 把判定和条件组合起来。用尽量少的用例同时满足俩种覆盖率的技术

  • 比如下面代码

    1
    2
    3
    4
    5
    if(a > 1 and b > 1){
    System.out.print(">");
    }else{
    System.out.print("<");
    }
  • 用例如下:

  • a = 0,b=0 此时条件(a>1)为假,条件(b>1)为假,判定(a>1 and b>1) 也为假。

  • a =2 ,b=2 此时条件(a>1)为真,条件(b>1)为真,判定(a>1 and b>1) 也为真

  • 两条用例就完美实现了 所有条件和所有判定的真假都至少出现了一次的情况,当然面对更为复杂的判断,这个则更难,比如:

    1
    2
    3
    4
    5
    if(a > 1 and b > 1 and c > 1){
    System.out.print(">");
    }else{
    System.out.print("<");
    }
  • 用例如下:

  • a =0,b=0,c=2 ,此时条件(a>1)(b>1)(c<1) 都为假,而判定(a>1 and b>1 and c<1) 也为假

  • a = 5,b = 5,c=0 ,此时条件(a>1)(b>1)(c<1) 都为真,而判定(a>1 and b>1 and c<1) 也为真

条件组合覆盖

  • 这个方法是针对判定作为结果的,只是手段是条件而已,目的为:保证 判定的所有情况都至少出现一次 ,而不单单是真假。

  • 比如下面代码

    1
    2
    3
    4
    5
    if(a > 1 or b > 1){
    System.out.print(">");
    }else{
    System.out.print("<");
    }
  • 我们这里要保证判定(a>1 or b>1)的所有情况都出现一次,用例如下:

  • a = 0,b=0 : 假假 = 假

  • a = 5,b=5 : 真真 = 真

  • a = 0,b=5 : 假真 = 真

  • a = 5,b=0 : 真假 = 真

  • 结果就是至少4条用例才能判定的所有情况都至少出现一次,虽然三个都是真,但是原因是不同的。

路径覆盖

  • 保证代码中每条路径都至少执行一次!注意,这里并非语句,而是路径。

  • 比如下面代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(a > 1){
    System.out.print("*");
    }else{
    System.out.print("%");
    }
    if(a > 1){
    System.out.print("&");
    }else{
    System.out.print("#");
    }
  • 这个例子中,如果我们是语句覆盖,那么俩条用例足以,保证每条语句都至少执行一次,最终的输出可以为:*& 和 %#

  • 但是路径覆盖则不这么简单,路径中,第一个判定的真假和第二个判定的真假各种组合 成为各种路径。

  • 所以要求输出至少为以下所有情况路径:*& 和 *# 和 %& 和 %# 排列组合共四种路径。

  • 所以至少需要如下四条用例:

  • a = 5,b=5: *&

  • a = 5,b=0: *#

  • a = 0,b=5: %&

  • a = 0,b=0: %#

  • 最强的覆盖法,在时间成本不够的情况下,优先选用路径覆盖是最全面的。

小结

  • 其实对于同一段代码,可能不同的覆盖率方法的用例是一样的,这就对了!的确用例是可以重复的,某条用例既符合路径法,又符合判定法 等这种情况 是很常见的
  • 最难的就是如何用最少的用例来覆盖最多的情况,不单单指单一方法,而是6种方法!高手用 3条用例可能就覆盖了六种覆盖率的95%的情况。而一般玩家用了12条用例才覆盖这么多。白盒测试技术水准的差距是肉眼可见的 天壤之别。技术难度智商要求也是非常非常高

测试基础理论(3)-白盒理论
http://example.com/2022/12/08/测试基础理论(3)-白盒理论/
作者
冰红茶
发布于
2022年12月8日
许可协议