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

问题描述 投票:0回答:1

我基于

ChromeDriver Selenium
构建我的爬虫,我想在我的自动爬虫爬取应用程序时测量 Web 应用程序的代码覆盖率。

所以,我的问题是如何使用 Xdebug 来做到这一点(我是新手)。我在 PHP 上安装了 Xdebug,但我不知道如何启动?任何人都可以给我一个想法,因为我没有找到任何可以帮助我的资源。

php selenium xdebug
1个回答
1
投票

我没有直接的例子,但我会通过以下方式解决这个问题。 代码未经测试,可能需要更改才能工作,以此为起点

无论如何,你要做以下几件事:

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

收集每个请求的代码覆盖率

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

要收集数据,我会执行

composer require phpunit/php-code-coverage
然后创建一个 auto_prepend 文件,其中包含以下内容:

<?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');
?>

(我从 php-code-coverage README.md 中的介绍中复制了大部分内容)

您需要使用

php.ini
配置此 prepend_file:auto_prepend_file

当您现在爬行网站时,您应该在

/tmp/path/crawler/
中获取一个包含每个请求的代码覆盖率的文件,但首先要确保该目录存在。

合并代码覆盖率

对于此步骤,您需要编写一个脚本来加载每个生成文件(查看glob()),并将它们合并在一起。

PHP 代码覆盖率也有一个方法。它看起来像:

<?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');
?> 

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

© www.soinside.com 2019 - 2024. All rights reserved.