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], добавив в будущем подклассы тестировщика.