Как использовать PHP_CodeCoverage без PHPUnit?

По некоторым причинам я хотел бы проанализировать покрытие кода моего приложения с помощью PHP_CodeCoverage, но не с использованием модуля PHP (с ручным тестированием).

Я знаю, как использовать XDebug в долгосрочной перспективе (для нескольких запросов, сохраняя анализ покрытия кода в общей памяти). Построение простых XML-файлов, таких как clover.xml (или любого другого формата) после некоторых тестов, не представляет трудностей при выводе XDebug (это простой ассоциативный массив, и он задокументирован).

Есть ли способ указать PHP_CodeCoverage использовать clover.xml (или другой формат файла) для генерации отчета в формате HTML (что очень хорошо). Или вы знаете простой хак, который бы полагался на внутреннюю функцию PHP_CodeCoverage, чтобы напрямую работать с выводом XDebug и генерировать HTML-отчет.

4

Решение

После некоторых экспериментов это то, что я разработал.

Во-первых, вам нужно использовать 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, вы можете положиться на хуки, как я сделал для мой проект.

1

Другие решения

Поэтому, если вы не хотите использовать 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 (не сложно — много инструкций в Интернете), но вам не понадобятся другие библиотеки.

Просто прочитайте код — он довольно понятен и прост. Только час или около того, чтобы написать это и заставить его работать

0