2017-03-28 15 views
1

PHPUnitと同様のSimpleTestを使用すると、コードカバレッジレポートを生成する方法はありません。
SimpleTestのコードカバレッジ

私はSimpleTestのドキュメントをウェブサイトで読んだことがありますが、それを行う方法については明確な方法がありません。 私はこのwebsiteに出くわした私たちが意図したファイルへのrequire_once (dirname(__FILE__).'/coverage.php') を追加することができますし、それがレポートを生成する必要がありますが、それはうまくいきませんでした

言うこと!

コードカバレッジの生成方法に関する有用なウェブサイトがある場合は、ここでそれを共有してください。

ありがとう。

答えて

1

公式にサポートされている方法でも動作しませんでしたが、ここではコードを調べて一緒にハックすることができました。これはマスターコードではなく、SimpleTestのv1.1.7で動作します。この記事を書いている時点では、v1.1.7は最新のリリースであり、古いバージョンであっても新しいバージョンのPHP 7で動作します。

まず、Xdebugがインストールされ、設定され、動作していることを確認する必要があります。私のシステムには、php.iniファイルのCLIとApacheバージョンの両方があります。これらのファイルは、Apache経由でPHPを使用しようとしているのか、端末から直接使用しているのかによって適切に設定する必要があります。 Xdebugに代わるものがありますが、ほとんどの人はXdebugです。

次に、コードからPHP_CodeCoverageライブラリにアクセスできるようにする必要があります。プロジェクトにcomposerパッケージとして追加することをお勧めします。

これで、コードカバレッジを取得してレポートを生成するために、そのライブラリを手動で使用するだけで済みます。どのように正確に行うのかは、テストの実行方法によって異なります。個人的に、私は端末でテストを実行し、スクリプトを起動する前にPHPが実行するブートストラップファイルを持っています。あなたが作成する必要がありますあなたのブートストラップファイル内のどこかに

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

:それは自動的にそのように含まれ得る任意のテストクラスにテストを実行しますので、ブートストラップファイルの終わりに、私は、SimpleTestの自動実行ファイルを含めますフィルタを作成し、報告するディレクトリとファイルをホワイトリストに登録し、カバレッジオブジェクトを作成してコンストラクタにフィルタを渡し、カバレッジを開始し、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'; 
0

をそれとして、把握するために私にいくつかの時間がかかった - 穏やかにそれを置くために - この機能についての説明を参照して、本当に完全ではありません。

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を使用している場合、それはちょっと難しいかもしれません。

関連する問題