【发布时间】:2012-01-10 13:35:16
【问题描述】:
我一直在为一个项目创建一个测试套件,虽然我意识到获得 100% 的覆盖率并不是一个应该努力实现的指标,但其中有一个奇怪的地方我想澄清一下代码覆盖率报告。
看截图:
因为正在测试的方法的最后一行是return,所以最后一行(它只是一个右括号)显示为从未被执行,因此整个方法在概述。 (要么这样,要么我没有正确阅读报告。)
完整方法:
static public function &getDomain($domain = null) {
$domain = $domain ?: self::domain();
if (! array_key_exists($domain, self::$domains)) {
self::$domains[$domain] = new Config();
}
return self::$domains[$domain];
}
这是有原因的,还是故障?
(是的,我通读了How to get 100% Code Coverage with PHPUnit,虽然相似,但大小写不同。)
编辑:
继续阅读报告,我注意到代码中其他地方的 switch 语句也是如此。所以这种行为至少在某种程度上是一致的,但让我感到困惑。
编辑2:
我正在运行:OS X 上的 PHPUnit 3.6.7、PHP 5.4.0RC5、XDebug 2.2.0-dev
【问题讨论】:
-
@Lieven 返回的是方法的最后一行,不过我也贴出了完整的方法。
-
我看到的唯一奇怪的地方是 & b 返回一个引用。在 PHP 5.x 中,所有对象都是引用。我认为这不会导致 Xdebug 出错,它适用于 edorian,但您可能想尝试删除它。
-
@DavidHarkness 也许,但正如我在编辑中提到的那样,
switch语句也会发生同样的情况。所有案例都以break结尾,因此应该会跳过右括号。对我来说,括号被认为是一行可运行代码对我来说似乎很奇怪。 -
本身不是可运行的右大括号,而是通过跌落退出块。使用
return、continue、break、throw等会改变常规的执行流程。但是,在这种情况下,Xdebug 似乎错误地检测到不可能通过,因为return是无条件的。 -
我不会在
function中说return,或者在switch中说break是如此不规则或如此奇怪的事件,以至于它应该破坏代码覆盖率分析器。但它已经被确定为一个错误,请参阅 Edorian 答案中的 cmets。
标签: php testing phpunit code-coverage