【问题标题】:Code coverage in SimpleTestSimpleTest 中的代码覆盖率
【发布时间】:2017-08-22 05:19:30
【问题描述】:

在使用类似于 PHPUnit 的 SimpleTest 时,有什么方法可以生成代码覆盖率报告。

我在他们的网站上阅读了 SimpleTest 的文档,但找不到明确的方法! 我遇到了这个website,上面写着

我们可以添加require_once (dirname(__FILE__).'/coverage.php') 到预期的文件,它应该生成报告,但它没有工作!

如果有关于如何生成代码覆盖率的有用网站,请在此处分享。

非常感谢。

【问题讨论】:

    标签: testing code-coverage simpletest


    【解决方案1】:

    我也无法让它以官方支持的方式工作,但这是我正在工作的东西,我可以通过检查他们的代码来破解它们。这适用于 SimpleTest 的 v1.1.7,而不是他们的主代码。在撰写本文时,v1.1.7 是最新版本,并且可以与 PHP 7 的新版本一起使用,即使它是旧版本。

    首先,您必须确保已安装、配置并正常运行 Xdebug。在我的系统上,必须正确配置 php.ini 文件的 CLI 和 Apache 版本,具体取决于我是尝试通过 Apache 还是直接从终端使用 PHP。有 Xdebug 的替代品,但大多数人使用 Xdebug。

    然后,您必须使 PHP_CodeCoverage 库可以从您的代码中访问。我建议将其作为 composer 包添加到您的项目中。

    现在您只需手动使用该库来捕获代码覆盖率并生成报告。你如何做到这一点取决于你如何运行你的测试。就个人而言,我在终端上运行我的测试,并且我有一个引导文件,php 在启动脚本之前运行它。在引导文件的末尾,我包含了 SimpleTest 自动运行文件,因此它会自动在任何包含的测试类中运行测试,如下所示:

    require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';

    您需要在引导文件中的某个位置创建过滤器,将要报告的目录和文件列入白名单,创建覆盖对象并将过滤器传递给构造函数,启动覆盖,并创建和注册关闭函数这将改变 SimpleTest 执行测试的方式,以确保它也停止覆盖并生成覆盖报告。您的引导文件可能如下所示:

    <?php
    require __DIR__.'/vendor/autoload.php';
    $filter = new \SebastianBergmann\CodeCoverage\Filter();
    $filter->addDirectoryToWhitelist(__DIR__."/src/");
    $coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage(null, $filter);
    $coverage->start('<name of test>');
    
    function shutdownWithCoverage($coverage)
    {
        $autorun = function_exists('\run_local_tests'); // provided by simpletest
        if ($autorun) {
            $result = \run_local_tests(); // this actually runs the tests
        }
        $coverage->stop();
        $writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade;
        $writer->process($coverage, __DIR__.'/tmp/code-coverage-report');
        if ($autorun) {
            // prevent tests from running twice:
            exit($result ? 0 : 1);
        }
    }
    register_shutdown_function('\shutdownWithCoverage', $coverage);
    require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';
    

    【讨论】:

      【解决方案2】:

      我花了一些时间才弄清楚,因为 - 委婉地说 - 这个功能的文档并不完整。

      一旦您的测试套件启动并运行,只需将这些行添加到实际运行它的行之前:

      require_once ('simpletest/extensions/coverage/coverage.php');
      require_once ('simpletest/extensions/coverage/coverage_reporter.php');
      
      $coverage = new CodeCoverage();
      $coverage->log = 'coverage/log.sqlite'; // This folder should exist
      $coverage->includes = ['.*\.php$'];     // Modify these as you wish
      $coverage->excludes = ['simpletest.*']; // Or it is even better to use a setting file
      $coverage->maxDirectoryDepth = '1';
      $coverage->resetLog();
      $coverage->startCoverage();
      

      然后运行您的测试,例如:

      $test = new ProjectTests(); //It is an extension of the class TestSuite
      $test->run(new HtmlReporter());
      

      最终生成您的报告

      $coverage->stopCoverage();
      $coverage->writeUntouched();
      
      $handler           = new CoverageDataHandler($coverage->log);
      $report            = new CoverageReporter();
      $report->reportDir = 'coverage/report'; // This folder should exist
      $report->title     = 'Code Coverage Report';
      $report->coverage  = $handler->read();
      $report->untouched = $handler->readUntouchedFiles();
      $report->summaryFile = $report->reportDir . '/index.html';
      

      就是这样。根据您的设置,您可能需要进行一些小的调整才能使其正常工作。例如,如果您使用的是 simpletest 中的 autorun.php,这可能会有点棘手。

      【讨论】:

        猜你喜欢
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 2012-10-08
        相关资源
        最近更新 更多