【问题标题】:Slim framework and code coverageSlim 框架和代码覆盖率
【发布时间】:2014-09-27 19:57:16
【问题描述】:

我正在尝试使用 xdebug 来计算超薄应用程序的代码覆盖率。结果似乎是错误的,因为它告诉我路由处理程序中的所有代码都没有执行(我做了一些请求......)

<?php
require 'vendor/autoload.php';
$app = new \Slim\Slim();
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
$app->get('/data', function () use ($app) {
  echo "data";
});
$app->get('/STOP', function () use ($app) {
  $data = xdebug_get_code_coverage();
  var_dump($data);
});
$app->run();

我使用以下方式运行服务器:

php -S localhost:8080 -t . test.php

然后执行两个请求:

curl http://localhost:8080/server.php/data
curl http://localhost:8080/server.php/STOP > result.html

result.html 中的覆盖率输出告诉我:

'.../test.php' => 
array (size=11)
  0 => int 1
  5 => int 1
  6 => int -1
  7 => int 1
  8 => int 1
  9 => int 1
  10 => int -1
  11 => int 1
  12 => int 1
  473 => int 1
  1267 => int 1

第 6 行应该是int 1,因为它已经被执行了。我错过了什么?

【问题讨论】:

    标签: php xdebug


    【解决方案1】:

    问题显然是输出中显示的覆盖范围只涵盖了第二个请求,因为整个 PHP 脚本在每个请求时都运行。

    简单的解决方案是使用另外两个答案:enter link description hereenter link description here 使用 php-code-coverage https://github.com/sebastianbergmann/php-code-coverage 生成覆盖率报告,然后将所有报告合并到外部脚本中。

    服务器现在如下:

    <?php
    require 'vendor/autoload.php';
    $app = new \Slim\Slim();
    // https://stackoverflow.com/questions/19821082/collate-several-xdebug-coverage-results-into-one-report
    $coverage = new PHP_CodeCoverage;
    $coverage->start('Site coverage');
    function shutdown() {
      global $coverage;
      $coverage->stop();
      $cov = serialize($coverage); //serialize object to disk
      file_put_contents('coverage/data.' . date('U') . '.cov', $cov);
    }
    register_shutdown_function('shutdown');
    $app->get('/data', function () use ($app) {
      echo "data";
    });
    $app->run();
    

    合并脚本是:

    #!/usr/bin/env php
    <?php
    // https://stackoverflow.com/questions/10167775/aggregating-code-coverage-from-several-executions-of-phpunit
    require 'vendor/autoload.php';
    $coverage = new PHP_CodeCoverage;
    $blacklist = array();
    exec("find vendor -name '*'", $blacklist);
    $coverage->filter()->addFilesToBlacklist($blacklist);
    foreach(glob('coverage/*.cov') as $filename) {
      $cov = unserialize(file_get_contents($filename));
      $coverage->merge($cov);
    }
    print "\nGenerating code coverage report in HTML format ...";
    $writer = new PHP_CodeCoverage_Report_HTML(35, 70);
    $writer->process($coverage, 'coverage');
    print " done\n";
    print "See coverage/index.html\n";
    

    合并脚本还将vendor中的所有内容都放入黑名单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2015-03-01
      • 2023-03-27
      • 2012-06-11
      相关资源
      最近更新 更多