繁体   English   中英

如何使用 PHPUnit 获得 100% 的代码覆盖率

[英]How to get 100% Code Coverage with PHPUnit

我正在编写一个 Zend Framework 应用程序并使用 PHPUnit 对其进行单元测试。 总的来说,事情进展顺利,但是我在 PHPUnit 和代码覆盖率方面有一个小但令人讨厌的问题 - 它有时告诉我没有测试特定的行,我不知道如何强制它进行测试。

例如,在下面的代码中,我启动了两个测试:一个带有 GET 请求,一个带有 POST 请求。 测试通过了,这一切都很好。 然而,当我查看代码覆盖率时,它告诉我“else”行没有被执行。

public function editAction()
{        
    if ($request->isPost()) {
        // do actions related to POST
    } else {
        // do action related to GET
    }
}

有任何想法吗? 作为一个附带问题,您是否通常会坚持进行单元测试,直到获得 100% 的代码覆盖率? 或者这不是很实用?

非常感谢...

几年前,通过 ZF 1.0 的发布,我是 Zend 框架的项目负责人。 我非常努力地提高所有组件的测试覆盖率,并且我们制定了一项政策,即组件必须具有一定的最低代码覆盖率才能从孵化器中采用到 ZF。

但是,您是对的,试图从所有类的测试中获得 100% 的代码覆盖率并不实际。 ZF 中的一些类具有 100% 的覆盖率,但对于这些类,以下一项或多项是正确的:

  • class 非常简单。
  • 测试需要非凡的工作来编写。 例如,复杂的设置代码可以创建条件来执行所有晦涩的极端情况。 查看我为 Zend_Db 编写的单元测试,尽管强迫自己测试这些极端案例是有益的。 因为我保证它会引导您找到需要修复的代码。
  • class 必须被重构为更“可测试”。 无论如何,这通常是一件好事,因为您最终会得到更好的 OO 代码、更少的耦合、更少的 static 元素等。请参阅 Zend_Log 的类和测试。

但我们也意识到 100% 的代码覆盖率有时是一个人为的目标。 然而,达到 100% 覆盖率的测试套件可能就足够了。 覆盖率达到 100% 的测试套件并不一定能保证质量。

以下 function 很容易获得 100% 的代码覆盖率。 但是我们是否测试了除以零?

function div($numerator, $denominator) {
    return $numerator / $denominator;
}

因此,您应该将代码覆盖率作为测试的一项指标,而不是最终目标。

您只有注释的代码才是最重要的。 如果块的右大括号有可能出现在代码覆盖率报告中,则它会在代码覆盖率报告中显示为可执行文件。 寻找一个你实际上没有测试的分支。

if ($request->isPost()) {
    if ($x < 5) {
        return '<';
    }
    elseif ($x > 5) {
        return '>';
    }
    // Do you have a test for $x == 5?
}

至于 100% 的代码覆盖率目标,我完全同意 Bill。 对于我编写的一些框架类,我会努力做到 100%,但我知道这并不意味着我已经真正测试了每一种可能性。 通常,当我发现自己为了达到 100% 的覆盖率而努力工作时,可能是强迫症开始了。:)

只是。 . . 一。 . . 更多的。 . . 测试。 . .

如果这就是您的测试的全部内容,那么我会假设您的测试看起来像 Matthew 所描述的:

class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {
    // [...]
    public function testSomething()
    {
        $this->request
             ->setMethod('POST')
             ->setPost(array(
                 'username' => 'foobar',
                 'password' => 'foobar'
             ));
        $this->editAction();
        // assertThatTheRightThingsHappend
    }
}

在那种情况下,我看不出有任何理由为什么不容易获得 100% 的代码覆盖率。

但是是的:测试 Zend 框架控制器非常困难,有时您必须非常努力地从控制器中获取所有应用程序逻辑,或者只是忍受它。

不过,同样的事情不适用于您的模型。 这些应该很容易测试,即使在 ZF 应用程序中也是如此。

代码覆盖的目的是告诉您代码库的哪些部分甚至没有被执行 它不会告诉您真正测试了什么,只能作为了解测试套件质量的“最低限度”(如果您不使用@covers,即使这可能会欺骗您)。

简而言之:如果您有大型控制器并且不太容易更改架构,只需使用某某测试控制器进行设置,但不要将相同的逻辑应用于您的模型。 ZF 中的任何内容都不会阻止您正确测试这些

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM