【问题标题】:Basic vs. compound condition coverage基本与复合条件覆盖率
【发布时间】:2016-09-04 12:17:18
【问题描述】:

我试图弄清楚这两个覆盖标准之间的差异,但我无法弄清楚它们有何不同。我想我无法准确理解决策覆盖率是什么。我的软件测试教科书指出,复合决策覆盖率可能很昂贵(n 个基本条件的 2n 个组合)。

我原以为基本条件覆盖会更昂贵。

考虑a && b && c && d && e。我的理解是,在基本条件覆盖中,这些原子变量中的每一个都必须在测试用例中具有值 TRUE 和 FALSE 才能使测试用例具有基本条件充分性——即 32 个不同的测试用例。

那么实际的区别是什么,什么是所谓的“基本条件”。在上面的例子中,a 是基本条件吗?

谢谢。

【问题讨论】:

    标签: testing code-coverage test-coverage


    【解决方案1】:

    首先,DecisionCondition的区别。

    Condition 是一个原子布尔表达式,不能分解为更简单的布尔表达式。例如:a(如果 a 是布尔值)。

    Decision 是具有零个或多个布尔运算符的条件组合。没有运算符的决定也是一个条件。例如:(a or b) and c 也可以是 a and b 或只是 a

    举个简单的例子

    if(decision)  {
      //branch 1
    } else {
      //branch 2
    }
    

    您需要两个测试来覆盖两个分支。这就是决策覆盖率分支覆盖率。如果决策是一个条件(即只是a),也称为基本条件覆盖,即单个条件的两个分支的覆盖。

    decision 可以分解为条件。

    举个例子

    decision = (a or b) and c
    

    决策覆盖率将通过

    实现
    • a,b,c = 0
    • a,b,c = 1

    但其布尔子表达式的所有组合的排列是全条件覆盖多条件覆盖),它是basic的复合条件覆盖

    | a | b | c |
    | 0 | 0 | 1 |
    | 0 | 0 | 0 |
    | 0 | 1 | 1 |
    | 0 | 1 | 0 |
    | 1 | 0 | 1 |
    | 1 | 0 | 0 |
    | 1 | 1 | 1 |
    | 1 | 1 | 0 |
    

    这将是相当多的测试,但其中一些是多余的,因为某些条件已被其他条件覆盖。这反映在 Modified Condition/Decision Coverage (MC/DC) 中,它是 条件覆盖率功能覆盖率 的组合。

    对于 MC/DC,每个条件都必须独立影响结果。通过上述测试(全部为 0 或全部为 1),我们忽略了这样一个事实,即如果 a 和 b 为 0,c 值无关紧要,或者,如果 a 和 c 为 1,b 值无关紧要。

    所以你应该坐下来,动动脑筋,想一想哪些组合的总体结果 R 是 1 或 0。

      | a | b | c | a or b | c | R |  eq
    1 | 0 | 0 | 0 |    0   | 0 | 0 |  A
    2 | 0 | 0 | 1 |    0   | 1 | 0 |  B
    3 | 0 | 1 | 0 |    1   | 0 | 0 |  A
    4 | 0 | 1 | 1 |    1   | 1 | 1 |  C
    5 | 1 | 0 | 0 |    1   | 0 | 0 |  A
    6 | 1 | 0 | 1 |    1   | 1 | 1 |  D
    7 | 1 | 1 | 0 |    1   | 0 | 0 |  A
    8 | 1 | 1 | 1 |    1   | 1 | 1 |  D
    

    最后一列显示等价类:

    • A:c = 0,结果为0,a和b都没有影响
    • B:a,b = 0,结果为0,c没有影响
    • C: b,c = 1,结果为 1,a 没有影响
    • D:a,c = 1,结果为1,b没有影响

    对于 B 和 C,选择哪个非常明显,对于 A 和 D 则不然。对于每个您必须检查的情况,如果我替换运算符,即或 -> 和,和 -> 或,会发生什么这会影响(子)决策的结果吗?如果结果会受到影响,你就有了候选人 - 如果没有,你没有。

    • A : (0 and/or 0) and/or 0 -> 没关系
    • A : (0 and 1) vs (0 or 1) -> 很重要! -> 候选人
    • A : (1 and 0) vs (1 or 0) -> 很重要! -> 候选人
    • A : (1 and/or 1) -> 没关系
    • D : (1 and 0) vs (1 or 0) -> 确实很重要 -> 候选人
    • D : (1 和 1) -> 没关系

    所以你得到了上面提到的最终测试集:

    • a = 0, b = 1, c = 0 -> 错误分支 (A) OR a = 1, b = 0, c = 0
    • a = 0, b = 0, c = 1 -> 错误分支 (B)
    • a = 0, b = 1, c = 1 -> 真正的分支 (C)
    • a = 1, b = 0, c = 1 -> 真正的分支 (D)

    尤其是后一种测试——改变操作符——可以使用像变异测试这样的工具来完成,它不仅可以替换操作符,还可以做更多的事情,即翻转操作数、删除语句、更改执行顺序、替换返回值等等。对于代码的每次更改,它都会验证测试是否真的失败了。这是测试套件质量的良好指标,并确保代码不仅被覆盖,而且您对代码的测试实际上是有效的。

    关于术语,我在某处找不到“复合决策覆盖”一词。在我看来,“复合决策”是条件的复合,换句话说:条件的复合。

    【讨论】:

    • 非常感谢您的回复。我同意您的观点,即无法找到“复合决策覆盖”一词 - 我已尝试在谷歌上搜索该词。 FWIW,它出现在 Mauro Pezzé 和 Michael Young 的“软件测试与分析”一书中。如果您想看一下,这里是有关复合条件覆盖的相应章节的幻灯片:ix.cs.uoregon.edu/~michal/book/slides/pdf/… 从幻灯片 16 开始。
    • “基本条件覆盖”与“多条件覆盖”不同。您可以通过在亚马逊的图书副本中搜索“基本条件覆盖”来查看Pezzè and Young 的定义。您将在第 12.4 节“条件测试”中看到它。
    • @Dave,是的,你是对的,定义有些误导,BCC 是覆盖单个条件的每个分支,即 a -> {true, false},而 MCC 是复合词, IE。该化合物中所有 BCC 的排列
    • 基本条件覆盖难以理解的部分原因是因为它不是直观的良好覆盖水平。它不保证分支甚至语句覆盖。
    【解决方案2】:

    关于术语,我没有使用“基本条件覆盖”和“多重条件覆盖”确切术语的单一来源。 Binder 的“Testing Object-Oriented Systems”说“条件覆盖”和“多条件覆盖”。 Everett & McLeod 的“软件测试”说“简单条件覆盖”和“复合条件覆盖”。但我确信每种情况下的第一个术语是您的“基本条件覆盖”,第二个是您的“复合条件覆盖”。我将在下面使用这些术语。

    基本条件覆盖是指程序中的每个基本条件在某些测试中为真,在某些测试中为假,与其他条件无关。在下面

    if a && b && c
      # do stuff
    else
      # do other stuff
    end
    

    有一个复合条件a && b && c,具有三个基本条件abc。只需要两个测试用例,一个所有基本条件都为真,一个所有基本条件都为假,即可获得完整的基本条件覆盖。基本条件恰好是复合条件的一部分并不重要。

    请注意,基本条件覆盖不是分支覆盖。如果复合条件是a && b && !c,上面这两个测试用例仍然可以实现基本条件覆盖,但不会实现分支覆盖。

    针对基本条件覆盖的一组不太积极优化的测试用例将有一个测试用例,其中三个基本条件都为假,三个测试用例的每个基本条件为真。那仍然只是复合条件中基本条件的八种可能组合中的四种。我们忽略了其他四个的不舒服的感觉是为什么会有复合条件覆盖。这需要对复合条件中每种可能的基本条件组合进行测试。在上面的示例中,您需要 8 个测试,每个可能的值组合为 abc,以获得完整的复合条件覆盖率。

    【讨论】:

    • 现在我真的很困惑,因为除非我误解了,否则您对“基本条件覆盖”的解决方案与@GeraldMucke 所述的解决方案不同,您将在其中创建一个真值表并编写所有组合在可能的真值中,给出 2^3 = 8 个测试用例。
    • 不是我想要传达的。基本 = 每个条件在一个测试中必须为真,在另一个测试中为假,独立于其他条件。复合 = 必须对复合条件中的所有基本条件组合进行测试。我会尝试编辑以使其更清晰。
    • 好的,明白了,但这和其他用户说的定义还是没有区别?
    • 确实如此。我会评论那个答案。
    • 没什么。你需要两个测试用例 x 为真,一个 y 为真,一个为假。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2021-10-23
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多