SimpleTest

时间:2017-03-28 22:52:54

标签: testing code-coverage simpletest

使用类似于PHPUnit的SimpleTest时,有没有办法生成代码覆盖率报告。

我已经在他们的网站上阅读过SimpleTest的文档,但是找不到明确的方法! 我偶然发现了website

  

我们可以添加require_once (dirname(__FILE__).'/coverage.php')   到目标文件,它应该生成报告,但它不起作用!

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

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

首先,您必须确保已安装,配置和工作Xdebug。在我的系统上有一个CLI和Apache版本的php.ini文件必须正确配置,具体取决于我是通过Apache还是直接从终端使用PHP。 Xdebug还有其他选择,但大多数人都是Xdebug。

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

现在您只需手动使用该库来捕获代码覆盖率并生成报告。具体取决于您如何运行测试。就个人而言,我在终端上运行我的测试,并且我在启动脚本之前有一个php运行的bootstrap文件。在引导程序文件的最后,我包含了SimpleTest自动运行文件,因此它将自动运行任何包含的测试类中的测试:

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

在引导程序文件中的某处,您需要创建一个过滤器,将要报告的目录和文件列入白名单,创建一个coverage对象并将过滤器传递给构造函数,启动coverage,以及创建和注册关闭函数这将改变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';

答案 1 :(得分:1)

我花了一些时间才弄明白,因为 - 温和地说 - 这个功能的文档并不是真的完整。

一旦你的测试套件启动并运行,只需在实际运行它的行之前包含这些行:

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,那可能会有点棘手。