白盒测试-条件组合覆盖

​ 使用分支-条件覆盖法设计白盒测试用例时可以使程序中所有判断语句中的条件取值为真、为假的情况和整个判断语句取真分支、假分支的情况都至少被执行过一次,但无法覆盖到所有路径,仍然会有一些逻辑运算等错误未被测试到。

​ 条件组合覆盖又称为多条件覆盖,是指设计足够数据的测试用例,使每个判定语句中的所有判定条件的各种可能的组合都至少被执行一次。

​ 条件组合覆盖与分支-条件覆盖的不同之处在于:条件组合覆盖不是简单的要求每个条件为真、为假两种情况都至少被执行一次,而是要求让每个条件为真、为假情况所有可能的组合都至少被执行一次

​ 例如,判断语句 if ( a == 0 or b > 2 ) 中有两个条件 a == 0 和 b > 2 ,使用条件组合覆盖法设计测试用例时,要求这两个条件的取真值和取假值的组合至少各执行一次,即 a == 0(真)与 b > 2 (真)、a == 0(真)与 b > 2 (假)、 a == 0(假)与 b > 2 (真)、 a == 0(假)与 b > 2 (假)这四种组合情况。

栗子

public static int test(int a, int b, int c) {
    int result = 0;
    if (a == 0 || b > 2) {
        result = b - a;
    }
    if (a > 0 && c > 0) {
        result = c * a;
    }
    return result;
}

第 1 步:分析待测试代码,画出程序的流程图。

在这里插入图片描述

把流程图标识了路径

在这里插入图片描述

第 2 步:分析流程图。

​ 由流程图可知:这段代码中有两个判断语句,分别是上图中标识为 ② 和 ③ 的语句,语句 ② 中有两个条件语句,分别为 a == 0 和 b > 2 ;语句 ③ 中也有两个条件,分别为 a > 0 和 c > 0 。为了使后续的分析过程更加清晰明了,我们先将条件语句进行相应的标识,具体如下:

条件取值标识
a == 0Y1
a == 0N1
b > 2Y2
b > 2N2
a > 0Y3
a > 0N3
c > 0Y4
c > 0N4

​ 根据条件组合覆盖法的定义,我们需要设计一些测试用例分别使判断语句 ② 中两个条件的四种组合及判断语句 ③ 中两个条件的四种组合都至少执行一次,如下表所示:

组合编号判断语句条件组合
1a == 0 or b > 2Y1 + Y2
2a == 0 or b > 2Y1 + N2
3a == 0 or b > 2N1 + Y2
4a == 0 or b > 2N1 + N2
5a > 0 and c > 0Y3 + Y4
6a > 0 and c > 0Y3 + N4
7a > 0 and c > 0N3 + Y4
8a > 0 and c > 0N3 + N4

第 3 步:使用条件组合覆盖法编写测试用例。

​ 分别设计测试用例覆盖上表中的各种组合,具体如下

测试用例编号输入数据预期结果条件组合覆盖条件覆盖路径覆盖
testcase_01a = 0 , b = 3 , c = 1result = 3组合 1 、组合 7Y1、Y2、N3、Y4B - C
testcase_02a = 0 , b = 1 , c = 0result = 1组合 2 、组合 8Y1、N2、N3、N4B - C
testcase_03a = 1 , b = 5 , c = 3result = 3组合 3 、组合 5N1、Y2、Y3、Y4B - D
testcase_04a = 2 , b = 0 , c = -1result = 0组合 4 、组合 6N1、N2、Y3、N4A - C

​ 通过对上表的分析我们可以发现 :条件组合覆盖可以使程序判断断语句中的条件组合都至少被执行一次,但是,满足了条件组合覆盖也不能保证所有的路径都已经得到覆盖,在本例中,四个测试用例实现了条件组合的 100% 覆盖,但是仍有路径 A - D 未被覆盖到。

代码实现

​ Demo.java

public static int test(int a, int b, int c) {
    int result = 0;
    if (a == 0 || b > 2) {
        result = b - a;
    }
    if (a > 0 && c > 0) {
        result = c * a;
    }
    return result;
}

​ DemoTest3.java

import org.junit.Assert;
import org.junit.Test;

public class DemoTest3 {

    @Test
    public void testDemo01() {
        Assert.assertEquals(3, Demo.test(0, 3, 1));
    }

    @Test
    public void testDemo02() {
        Assert.assertEquals(1, Demo.test(0, 1, 0));
    }

    @Test
    public void testDemo03() {
        Assert.assertEquals(3, Demo.test(1, 5, 3));
    }

    @Test
    public void testDemo04() {
        Assert.assertEquals(0, Demo.test(2, 0, -1));
    }
}

​ 条件组合覆盖可以使程序所有判断语句中的条件组合都被覆盖,但是仍然不能保证覆盖所有路径,需要再补充用例进行路径覆盖。另外,如果程序中的条件和分支比较多,需要设计的测试用例数量会很庞大。

  • 43
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值