2014-09-19 4 views
0

Я пытаюсь использовать xdebug для вычисления охвата кода тонким приложением. Результаты кажется ошибочным, так как он говорит мне, что весь код в обработчиках маршрутов не выполняется (и я сделал несколько запросов ...)Тонкий фреймворк и покрытие кода

<?php 
require 'vendor/autoload.php'; 
$app = new \Slim\Slim(); 
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); 
$app->get('/data', function() use ($app) { 
    echo "data"; 
}); 
$app->get('/STOP', function() use ($app) { 
    $data = xdebug_get_code_coverage(); 
    var_dump($data); 
}); 
$app->run(); 

Я запустить сервер с помощью:

php -S localhost:8080 -t . test.php 

А потом выполнить два требования:

curl http://localhost:8080/server.php/data 
curl http://localhost:8080/server.php/STOP > result.html 

выход покрытия в result.html говорит мне:

'.../test.php' => 
array (size=11) 
    0 => int 1 
    5 => int 1 
    6 => int -1 
    7 => int 1 
    8 => int 1 
    9 => int 1 
    10 => int -1 
    11 => int 1 
    12 => int 1 
    473 => int 1 
    1267 => int 1 

Строка 6 должна быть int 1, так как она была выполнена. Что мне не хватает?

ответ

0

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

Простое решение заключается в использовании двух других ответов: enter link description here и enter link description here для генерации отчетов покрытия с использованием PHP-кода-покрытие https://github.com/sebastianbergmann/php-code-coverage, а затем объединить все отчеты во внешнем скрипте.

Сервер теперь, как показано ниже:

<?php 
require 'vendor/autoload.php'; 
$app = new \Slim\Slim(); 
// https://stackoverflow.com/questions/19821082/collate-several-xdebug-coverage-results-into-one-report 
$coverage = new PHP_CodeCoverage; 
$coverage->start('Site coverage'); 
function shutdown() { 
    global $coverage; 
    $coverage->stop(); 
    $cov = serialize($coverage); //serialize object to disk 
    file_put_contents('coverage/data.' . date('U') . '.cov', $cov); 
} 
register_shutdown_function('shutdown'); 
$app->get('/data', function() use ($app) { 
    echo "data"; 
}); 
$app->run(); 

И сценарий слияние:

#!/usr/bin/env php 
<?php 
// https://stackoverflow.com/questions/10167775/aggregating-code-coverage-from-several-executions-of-phpunit 
require 'vendor/autoload.php'; 
$coverage = new PHP_CodeCoverage; 
$blacklist = array(); 
exec("find vendor -name '*'", $blacklist); 
$coverage->filter()->addFilesToBlacklist($blacklist); 
foreach(glob('coverage/*.cov') as $filename) { 
    $cov = unserialize(file_get_contents($filename)); 
    $coverage->merge($cov); 
} 
print "\nGenerating code coverage report in HTML format ..."; 
$writer = new PHP_CodeCoverage_Report_HTML(35, 70); 
$writer->process($coverage, 'coverage'); 
print " done\n"; 
print "See coverage/index.html\n"; 

Сценарий слияния также помещает все в vendor в черный список.

Смежные вопросы