Покрытие кода в 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, это может быть немного сложнее.

Другие вопросы по тегам