Покрытие кода для laravel в сумерках

Есть ли способ получить покрытие кода при запуске Laravel Dusk?

Я знаю, что он запускает тесты браузера, поэтому он не проверяет код, но есть ли способ добавить прослушиватель, чтобы проверить, какой код покрыт? Я ничего не видел на эту тему сейчас.


person rap-2-h    schedule 27.04.2017    source источник
comment
Интересно то же самое   -  person Nick Barrett    schedule 29.04.2017
comment
Браузер не видит исполняемый код.   -  person Marco Aurélio Deleu    schedule 08.08.2017
comment
Я хотел бы знать, какие маршруты были протестированы? Вместо традиционного покрытия кода   -  person Chris Mccabe    schedule 09.02.2018


Ответы (2)


Концептуально, вам нужно загружать все ваши запросы с помощью инструментов покрытия кода PHP Unit.

Вы можете сделать это напрямую с библиотеками phpunit или с помощью инструментов покрытия xdebug (которые используют phpunit).

Из этого примера, который я нашел, вы можете запустить инструменты покрытия на основе пары переданных параметров _GET с помощью теста «Сумерки».

public function testBasicExample()
{
      $this->browse(function (Browser $browser) {
          $browser->visit(route('test', [
              'test_name' => 'testBasicExample',
              'coverage_dir' => '/app/Http'
          ]))->assertSee('test');
      });
  }

Код, выполняющий работу, состоит из двух частей. 1. Начать сбор по параметрам:

$test_name = $_GET['test_name'];
require __DIR__ . '/../vendor/autoload.php';
$current_dir = __DIR__;
$coverage = new SebastianBergmann\CodeCoverage\CodeCoverage;
$filter = $coverage->filter();
$filter->addDirectoryToWhitelist(
    $current_dir . '/..' . ((isset($_GET['coverage_dir']) && $_GET['coverage_dir'])
        ? $_GET['coverage_dir']
        : '/app')
);
$coverage->start($test_name);

И 2 конца сбора и вывода:

function end_coverage()
{
    global $test_name;
    global $coverage;
    global $filter;
    global $current_dir;
    $coverageName = $current_dir . '/coverages/coverage-' . $test_name . '-' . microtime(true);
    try {
        $coverage->stop();
        $writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade;
        $writer->process($coverage, $current_dir . '/../public/report/' . $test_name);
        $writer = new SebastianBergmann\CodeCoverage\Report\PHP();
    } catch (Exception $ex) {
        file_put_contents($coverageName . '.ex', $ex);
    }
}

Конечная коллекция вызывается с помощью небольшого хитрого трюка, когда класс coverage_dumper имеет только деструктор, который вызывается автоматически, когда php завершает процесс.

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

person Darryl E. Clarke    schedule 19.09.2019
comment
Где я должен поместить этот код? - person Jan; 11.03.2021

Dusk использует браузеры для запуска тестов, и браузер не может видеть исполняемый PHP-код. Единственный способ, который я вижу для достижения покрытия кода с помощью Dusk, — это создать опцию в php artisan serve, которую можно было бы подсчитать и создать файл покрытия.

person Deric Lima    schedule 01.12.2017