此示例中边缘和条件覆盖的最小测试用例数量是多少?

问题描述 投票:0回答:3

我的教科书中这个问题的解决方案是测试用例的最小数量是 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}
。其中哪一个(如果有)是多余的? 解决这个问题的三个测试用例组合是什么?还是我的课本有错误?

java c code-coverage test-coverage
3个回答
0
投票

奇怪的功能。

如下所示,只要看起来

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

0
投票

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

以下是测试用例:

{z=10,y=1},{z=1,y=1},{z=1,y=10}

要实现完整的条件覆盖,条件中的每个布尔表达式必须分别评估为每个

true
false

对于

if (z<=y && k>=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>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 语句之前所需表达式的布尔值,以确保条件中的每个布尔表达式分别计算为

true
false

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;
} 


0
投票

你确实需要 4 个测试用例。一些答案没有考虑 while 循环中的条件:您需要涵盖 z>0 为 false 时的情况(正如您所做的那样)。 因此,三个测试用例用于覆盖同时主体中的边缘和条件,例如(1,0)、(1,10)、(0,0),加上例如(-1,任意)以覆盖缺失的情况。

© www.soinside.com 2019 - 2024. All rights reserved.