Php 在抓取web应用程序时使用Xdebug测量代码覆盖率

Php 在抓取web应用程序时使用Xdebug测量代码覆盖率,php,selenium,xdebug,Php,Selenium,Xdebug,我基于ChromeDriver Selenium构建了我的爬虫程序,我想在我的自动爬虫程序对应用程序进行爬虫时测量web应用程序的代码覆盖率 所以,我的问题是如何使用Xdebug(我对它比较新)。我在PHP上安装了Xdebug,但不知道如何启动?因为我没有找到任何可以帮助我的资源,有人能给我一个方法吗?我没有一个直接的例子,但我会用下面的方法来解决这个问题代码未经测试,可能需要更改才能工作,请以此为起点 在任何情况下,您都需要执行以下操作: 收集每个请求的代码覆盖率数据,并将其存储到文件中 聚合

我基于
ChromeDriver Selenium
构建了我的爬虫程序,我想在我的自动爬虫程序对应用程序进行爬虫时测量web应用程序的代码覆盖率


所以,我的问题是如何使用Xdebug(我对它比较新)。我在PHP上安装了Xdebug,但不知道如何启动?因为我没有找到任何可以帮助我的资源,有人能给我一个方法吗?

我没有一个直接的例子,但我会用下面的方法来解决这个问题代码未经测试,可能需要更改才能工作,请以此为起点

在任何情况下,您都需要执行以下操作:

  • 收集每个请求的代码覆盖率数据,并将其存储到文件中
  • 聚合每个运行的代码覆盖率数据,并合并它们
  • 收集每个请求的代码覆盖率

    传统上,使用PHPUnit为单元测试生成代码覆盖率。PHPUnit使用一个单独的库,为每个测试收集的覆盖率收集、合并和生成报告。您可以单独使用此库

    为了收集数据,我将执行
    composer require phpunit/php code coverage
    ,然后创建一个自动预结束文件,其中包含如下内容:

    <?php
    require 'vendor/autoload.php';
    
    use SebastianBergmann\CodeCoverage\Filter;
    use SebastianBergmann\CodeCoverage\Driver\Selector;
    use SebastianBergmann\CodeCoverage\CodeCoverage;
    use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport;
    
    $filter = new Filter;
    $filter->includeDirectory('/path/to/directory');
    
    $coverage = new CodeCoverage(
        (new Selector)->forLineCoverage($filter),
        $filter
    );
    
    $coverage->start($_SERVER['REQUEST_URI']);
    
    function save_coverage()
    {
        global $coverage;
        $coverage->stop();
        $data = $coverage->getData();
    
        file_put_contents('/tmp/path/crawler/' . bin2hex(random_bytes(16)), serialize($data) . '.serialized', $data->get );
    }
    
    register_shutdown_function('save_coverage');
    ?>
    

    如果我有时间,我会做一个视频。

    FWIW,我现在已经录制了一个视频,但我还没有编辑。最终的结果略有不同,尤其是在进行合并时。如果您想让我用完整的示例更新此内容,请告诉我。是的,如果您有时间:)谢谢
    <?php
    require 'vendor/autoload.php';
    
    use SebastianBergmann\CodeCoverage\Filter;
    use SebastianBergmann\CodeCoverage\Driver\Selector;
    use SebastianBergmann\CodeCoverage\CodeCoverage;
    use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport;
    
    $filter = new Filter;
    $filter->includeDirectory('/path/to/directory');
    
    $coverage = new CodeCoverage(
        (new Selector)->forLineCoverage($filter),
        $filter
    );
    
    foreach ( glob('/tmp/path/crawler/*.serialize') as $file)
    {
        $data = unserialize( file_get_contents( $file ) );
    
        $fileCoverage = new CodeCoverage(
            (new Selector)->forLineCoverage($filter),
            $filter
        );
        $fileCoverage->setData( $data );
        $coverage->merge( $fileCoverage );
    }
    
    /* now generate the report, as per the README.md again */
    (new HtmlReport)->process($coverage, '/tmp/code-coverage-report');
    ?>