【问题标题】:What is the minimum number of test cases for edge and condition coverage in this example?在这个例子中,边缘和条件覆盖的最小测试用例数量是多少?
【发布时间】:2021-02-13 16:15:46
【问题描述】:

我教科书中这个问题的解决方案是测试用例的最小数量是 3。但是,我不能低于 4 来获得完整的边缘和条件覆盖。

int x=0;
int k=10;
while (x<=10 && z>0) {
   if (z<=y && k>=x)
      y=y-z;
   k--;
   if (y>0) x++;
   else break;
} 

我的解决方案是这样的:{z=1, y=0},{z=-1, y=0},{z=1, y=10},{z=1, y=3}。其中哪一项(如果有)是多余的? 解决这个问题的三个测试用例组合是什么?还是我的教科书有错误?

【问题讨论】:

  • 嗯,试图达到绝对最小的测试用例是一个值得商榷的目标。要做到这一点,需要对代码进行很多假设,这会导致随着代码老化而出现问题。我想这只是一个练习。
  • @chux-ReinstateMonica 甚至认为它“只是一个练习”,我无法理解如何仅使用 3 个测试用例就可以测试所有子条件的真假。跨度>
  • 可以尝试所有z [-10 ...10] 和y [-10 ... 10],查看x, k 的结果。也许只有 3 套?

标签: java c code-coverage test-coverage


【解决方案1】:

好奇的功能。

如下所示,只需查看 x,就有许多有趣的区域,每个区域都值得一个测试向量。

我不同意“最小测试用例数是 3”。

struct kx {
  int k, x;
};

struct kx foo(int z, int y) {
  int x = 0;
  int k = 10;
  while (x <= 10 && z > 0) {
    if (z <= y && k >= x)
      y = y - z;
    k--;
    if (y > 0)
      x++;
    else
      break;
  }
  struct kx r = {k, x};
  return r;
}

int main(void) {
  for (int z = -2; z <= 12; z++) {
    for (int y = -2; y <= 20; y++) {
      struct kx newest = foo(z, y);
      printf(" %2d", newest.x);
    }
    printf("\n");
  }
}

输出

  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  1  2  3  4  5 11 11 11 11 11 11 11 11 11 11 11 11 11 11
  0  0  0 11  0 11  1 11  2 11  3 11  4 11  5 11 11 11 11 11 11 11 11
  0  0  0 11 11  0 11 11  1 11 11  2 11 11  3 11 11  4 11 11  5 11 11
  0  0  0 11 11 11  0 11 11 11  1 11 11 11  2 11 11 11  3 11 11 11  4
  0  0  0 11 11 11 11  0 11 11 11 11  1 11 11 11 11  2 11 11 11 11  3
  0  0  0 11 11 11 11 11  0 11 11 11 11 11  1 11 11 11 11 11  2 11 11
  0  0  0 11 11 11 11 11 11  0 11 11 11 11 11 11  1 11 11 11 11 11 11
  0  0  0 11 11 11 11 11 11 11  0 11 11 11 11 11 11 11  1 11 11 11 11
  0  0  0 11 11 11 11 11 11 11 11  0 11 11 11 11 11 11 11 11  1 11 11
  0  0  0 11 11 11 11 11 11 11 11 11  0 11 11 11 11 11 11 11 11 11  1
  0  0  0 11 11 11 11 11 11 11 11 11 11  0 11 11 11 11 11 11 11 11 11
  0  0  0 11 11 11 11 11 11 11 11 11 11 11  0 11 11 11 11 11 11 11 11

【讨论】:

    【解决方案2】:

    达到 100% 条件覆盖的测试用例的最小数量确实是 3。

    这里是测试用例:{z=10,y=1},{z=1,y=1},{z=1,y=10}

    要实现完整的条件覆盖,条件中的每个布尔表达式都必须分别对每个truefalse 求值。

    对于if (z&lt;=y &amp;&amp; k&gt;=x) 条件

    z<=y : true
    k>=x: true
    
    z<=y : true
    k>=x: false
    
    z<=y : false
    k>=x: false
    
    z<=y : false
    k>=x: true
    

    对于if(y&gt;0) 条件

    y>0: true
    
    y>0:false
    
    

    请注意,由于存在修改变量值的 while 循环,因此仅一个测试用例就可以涵盖多个布尔表达式。

    第一个测试用例{z=10,y=1} 覆盖

    z<=y : false
    k>=x: false
    
    z<=y : false
    k>=x: true
    
    y>0: true
    

    第二个测试用例{z=1,y=1} 覆盖

    z<=y : true
    k>=x: true
    
    y>0:false
    
    

    第三个测试用例{z=1,y=10} 覆盖了剩余的布尔表达式

    z<=y : true
    k>=x: false
    

    代码中每个条件中的每个布尔表达式都被覆盖,从而确保 100% 条件覆盖

    您可以打印以控制 if 语句之前所需的表达式的布尔值,以确保条件中的每个布尔表达式都被分别评估为 truefalse

    int x=0;
    int k=10;
    while (x<=10 && z>0) {
       System.out.println((z<=y),(k>=x))
       if (z<=y && k>=x)
          y=y-z;
       k--;
       System.out.println((y>0))
       if (y>0) x++;
       else break;
    } 
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多