在一个语句中测试许多AND/OR条件的覆盖范围

raj*_*jan 6 java junit unit-testing code-coverage mc-dc

示例声明:

if (conditionA && conditionB && conditionC && conditionD) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我可以为所有2 ^ 4组合编写单元测试,但如果添加更多条件,这很容易失控.

我的单元测试策略应该涵盖这样的声明的所有条件?有没有其他方法可以使代码更健壮?

Ada*_*tes 6

我看到这种情况的方式是1条幸福的道路和4个潜在的失败点.如果每个条件都是允许返回true的关键,那么写下来是合理的:

  1. 单个快乐路径单元测试,逻辑返回true的唯一情况.和
  2. 每个变量的单元测试可能导致检查失败,断言单个变量具有阻止条件通过的能力.

我理解可以编写通过这些检查的逻辑,但是当多个变量都是假的时候实际上会返回true ...但是我真的不会担心这样的情况,除非你正在研究宇宙飞船或生死攸关的事情.参与其中.在几乎所有情况下,测试人员只是测试实现在任何变量失败时失败.


ava*_*sen 5

关于这个主题已经写了很多,你的问题似乎要求MC/DC.

有一个由多个条件组成的谓词导致决策.应用于问题谓词的众所周知的覆盖标准包括:

  1. 决策覆盖:确保整体谓词一次为真,一旦为假.
    这导致两个测试用例,例如(T,T,T,T)和(F,T,T,T).

  2. 基本条件覆盖:确保每个条件都是真和假.
    这也可以通过两个测试用例来实现:(T,T,T,T)和(F,F,F,F).
    请注意,基本条件覆盖率不一定意味着决策覆盖范围(例如:"P AND Q"与测试用例(T,F)和(F,T)满足基本条件覆盖率,但两者都评估为F,因此无法实现100%决策覆盖).

  3. 修改的条件/决策覆盖范围(MC/DC).决策和基本条件覆盖的组合,"修改",以便它还要求每个条件必须单独确定结果.Edwin Buck答案是有效的MC/DC封面(TTTT,FTTT,TFTT,TTFT,TTTF).
    通常,对于N个条件,MC/DC需要N + 1个测试用例而不是2 ^ N个.因此,它在严格(每个测试条件)和效率(测试所有2 ^ 4可能不是必需的)之间取得了良好的平衡.这背后的直觉正是亚当贝茨答案中的推理.

  4. 完整条件覆盖:测试所有2 ^ N种可能的组合.