代码覆盖率和 return

Code coverage percentage and return

我今天运行带有测试覆盖率的 Codeception,但如果我有以下代码,这对我来说很奇怪:

  return $created;
}

带有 } 的行被标记为 Dead code,因此它不计入代码覆盖率百分比。

问题 - 它应该以这种方式工作吗?我该怎么做才能让它计入代码覆盖率而不是标记为 Dead code

现在我可以拥有 2 个代码覆盖率为 94% 的文件,但其中一个可能是 100% 的代码覆盖率,因为那些行只有 }

编辑

我刚刚检查了它并找到了以下代码:

public function paginate(
    $perPage = 50,
    array $columns = ['*'],
    array $order = ['type', 'orderby', 'type_value']
) {
    return parent::paginate($perPage, $columns, $order);
}

一切都计算在代码覆盖率中。然而,列表行 } 仍然被标记为 Dead code

首先,不要过分关注100%的代码覆盖率。拥有 100% 的代码覆盖率并不意味着您的代码完全没有错误。创建有意义的单元测试并正确测试您的代码比仅仅添加不相关的测试或花费大量时间重写您的代码只是为了获得 100% 的代码覆盖率重要得多。

其次,如果不查看更多代码,就无法回答您的问题。我在这里做了一个很大的假设,但我假设你的 return 语句在条件块中的某个地方 - 而不是在函数的末尾。如果是这样,这样的方法可能 'solve' 你的问题

function returnTest($created) {

    if(!shouldThisMethodReturnCreated()) {
        $returnValue = false;
    } else {
        $returnValue = $created;
    }

    return $returnValue;
}

这是通过使用 XDEBUG PHP 的传统方式收集测试覆盖率数据的结果。 XDEBUG 捕获了 PHP 语句已被 PHP P 代码引擎执行的事实。 “}”不是声明!因此 "lines covered" 收集的数据不包括“}”,因为它实际上没有被执行。它可能比你的例子更糟;考虑:

   public function foo() {
          if (...)  {
              return ...;
          }
          if (...)  {
              return ...;
          }
          ...
   }

PHP 执行引擎没有 "execute" 任何“}”。他们很可能都被标记为死亡。

还有其他 PHP 测试覆盖率工具可以将测试(分支)点与源代码结构显式相关联。通过该关联,任何覆盖(执行)的 test/branch 点都隐含地覆盖了相应的代码结构。这将包括任何块的左大括号和右大括号,包括功能块......所以你遇到的特定问题不会发生。以这种方式捕获覆盖率数据可以比语句更细粒度;考虑 "x?y:z" 运算符。