代码覆盖百分比和回报

时间:2015-01-03 16:27:15

标签: phpunit code-coverage codeception

我今天运行带有测试覆盖率的Codeception,但如果我有以下代码,对我来说有什么奇怪之处:<​​/ p>

  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

2 个答案:

答案 0 :(得分:2)

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

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

function returnTest($created) {

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

    return $returnValue;
}

答案 1 :(得分:2)

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

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

PHP执行引擎不会“执行”任何“}”。他们很可能都被标记为死亡。

还有其他PHP测试覆盖率工具将测试(分支)点与源代码结构明确关联。通过该关联,任何覆盖(执行)的测试/分支点隐含地覆盖相应的代码结构。这将包括任何块的打开和关闭括号,包括功能块...所以你不会发生具体的问题。以这种方式捕获覆盖数据可以比语句更精细;考虑“x?y:z”运算符。