laravel dusk 的代码覆盖率

Code coverage for laravel dusk

在运行 Laravel Dusk时有什么办法可以得到代码覆盖率吗?

我知道它会运行浏览器测试,所以它不会检查代码,但是有没有办法添加一个侦听器来检查覆盖了哪些代码?我现在没有看到关于这个主题的任何内容。

Dusk 正在使用浏览器进行 运行 测试,浏览器无法看到正在执行的 PHP 代码。 我看到用 Dusk 实现代码覆盖的唯一方法是在 php artisan serve 中创建一个选项,可以计算和创建覆盖文件。

从概念上讲,您需要使用 PHP 单元的代码覆盖工具 bootstrap 所有请求。

您可以直接使用 php 单元库或通过 xdebug's coverage tools(使用 php 单元)执行此操作。

根据我发现的 this sample 要点,您可以根据通过 Dusk 测试传递的几个 _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);
    }
}

使用巧妙的小技巧调用结束集合,其中 class coverage_dumper 只有一个析构函数,当 php 结束进程时会自动调用它。

就输出路径和变量而言,代码本身可以使用一些整理,但从概念上讲,它应该可以工作。