[英]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% 的覆盖率,但对于这些类,以下一项或多项是正确的:
但我们也意识到 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.