使用PHPUnit实现100%的代码覆盖率

nik*_*org 35 php testing phpunit code-coverage

我一直在为一个项目创建一个测试套件,虽然我意识到100%的覆盖率并不是人们应该努力指标,但在代码覆盖率报告中有一点奇怪,我想要一些澄清.

看截图:

在此输入图像描述

因为正在测试的方法的最后一行是a 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];
}
Run Code Online (Sandbox Code Playgroud)

有这个原因,还是一个小故障?

(是的,我通读了如何使用PHPUnit获得100%的代码覆盖率,不同的情况虽然相似.)

编辑:

通过报告跋涉,我注意到switch代码中其他地方的陈述也是如此.所以这种行为至少在某种程度上是一致的,但对我来说却令人困惑.

EDIT2:

我正在运行:OS X上的PHPUnit 3.6.7,PHP 5.4.0RC5,XDebug 2.2.0-dev

edo*_*ian 36

第一关:100%的代码覆盖率是一个重要指标,以争取为.通过精力充沛的努力并不总是可以实现,这并不总是很重要:)

问题来自于xDebug告诉PHPUnit这行是可执行的但未涵盖.

对于简单的情况,xDebug可以告诉该行无法访问,因此您可以获得100%的代码覆盖率.

请参阅下面的简单示例.


第二次更新

现在问题已得到解决,xDebug bugtracker因此构建新版本的xDebug将解决这些问题:)

更新(有关php 5.3.x的问题,请参见下文)

由于您运行的是PHP 5.4和xDebug的DEV版本,我已经安装了这些并进行了测试.我使用您评论过的相同输出遇到了与您相同的问题.

如果问题来自php-code-coverage(phpunit模块)xDebug,我不是100%肯定.它也可能是xDebug开发的问题.

我已经提交了一个错误,php-code-coverage我们将找出问题的来源.


对于PHP 5.3.x问题:

对于更复杂的情况下,这CAN失败.

对于您展示的代码我可以说的是"它适用于我"(下面的复杂示例).

也许更新xDebug和PHPUnit版本,然后再试一次.

我已经看到它与当前版本失败但它取决于整个班级有时看起来如何.

删除?:运算符和其他单行多语句的东西也可能有所帮助.

据我所知,xDebug中正在进行重构以避免更多这些情况.xDebug曾经希望能够提供"声明覆盖",并且应该修复很多这样的情况.目前在这里没有什么可以做的

虽然//@codeCoverageIgnoreStart并且//@codeCoverageIgnoreEnd将这条线"覆盖"但它看起来非常丑陋并且通常做得比坏更好.

对于发生这种情况的另一种情况,请参阅以下问题和答案:

what-to-do-when-project-coding-standards-conflicts-with-unit-test-code-coverage


简单的例子:

<?php
class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $x = new Foo();
        $this->assertSame(1, $x->bar());
    }
}

<?php
class Foo {
    public function bar() {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

生产:

phpunit --coverage-text mep.php 
PHPUnit 3.6.7 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.50Mb

OK (1 test, 1 assertion)

Generating textual code coverage report, this may take a moment.

Code Coverage Report 
  2012-01-10 15:54:56

 Summary: 
  Classes: 100.00% (2/2)
  Methods: 100.00% (1/1)
  Lines:   100.00% (1/1)

Foo
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
Run Code Online (Sandbox Code Playgroud)

复杂的例子:

<?php

require __DIR__ . '/foo.php';

class FooTest extends PHPUnit_Framework_TestCase {

    public function testBar() {
        $this->assertSame('b', Foo::getDomain('a'));
        $this->assertInstanceOf('Config', Foo::getDomain('foo'));
    }
}

<?php

class Foo {
    static $domains = array('a' => 'b');

    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];
    }
}

class Config {}
Run Code Online (Sandbox Code Playgroud)

生产:

PHPUnit 3.6.7 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.50Mb

OK (1 test, 2 assertions)

Generating textual code coverage report, this may take a moment.

Code Coverage Report 
  2012-01-10 15:55:55

 Summary: 
  Classes: 100.00% (2/2)
  Methods: 100.00% (1/1)
  Lines:   100.00% (5/5)

Foo
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
Run Code Online (Sandbox Code Playgroud)