2015-01-23 2 views
1

Я пытаюсь создать отчет по охвату HTML-кода для запуска PHP-приложения. Моя цель - профилировать приложение с XDebug, пока я запускаю свои функциональные тесты, чтобы определить охват кода моего функционального набора тестов.Как генерировать отчеты о покрытии кода PHP из вывода xdebug

Я могу измерить покрытие кода для своих модульных тестов через phpunit (который использует API-интерфейс покрытия php-кода для индивидуального анализа каждого модульного теста, а затем сводит его в отчет о покрытии кода). И поскольку эти инструменты построены поверх xdebug, я надеюсь, что есть способ взять выходной файл из профайлера XDebug и сгенерировать отчет HTML.

Вот что я до сих пор:

Я могу создать файл cachegrind.out, добавив следующую конфигурацию в php.ini:

xdebug.profiler_enable_trigger=1 
xdebug.profiler_output_dir=/var/log/xdebug_profiler 
xdebug.profiler_output_name=cachegrind.out 
xdebug.profiler_append=1 
xdebug.coverage_enable=1 

Затем работает мои функциональные тесты с XDebug Расширение Chrome Chrome в режиме «ПРОФИЛЬ». Это добавляет XDEBUG_PROFILE в поле cookie HTTP-запросов, которое, в свою очередь, запускает профайлер в приложении PHP. (В качестве альтернативы вы можете просто включить профилировщик для всех запросов с помощью xdebug.profiler_enable = 1)

Проблема, с которой я сталкиваюсь, заключается в преобразовании выходного файла (cachegrind.out) в тот же вид html-отчета, который предоставляется PHPUnit. Я могу сделать вывод профилировщика с помощью kcachegrind, но у этого приложения нет способа экспортировать отчет о покрытии кода, не говоря уже о том, чтобы указать включенные/исключенные файлы.

Я также изучил инструмент командной строки phpcov, но, несмотря на то, что он поддерживает сериализованные объекты PHP_CodeCoverage, он не работает с XDebug cachegrind файлами.

Я надеюсь, что могу написать PHP, который импортирует выходной файл профайлера XDebug (cachegrind.out) в объект PHP_CodeCoverage, а затем после примера в исходном коде PHPUnit, чтобы сделать HTML-отчет. Кто-нибудь имеет опыт профилирования запущенного приложения PHP таким образом? Есть ли более простой способ сделать это?

Я хотел бы избежать использования PHP_CodeCoverage непосредственно в исходном коде PHP-приложения, если это возможно.

+0

Это кажется, что много работы, чтобы избежать использования уже- существующих инструментов.Почему бы вам не использовать обычные инструменты для тестирования на основе XDEBUG на базе PHP? –

ответ

2

Вы не можете получить данные о покрытии мелкозернистого кода из анализа данных профилирования. У последнего есть только информация о том, что функция или метод были выполнены. Хотя этого достаточно для расчета слабого варианта покрытия функций и покрытия методов, этого недостаточно, чтобы, например, получить мелкозернистый охват линий.

1

Я закончил это с помощью библиотеки PHP Code Coverage. Я создал объект и начал отслеживать покрытие кода в кэше CodeIgniter pre_system и написал отчет о покрытии в файл в post_system CodeIgniter. Затем я создал сценарий для объединения объектов-покрытий-php и вывел их как HTML.

Я думал, что слияние файлов HTML будет возможно с phpcov, но я не смог объединить .html-отчеты из-за отсутствующего файла «Шаблон». Я также с удивлением обнаружил, что phpcov не позволяет вам указать формат вывода для объединенных файлов (т. Е. Я мог бы объединять файлы .cov, но не мог выводить их в отчет .html).

Так вот мой код слияния, в основном просто extension of this post, но его метод для десериализации .cov файлов не работает для меня в PHP 5.3

<?php 
/** 
* "Deserializes" PHP_CodeCoverage objects from the files passed on the command line, 
* combines them into a single coverage object and creates an HTML report of the 
* combined coverage. 
*/ 
require_once '/var/www/quickstart/vendor/autoload.php'; 

if ($argc <= 1) { 
    die("Usage: php generate-coverage-report.php cov-file1 [cov-file2 cov- file3...]\n"); 
} 

foreach (array_slice($argv, 1) as $filename) { 
    if (isset($codeCoverage)) { 
     // Reconstruct serialized output (from .cov file such as generated from 'phpunit --coverage-php') 
     $_coverage = include($filename); 
     // $codeCoverage->filter()->addFilesToWhitelist($_coverage->filter()->getWhitelist()); 
     $codeCoverage->merge($_coverage); 
     unset($_coverage); 
    } else { 
     $codeCoverage = include($filename); 
    } 
} 

print "\nGenerating code coverage report in HTML format ..."; 

// Based on PHPUnit_TextUI_TestRunner::doRun 
$writer = new PHP_CodeCoverage_Report_HTML(
    'UTF-8', 
    false, // 'reportHighlight' 
    35, // 'reportLowUpperBound' 
    70, // 'reportHighLowerBound' 
    sprintf(
    ' and <a href="http://phpunit.de/"></a>' 
    //PHPUnit_Runner_Version::id() 
    ) 
); 

$writer->process($codeCoverage, 'coverage'); 

print " done\n"; 
print "See coverage/index.html\n"; 
Смежные вопросы