Добавьте файлы в белый / черный списки с покрытием кода в `bootstrap.php` для PHPUnit - PullRequest
2 голосов
/ 11 ноября 2011

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 ]

2 голосов
/ 27 января 2012

Это ужасный хак, но он работает в 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();
    }
}

Обновление: Для всех, кто использовал черный список, чтобы сохранить классы инфраструктуры отобнаруживая в трассировке стека ошибок утверждений, как мы это сделали, добавьте следующие методы в вышеприведенный класс и вызовите их из вашего bootstrap.php.Для этого требуется setAccessible() из PHP 5.3.

    public static function ignoreDirectoryInStackTraces($path) {
        ignoreFilesInStackTraces(self::getFilesForDirectory($path));
    }

    public static function ignoreFileInStackTraces($path) {
        ignoreFilesInStackTraces(array($path));
    }

    public static function ignoreFilesInStackTraces($files) {
        static $reflector = null;
        if (!$reflector) {
            PHPUnit_Util_GlobalState::phpunitFiles();
            $reflector = new ReflectionProperty('PHPUnit_Util_GlobalState', 'phpunitFiles');
            $reflector->setAccessible(true);
        }
        $map = $reflector->getValue();
        foreach ($files as $file) {
            $map[$file] = $file;
        }
        $reflector->setValue($map);
    }
1 голос
/ 14 ноября 2011

Я спросил об этом Себастьяна, и он подтвердил, что нет никакого способа программно получить доступ к CodeCoverage_Filter с помощью PHPUnit 3.6.

Мое предложение было бы также создать динамически phpunit.xml с помощью шаблона, а затемзаполнение, добавляя необходимые <directory> узлы после заполнения файла конфигурации.

Возможно, будет способ внедрить объекты PHP_CodeCoverage [_Filter] путем создания в будущем подкласса тестового бегуна.

...