将文件添加到PHPUnit的`bootstrap.php`中的代码覆盖率白/黑名单中

时间:2011-11-10 20:13:27

标签: php phpunit code-coverage

PHP_CodeCoverage 1.1删除了PHP_CodeCoverage_Filter的单例访问者,允许我们的PHPUnit bootstrap.php文件将目录添加到白名单/黑名单中。 PHPUnit 3.5使用黑名单从异常堆栈跟踪中剥离类,CC使用白名单来限制跟踪。我们使用了这两个功能。

如何从PHP_CodeCoverage_Filter文件中获取PHPUnit将使用的bootstrap.php实例?

注意:我们无法将这些内容放入phpunit.xml,因为路径是根据环境变量和配置文件构建的。

更新:我发现PHPUnit_Util_Filter不再使用代码覆盖黑名单来过滤堆栈跟踪。这很好,因为这个类是为静态访问而设计的,所以我可以添加一个方法来将用户目录添加到列表中。这将是一个简单的改变,并解决了这个问题的一半。

2 个答案:

答案 0 :(得分:2)

这是一个丑陋的黑客,但它适用于PHPUnit 3.6。我们已经有了自己的自定义测试用例基类,所有其他基类都扩展了。如果将文件添加到白名单中并不重要,您可以使用假测试用例来处理此部分。

首先,bootstrap.php根据需要多次调用BaseTestCase :: addXXXToCodeCoverageWhitelist()来填充稍后要添加的内部文件数组。接下来,要执行的第一个测试通过TestResult将这些文件添加到代码覆盖率过滤器。

abstract class BaseTestCase extends PHPUnit_Framework_TestCase
{
    private static $_codeCoverageFiles = array();

    public static function addDirectoryToCodeCoverageWhitelist($path) {
        self::addFilesToCodeCoverageWhitelist(self::getFilesForDirectory($path));
    }

    public static function addFileToCodeCoverageWhitelist($path) {
        self::addFilesToCodeCoverageWhitelist(array($path));
    }

    public static function addFilesToCodeCoverageWhitelist(array $paths) {
        self::$_codeCoverageFiles = array_merge(self::$_codeCoverageFiles, $paths);
    }

    public static function getFilesForDirectory($path) {
        $facade = new File_Iterator_Facade;
        return $facade->getFilesAsArray($path, '.php');
    }

    private static function setCodeCoverageWhitelist(PHP_CodeCoverage $coverage = null) {
        if ($coverage && self::$_codeCoverageFiles) {
            $coverage->setProcessUncoveredFilesFromWhitelist(true); // pick your poison
            $coverage->filter()->addFilesToWhitelist(self::$_codeCoverageFiles);
            self::$_codeCoverageFiles = array();
        }
    }

    public function runBare() {
        self::setCodeCoverageWhitelist($this->getTestResultObject()->getCodeCoverage());
        parent::runBare();
    }
}

更新:对于那些使用黑名单来保持框架类不像我们那样出现在断言失败堆栈跟踪中的人,将以下方法添加到上面的类中并从{{1 }}。这需要PHP 5.3中的bootstrap.php

setAccessible()

答案 1 :(得分:1)

我已向Sebastian询问过这个问题,并且他确认无法以编程方式使用PHPUnit 3.6访问CodeCoverage_Filter。

我的建议是通过使用模板动态创建phpunit.xml,然后在填写配置文件后填写添加所需的<directory>节点。

也许有一种方法可以通过在将来继承测试运行器来注入PHP_CodeCoverage [_Filter]对象。