PHP_CodeCoverageを使ってPHPコードのカバレッジを出力する方法

2013-02-04T00:00:00+00:00 PHP

あくまでPHP_CodeCoverageを単体で使うっていう前提でPHPUnit等は使いません。例えば

PHPUnitみたいにテストケースクラスっていう方式じゃなくても、もっとシンプルにテストかけたら良いよね

って思う事もしばしばあるのですが、まぁテストフレームワークを作ったとしても結局カバレッジ出力な機能に関しては捨てられませんよねって話。という事で単体で使う方法を調べてみた

(使用するPHPのバージョン及びPHP_CodeCoverageのバージョンは後術する画像に書いて有ります)

テスト対象クラス (lib/sample.php)

<?php

class Sample {
    static function pow($n) {
        if ($n <= 0) {
            return 0;
        }

        return pow($n, 2);
    }
}

まぁ適当に。出来れば条件文があるやつとかの方が良いかも

テスト実行スクリプト (tests/test.php)

PHPUnitを使わないので、とりあえずはアサーション的なのを使ってやるのでPHPにあるassertを使う

<?php

require_once "File/Iterator.php";
require_once "File/Iterator/Facade.php";
require_once "File/Iterator/Factory.php";

require_once "PHP/Token.php";
require_once "PHP/Token/Stream.php";

require_once "Text/Template.php";

require_once "PHP/CodeCoverage.php";
require_once "PHP/CodeCoverage/Driver.php";
require_once "PHP/CodeCoverage/Driver/Xdebug.php";
require_once "PHP/CodeCoverage/Filter.php";
require_once "PHP/CodeCoverage/Util.php";
require_once "PHP/CodeCoverage/Version.php";

require_once "PHP/CodeCoverage/Report/Factory.php";
require_once "PHP/CodeCoverage/Report/Node.php";
require_once "PHP/CodeCoverage/Report/Node/Directory.php";
require_once "PHP/CodeCoverage/Report/Node/File.php";
require_once "PHP/CodeCoverage/Report/Node/Iterator.php";

require_once "PHP/CodeCoverage/Report/HTML.php";
require_once "PHP/CodeCoverage/Report/HTML/Renderer.php";
require_once "PHP/CodeCoverage/Report/HTML/Renderer/Dashboard.php";
require_once "PHP/CodeCoverage/Report/HTML/Renderer/Directory.php";
require_once "PHP/CodeCoverage/Report/HTML/Renderer/File.php";

$filter = new PHP_CodeCoverage_Filter();
$filter->addFileToBlacklist(__FILE__);

/* ディレクトリにあるファイルを除外?
$filter->addDirectoryToBlacklist(dirname(__FILE__));
*/

$cov = new PHP_CodeCoverage(null, $filter);
$cov->start("phpcov");

// ここから処理

require_once dirname(__FILE__)."/../lib/sample.php";

assert(Sample::pow(2) == 4);

$cov->stop();
$reporter = new PHP_CodeCoverage_Report_HTML();
$reporter->process($cov, getcwd(). "/coverage");

でテスト対象とするところは条件文などがあるけど、今回assertはそういう所やってないのでカバレッジ率は100%にはならない。で実行してカバレッジ見てみると

という感じになる。requireしなきゃならないのが大量にあるのでまだ漏れがありそうだけど

とりまぁPHP_CodeCoverageを単体で使ってもカバレッジ出力出来る模様っていう事で。テストフレームワークとか作るんだったらこんな感じで利用すれば良いのかも

Backbone.jsを始めてみる lesscss