Я пытаюсь использовать 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
, как это было выполнено. Что мне не хватает?
Проблема, очевидно, в том, что покрытие, отображаемое в выходных данных, покрывает только второй запрос, так как весь PHP-скрипт запускается при каждом запросе.
Простое решение состоит в использовании двух других ответов: введите описание ссылки здесь а также введите описание ссылки здесь создавать отчеты о покрытии, используя php-code-покрытие 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
в черный список.
Других решений пока нет …