PHP_CodeCoverageで、CakePHPのユニットテストのコードカバレッジを表示してみました。
CakePHP標準のテストランナー(test.php)でも単一のテストケースについてはコードカバレッジが表示できるのですが、All tests の時はコードカバレッジが表示されません(All testsでも表示されることもあるようです。hiromi さん、ありがとうございます)。
そこでPHP_CodeCoverageを使って、All testsのコードカバレッジを表示してみました。
1. PHP_CodeCoverage インストール
PHP_CodeCoverageは、PHPUnitでおなじみのSebastian Bergmannが開発した、コードカバレッジやCRAPを計測、表示するツールです。
PEARパッケージで提供されているので、pear コマンドでインストールします。
2011/06/15現在の最新版1.0.4では、PHP5.2.7以上とxDebugが必要となります。
sudo pear channel-discover pear.phpunit.de sudo pear channel-discover components.ez.no sudo pear install phpunit/PHP_CodeCoverage
ソースコードはgithubでも公開されており、README.markdownで詳しいインストール方法なども記載されているので、気になる人は見てみて下さい。
sebastianbergmann/php-code-coverage – GitHub
2. test.php のコードカバレッジを計測する
test.phpで実行する All tests のコードカバレッジを計測します。
test.php を直接改修して PHP_CodeCoverage を実行しても良いのですが、test.php を改修しない方法として、auto_prepend_file / auto_append_file を使う方法で実装します。
auto_prepend_file / auto_append_file を使うと test.php の実行前後に、自動実行するPHPスクリプトを指定することができます。そこで、auto_prepend_file ではコードカバレッジ計測を開始するPHPスクリプトファイルを、auto_append_file ではコードカバレッジ計測終了と結果を書きだすPHPスクリプトを指定します。
2-1. auto_prepend_file / auto_append_file を設定
httpd.confでauto_prepend_file / auto_append_file を設定します。
<VirtualHost *:80> ServerName example.com DocumentRooot /path/to/cakephp/app/webroot <Location /test.php> php_value auto_prepend_file /path/to/prepend.php php_value auto_append_file /path/to/append.php </Location> </VirtualHost>
2-2. prepend.php
auto_prepend_file で指定したコードカバレッジ計測を開始するPHPスクリプトを実装します。
[/path/to/prepend.php]
ポイントは 7 行目から 14 行目で、PHP_CodeCoverage_Filterを使って、フレームワークやプラグイン、テストケース、 prepend.php、append.php を対象外にしています。
このあたりが考慮されているのがさすがですね。
2-3. append.php
auto_append_fileで指定したコードカバレッジ計測を終了して、結果ファイルを出力するPHPスクリプトを実装します。
[/path/to/append.php]
2-4. 結果出力ディレクトリ作成
append.phpでは app/webroot/coverage ディレクトリに結果ファイルを出力するので、あらかじめディレクトリを作成して apache ユーザに書き込み権限を付与しておきます。
$ mkdir app/webroot/coverage $ chmod a+w app/webroot/coverage
3. test.php で All tests を実行
あとは普通にtest.phpで All tests を実行します。
テストが完了して /coverage/ にアクセスすると、下記のようなコードカバレッジ計測のレポートが表示されます。
内容は CakePHP 標準のコードカバレッジレポートよりも詳細で、全体、ディレクトリ単位、ファイル単位で、行数・メソッド数・クラス数でのコードカバレッジを確認することができます。
左のディレクトリ、ファイルはリンクになっており、クリックするとディクレトリ内のファイルを見ることができます。またファイルをクリックするとPHPソースが表示され、背景色によってその行が実行されたか否かが判別できるようになっています。
4. メモリーエラーが出たら
コードカバレッジ計測では多くのメモリを消費するのでテスト対象のソースファイルが多いと「Fatal error: Allowed memory size of 0 bytes exhausted」といったメモリ不足によるPHPエラーが出る場合があります。
エラーが発生した時は memory_limit にてPHPが確保できるメモリを増やします。
なお古いバージョンの test.php では memory_limit 設定がハードコーディングされている場合があるので、その際は test.php を直接書き換えて下さい。
[app/webroot/test.php]
-ini_set('memory_limit','128M'); +ini_set('memory_limit','512M');
手軽にコードカバレッジを表示
コードカバレッジを計測すること自体はxdebugを使うと簡単なのですが、それを集計して、見やすい形式にまとめてくれるという点で、PHP_CodeCoverage はかなり便利なツールです。
auto_prepend_file / auto_append_file を使う方法を応用すれば Selenium のテストでもコードカバレッジを計測することができそうです。これはぜひ試したいですね。
ここではCakePHPを対象としましたが、もちろん他のフレームワークやアプリケーションでも利用できるので、一度試してみてください。
- Newer: 10,000はてブと10,000tweets
- Older: 古くなったMacPortsを再インストール
コメント (Close):2
- hiromi 11-06-17 (金) 5:12
-
>All tests の時はコードカバレッジが表示されません。
ダウト。
テストディレクトリの構成によって表示されないことがあります。
まあそれを意識しなければいけないのはナンセンスなので、こういうツールがあるのは非常に便利ですね。 - shinbara 11-06-17 (金) 8:48
-
コメントありがとう!
All tests でもカバレッジ出るんやね。
また確認しときます−。
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2011/06/php_codecoverage_cakephp.html/trackback
- Listed below are links to weblogs that reference
- コードカバレッジ測定ツールPHP_CodeCoverageをCakePHPで使ってみた from Shin x blog