首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在爬行web应用程序时使用Xdebug度量代码覆盖率

在爬行web应用程序时使用Xdebug度量代码覆盖率
EN

Stack Overflow用户
提问于 2021-06-02 21:20:02
回答 1查看 309关注 0票数 1

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

因此,我的问题是如何使用Xdebug (我在这方面比较新)来实现这个功能。我在PHP上安装了Xdebug,但不知道如何启动?有人能想到给我一个步骤,因为我没有找到任何资源来帮助我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-04 13:30:16

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

在任何情况下,您都想做以下事情:

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

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

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

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

代码语言:javascript
复制
<?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代码覆盖率README.md中的介绍中复制了其中的大部分内容)

您需要用php.ini文件来配置这个文件

当您现在爬过您的网站时,您应该在/tmp/path/crawler/中获得一个包含每个请求的代码覆盖范围的文件,但要确保该目录首先存在。

合并代码覆盖率

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

PHP覆盖率也有一个方法。它看起来应该是:

代码语言:javascript
复制
<?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');
?> 

如果我有时间的话,我会拍一段视频。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67812731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档