Покрытие кода в SimpleTest
Есть ли способ генерировать отчет о покрытии кода при использовании SimpleTest аналогично PHPUnit.
Я прочитал документацию SimpleTest на их сайте, но не могу найти четкий способ, как это сделать! Я наткнулся на этот сайт, который говорит
мы можем добавить
require_once (dirname(__FILE__).'/coverage.php')
к предполагаемому файлу, и он должен сгенерировать отчет, но это не сработало!
Если есть полезный сайт о том, как создать покрытие кода, поделитесь им здесь.
Большое спасибо.
2 ответа
Я не мог заставить его работать официально поддерживаемым способом, но вот кое-что, что я получил, я смог взломать, изучив их код. Это работает для SimpleTest v1.1.7, а не для их мастер-кода. На момент написания этой статьи v1.1.7 является последней версией и работает с новыми версиями PHP 7, хотя это и старая версия.
Прежде всего вы должны убедиться, что Xdebug установлен, настроен и работает. В моей системе есть версия CLI и Apache файла php.ini, которые должны быть правильно настроены в зависимости от того, пытаюсь ли я использовать PHP через Apache или просто напрямую из терминала. Есть альтернативы Xdebug, но большинство людей используют Xdebug.
Затем вы должны сделать библиотеку PHP_CodeCoverage доступной из вашего кода. Я рекомендую добавить его в ваш проект в качестве пакета для композитора.
Теперь вам просто нужно вручную использовать эту библиотеку для захвата покрытия кода и создания отчета. Как именно вы это сделаете, будет зависеть от того, как вы будете выполнять свои тесты. Лично я запускаю свои тесты на терминале, и у меня есть файл начальной загрузки, который запускает php до запуска скрипта. В конце файла начальной загрузки я включаю файл автозапуска SimpleTest, чтобы он автоматически запускал тесты в любых тестовых классах, которые были включены следующим образом:
require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';
Где-то внутри вашего файла начальной загрузки вам нужно будет создать фильтр, внести в белый список каталоги и файлы, о которых вы хотите сообщить, создать объект покрытия и передать фильтр конструктору, запустить покрытие, а также создать и зарегистрировать функцию завершения работы, которая изменится. способ, которым SimpleTest выполняет тесты, чтобы убедиться, что он также останавливает покрытие и генерирует отчет о покрытии. Ваш файл начальной загрузки может выглядеть примерно так:
<?php
require __DIR__.'/vendor/autoload.php';
$filter = new \SebastianBergmann\CodeCoverage\Filter();
$filter->addDirectoryToWhitelist(__DIR__."/src/");
$coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage(null, $filter);
$coverage->start('<name of test>');
function shutdownWithCoverage($coverage)
{
$autorun = function_exists('\run_local_tests'); // provided by simpletest
if ($autorun) {
$result = \run_local_tests(); // this actually runs the tests
}
$coverage->stop();
$writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade;
$writer->process($coverage, __DIR__.'/tmp/code-coverage-report');
if ($autorun) {
// prevent tests from running twice:
exit($result ? 0 : 1);
}
}
register_shutdown_function('\shutdownWithCoverage', $coverage);
require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';
Мне потребовалось некоторое время, чтобы выяснить, как, мягко говоря, документация по этой функции на самом деле не завершена.
После того, как ваш набор тестов запущен и запущен, просто включите эти строки перед строками, которые на самом деле его запускают:
require_once ('simpletest/extensions/coverage/coverage.php');
require_once ('simpletest/extensions/coverage/coverage_reporter.php');
$coverage = new CodeCoverage();
$coverage->log = 'coverage/log.sqlite'; // This folder should exist
$coverage->includes = ['.*\.php$']; // Modify these as you wish
$coverage->excludes = ['simpletest.*']; // Or it is even better to use a setting file
$coverage->maxDirectoryDepth = '1';
$coverage->resetLog();
$coverage->startCoverage();
Затем запустите ваши тесты, например:
$test = new ProjectTests(); //It is an extension of the class TestSuite
$test->run(new HtmlReporter());
Наконец, сгенерируйте ваши отчеты
$coverage->stopCoverage();
$coverage->writeUntouched();
$handler = new CoverageDataHandler($coverage->log);
$report = new CoverageReporter();
$report->reportDir = 'coverage/report'; // This folder should exist
$report->title = 'Code Coverage Report';
$report->coverage = $handler->read();
$report->untouched = $handler->readUntouchedFiles();
$report->summaryFile = $report->reportDir . '/index.html';
И это все. В зависимости от ваших настроек, вам может потребоваться небольшая настройка, чтобы она работала. Например, если вы используете autorun.php из simpletest, это может быть немного сложнее.