По некоторым причинам я хотел бы проанализировать покрытие кода моего приложения с помощью PHP_CodeCoverage, но не с использованием модуля PHP (с ручным тестированием).
Я знаю, как использовать XDebug в долгосрочной перспективе (для нескольких запросов, сохраняя анализ покрытия кода в общей памяти). Построение простых XML-файлов, таких как clover.xml (или любого другого формата) после некоторых тестов, не представляет трудностей при выводе XDebug (это простой ассоциативный массив, и он задокументирован).
Есть ли способ указать PHP_CodeCoverage использовать clover.xml (или другой формат файла) для генерации отчета в формате HTML (что очень хорошо). Или вы знаете простой хак, который бы полагался на внутреннюю функцию PHP_CodeCoverage, чтобы напрямую работать с выводом XDebug и генерировать HTML-отчет.
После некоторых экспериментов это то, что я разработал.
Во-первых, вам нужно использовать PHP_CodeCoverage как описано в документации. После окончания анализа кода покрытия вы можете сериализовать объект PHP_CodeCoverage во временный файл. Здесь я использую uniqid чтобы иметь уникальное имя для каждого запроса. Вам нужно применить свой код с помощью приведенного ниже фрагмента в общий сценарий вашего приложения (первая часть, где начинается запрос, а вторая часть, где он заканчивается):
require_once "phpcov/vendor/autoload.php";
$filter = new PHP_CodeCoverage_Filter();
$filter->addDirectoryToBlacklist(__DIR__ . "/phpcov");
$token = uniqid();
$coverage = new PHP_CodeCoverage(null, $filter);
$coverage->start($token);
//Do something
$coverage->stop();
$s = serialize($coverage);
file_put_contents('tmp/' . $token, $s);
Когда моя тестовая кампания завершена, я могу объединить все временные файлы в один и тот же PHP_CodeCoverage_Report_HTML:
require_once "phpcov/vendor/autoload.php";
$coverage = new PHP_CodeCoverage();
$files = glob('tmp/*');
foreach($files as $file) {
$s = file_get_contents($file);
$data = unserialize($s);
$coverage->merge($data);
}
$writer = new PHP_CodeCoverage_Report_HTML;
$writer->process($coverage, 'report-coverage');
Не забудьте установить PHP_CodeCoverage_Filter, чтобы исключить все нежелательные сценарии вашей платформы и многих библиотек, которые вы можете использовать.
Если вы используете CodeIgniter, вы можете положиться на хуки, как я сделал для мой проект.
Поэтому, если вы не хотите использовать php_unit или php_CodeCoverage просто для получения информации о покрытии кода, я понял, что написать его самому было довольно легко. Чтобы собрать данные в несколько файлов (по одному файлу на каждый прогон) было достаточно около 50 строк кода, а для последующего объединения всех прогонов покрытия кода было около 100 строк кода (я мог бы сократить его до 80 — это действительно не так сложно ). 100 строк кода выводят очень красивый документ с закрашенными линиями в пастельных зеленых тонах, строки кода, не закрашенные розовым фоном, и не имеющие значения строки (например, комментарии и пробелы) — на белом фоне.
Код довольно прост и легок для чтения, и его можно найти здесь:
https://github.com/jlgtechnologies/php_code_coverage/blob/master/php_code_coverage_report.php
Я добавил lgpl, но если вы хотите другую лицензию, дайте мне знать на github.
Просто включите php_code_coverage.php в верхней части одного из файлов, который вы хотите покрыть, и при необходимости вызовите фильтр белого списка, если вы хотите выполнять покрытие кода только для определенных файлов.
Затем вызовите другой файл из браузера, чтобы получить отчет: php_code_coverage_report.php
Файлы заканчиваются в / tmp /, поэтому, если вы изменили свой код или хотите сбросить покрытие, просто выполните rm -f / tmp / phpcc_ *
Вам понадобится модуль xdebug, установленный в php (не сложно — много инструкций в Интернете), но вам не понадобятся другие библиотеки.
Просто прочитайте код — он довольно понятен и прост. Только час или около того, чтобы написать это и заставить его работать