Intereting Posts
Какой быстрый способ очистки денежной строки PHP PDOStatement: Fetch A Row, как первый столбец как ключ массива Наследование статических членов в PHP Почему неопределенные константы оцениваются как истинные? Предупреждение: date () ожидает, что параметр 2 длинный, строка указана в Как использовать сеансы PHP с клиентским приложением REST? Регулярное выражение PHP для соответствия буквенно-числовым строкам с некоторыми (но не все) пунктуациями Найти массив ключей в php и изменить его значение или содержимое? Форум / Совет, написанный на одной из больших PHP-фреймворков Тег HTML5 для отображения подсветки синтаксиса Неожиданное поведение при назначении нескольких переменных в блоке if () Каковы различия в die () и exit () в PHP? Легкий способ экспорта таблицы SQL без доступа к серверу или phpMyADMIN Удаленный вход не работает с завихрением php-mysql извлекает следующий и предыдущий идентификатор из базы данных

Добавьте файлы в белый / черный список кода в `bootstrap.php` для PHPUnit

PHP_CodeCoverage 1.1 удалил аксессуар singleton для PHP_CodeCoverage_Filter который позволил нашим файлам bootstrap.php PHPUnit добавлять каталоги к белым / черным спискам. PHPUnit 3.5 использовал черный список для разделения классов на трассировки стека исключений, а CC использует белый список для ограничения отслеживания. Мы использовали обе эти функции.

Как я могу получить экземпляр PHP_CodeCoverage_Filter который PHPUnit будет использовать из файла bootstrap.php ?

Примечание. Мы не можем поместить их в phpunit.xml поскольку пути создаются из переменных окружения и файлов конфигурации.

Обновление: я вижу, что PHPUnit_Util_Filter больше не использует черный список покрытия кода для фильтрации трассировок стека. Это прекрасно, и поскольку этот класс предназначен для статического доступа, я мог бы добавить метод добавления каталогов пользователей в список. Это было бы легкое изменение и решить половину этого вопроса.

Это уродливый взлом, но он работает в 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); } 

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

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

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