PHP - 代码覆盖率 - 无法覆盖某些行...(Netbeans)

6
在我的NetBeans中,我已经设置了一个ZF2应用程序的项目,并使用PHPUnit。一切都很好,但是当我尝试收集代码覆盖率时,它无法覆盖某些行,我不理解也无法解释。
代码如下:
    switch($type) {
        case 'date':
            return date('Y-m-d', strtotime($value));
        case 'numeric':
        default:
            return $value;
    }

在这里,UnitTest测试了两种情况,但是switch语句的结束括号没有被覆盖。

另一个例子:

    foreach ($this->userRoleNames as $role) {
        if (self::$acl->hasResource($moduleName)) {
            if (self::$acl->isAllowed($role, $moduleName)) {
                return true;
            }
/* > */ }

        if (self::$acl->hasResource($privilageName)) {
            if (self::$acl->isAllowed($role, $privilageName)) {
                return true;
            }
/* > */ }

        if (self::$acl->hasResource($privilageNameFull)) {
            if (self::$acl->isAllowed($role, $privilageNameFull)) {
                return true;
            }
/* > */ }
    }

这里所有包含/* > */的行也没有被覆盖,即使单元测试正在测试任何可能的条件组合。

仅因为这些未覆盖的行,我无法达到100%的代码覆盖率。

我正在使用:

  • PHPUnit 3.7.22
  • PHP 5.3.10-1ubuntu3.8 with Suhosin-Patch
  • Netbeans 7.4 (b. 201310111528)

注意:奇怪的是,在其他不会返回任何值的ifforeachswitch语句中,它们的闭合括号}既不匹配为已覆盖也不匹配为未覆盖(已覆盖的行呈绿色突出显示,未覆盖的行呈红色 - 这些行只是白色的 - 请参见附图),因此对代码覆盖率百分比没有影响...

是否有任何方法可以使PHPUnit(NB中的代码覆盖模块)或通过调整PHPUnit测试覆盖这些行?

Code coverage example from NetBeans

1个回答

3
下图中未被覆盖的}是明确的——由于case子句中的return语句,它永远不会被执行。因此switch($type)块没有完全执行,导致(我猜)出现了白色背景。
只需重构开关语句,不要在case块中返回值,而是分配一个返回值,在函数末尾返回该值即可。

将开关更改为不返回值,而是分配它们,然后返回 - 没有更改,仍然未覆盖开关的闭合括号。但是,在我删除了**default:**子句之后,现在代码被100%覆盖,即使开关及其闭合括号是白色(跳过)。无论如何,这并不能解决我问题中定义的if语句的问题... - shadyyx
如果你所说的是真的,那么任何一个关闭方法括号都无法被覆盖,因为你在其中有一个return ...;... 听起来很奇怪... - shadyyx
代码覆盖分析并非由 PHP 自身完成,而是由 Xdebug 等工具完成。这些工具很棒,但并非完美无缺。因此,这可能只是 Xdebug 中的一个 bug。我曾遇到过整个方法被声明为死代码的情况,但我在终端上看到了它们的输出。 - l-x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接