语句覆盖(Statement Coverage)|判定覆盖(Decision Coverage)|修订的条件/判定覆盖(Modified Condition/Decision Coverage)

来源:互联网 发布:java软件开发培训中心 编辑:程序博客网 时间:2024/04/30 08:02
  • 语句覆盖(Statement Coverage)
    • 又称行覆盖(Line Coverage),段覆盖(Segment Coverage),基本块覆盖(Basic Block Coverage)
    • 这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了
    • 这里说的是“可执行语句”,因此就不会包括像C++的头文件声明,代码注释,空行,等等
    • 语句覆盖常常被人指责为“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等
    • 简言之,语句覆盖,就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这里的“若干个”,意味着使用测试用例越少越好
    • 语句覆盖率 = 被测试到的语句数量 / 可执行的语句总数 x 100%

  • 判定覆盖(Decision Coverage)
    • 又称为分支覆盖(Branch Coverage)
    • 所谓判定覆盖,就是设计若干个测试用例,运行被测程序,使得程序中每个判定的取真分支和取假分支至少被测试一次
    • 【优点】:判定覆盖具有比语句覆盖更强的测试能力,而且具有和语句覆盖一样的简单性,无需细分每个判定就可以得到测试用例
    • 【缺点】:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径

  • 修订的条件/判定覆盖(Modified Condition/Decision Coverage)
    • MC/DC(修订的条件/判定覆盖,Modified Condition/Decision Coverage)准则是一种实用的软件结构覆盖率测试准则, 已被广泛地应用于软件验证和测试过程中
    • 下举例来详细说明MC/DC下测试用例的设计准则:
      • 看下代码:
        • if (A() || B() && C()) {    do action1();} else {    do action2();}
      • A(),B(),C()都是一个条件,而(A() || B() && C())叫一个Decision,如果是判定覆盖的话只需两个case就能覆盖,就是让这个decision为true和false各一次
      • 如果是MC/DC的话就得四个case,而且只比条件数目多一个而已,怎么计算的呢?
      • 定义: 在每个判定中的每个条件都曾独立的影响判定的结果至少一次, (独立影响意思是在其他的条件不变的情况下,改变一个条件)
      • 那么就有如下测试用例(true和false的顺序就按照A()、B()、C()来):
        • A()对结果独立影响,那么就要求"B()"和"C()"中至少一个为false,于是有:
          • A()独立影响且decision为true:
            • true false false
            • true false true
            • true true false
          • A()独立影响且decision为false:
            • false false false
            • false false true
            • false true false
        • B()对结果独立影响,那么就要求"A()"为false,"C()"为true,于是有:
          • B()独立影响且decision为true:
            • false true true
          • B()独立影响且decision为false:
            • false false true
        • C()对结果独立影响,那么就要求"A()"为false,"B()"为true,于是有:
          • C()独立影响且decision为true:
            • false true true
          • C()独立影响且decision为false:
            • false true false

    • 需要进一步补充说明的是,MC/DC测试的主要目的是为了防止在组合条件表达式中包含边际效应(side effect),如以下语句:
      • if (A() || B() || C()) {    statements...;}
    • 当B()函数或C()函数具备边际效应时,MC/DC测试存在非常大的必要性
    • 原则上不应在组合条件表达式中调用包含边际效应的函数