概要
タイトルの通りCakePHPのテストケースをNetBeansで実行する方法の紹介です。すでにユニットテストをNetBeans上で実行する方法は@nojimageさんが下記で紹介されているのでまずは、そちらを参照してください。
◎参考
- http://php-tips.com/php/2012/01/cakephp2-0-phpunit-on-netbeans
- http://php-tips.com/php/cakephp-php/2012/03/cakephp-2x-phpunit-on-netbeans-2
上記の用に設定すれば、問題なく実行できます。ここでは少しやり方をかえてbakeでテストケースを作成してみます(ソースディレクトリは通常のままです)。あとは補足情報を追加します。Fixtureを使う場合は、2番目の参考先の設定を行なってください。
実行した環境
- CakePHP 2.2
- NetBeans 7.2
- Xampp (できれば、VM上に環境を用意したほうが。。。
- Windows
- PHPUnit 3.7.1(3.7.2以降がいいです)
PHPUnit
追記:2012/10/08 3.7.6までリリースされています。
PHPUnit 3.7.xには、NetBeansで実行できない不具合があるので、できればそれ以外のバージョンで実行したほうがいいです。3.7.2以降で修正されているはずなので、それまで待つか、下記の部分を削除すると動きます。
https://github.com/sebastianbergmann/phpunit/commit/cd92dd4ab9d8e231edac9b32e8f7003fcbf02077
PHP CakePHP Framework Pluginの導入
勝手に機能をつけくわえたりしていたプラグインですが、NetBeansのPlugin Potalに登録して、Update Centerから直接DLすることができるようになりました。(NB7.2)
http://plugins.netbeans.org/plugin/44579/php-cakephp-framework
オプション > プラグイン の中に表示されていると思います。
まずこれをインストールします。
テストファイルの作成
ここではNetBeansの機能の「PHPUnitテストの作成」を使わずに、bakeで作ります。
「PHPUnitテストの作成」を使うか「bake」等で作成するかは、目的に合わせて使って下さい。例えば、PHPUnitテストの作成では、NetBeansのオプションの設定をすることでSkeletonGeneratorを利用することができます。そのかわり、ソースディレクトリの構造を変えたりする必要があります。これは、テストファイルを作成後に、NetBeansが自動でソースディレクトリの構造に合わせて、テストディレクトリをを作成して移動してくれるからです。
bakeで作成する場合は、cake側が自動的にapp/Test以下に種類に応じて作成してくれるので、 ソースディレクトリの設定を変更しなくて済みます。しかし、bakeの場合は毎回コンソールから入力する必要があるので、PHPUnitテストの作成をクリックひとつで作成できるのと比べると少し面倒かもしれません。cakeのプラグインを入れておけば、出力ウィンドウから実行できて、左側にあるボタンを押せば、同じコマンドを再実行可能なので少しは楽かもしれません。
事前に空のコンポーネントファイルを作っているものとします。
プロジェクトディレクトリを右クリック > CakePHP > コマンドを実行
フィルタの部分にtestを入力すればコマンドが絞られるので、”bake test”を選択して、パラメータにComponentを入力して実行します。(ヘルプにもでているようにControllerやModelを設定できます)出力ウィンドウに実行結果が表示されるので、テストを作成したい番号を選んで実行します。あとはテストの中身を書いてください。
テストフォルダの設定
プロジェクト右クリック > プロパティ > ソース > テストフォルダ
app/Testを設定します。
テストの実行
テストを書いて、テストしたいメソッドも実装したら、テストの実行です。
実行方法は次の5種類です。同じテストという表示が出るのでわかりにくいかもしれません。
- すべてのテストケースの実行
- テスト対象のファイルからの実行 (e.g. HogeComponent.php)
- テストファイルの実行 (e.g. HogeComponentTest.php)
- 指定したテストディレクトリのテストファイルの実行 (e.g. app/Test/Case/Controller)
- カバレッジ機能(コード・カバレージ)からのテスト
すべてのテストケースの実行
プロジェクト右クリック > テスト
テスト対象ファイルからの実行
テストしたいファイル右クリック > テストor [Ctrl + F6]
テストフォルダの中から、対応するファイルを探して実行してくれます。たとえばHogeComponent.phpの場合はHogeComponentTest.phpを実行してくれます。
ショートカットから実行すれば、テストファイルに移動しなくていいので便利ですね。
テストファイルの実行
テストファイル右クリック > 実行
実行ですが、テストが実行されます。
指定したテストディレクトリのテストファイルの実行
テストファイルの実行と同様です。
カバレッジ機能からのテスト
これを実行するにはXdebugの設定が必要です。phpinfo()を実行するか、php.iniファイルを開いて有効でない場合は、設定を追加するなり、コメントを外すなりして有効にしてください。環境によって違うとは思います。下記は参考です。
[XDebug]
zend_extension = “C:\xampp\php\ext\php_xdebug.dll”
;xdebug.profiler_append = 0
;xdebug.profiler_enable = 1
;xdebug.profiler_enable_trigger = 0
;xdebug.profiler_output_dir = “C:\xampp\tmp”
;xdebug.profiler_output_name = “cachegrind.out.%t-%s”
;xdebug.remote_enable = 0
xdebug.remote_enable = 1
xdebug.remote_handler = “dbgp”
xdebug.remote_host = “127.0.0.1”
xdebug.trace_output_dir = “C:\xampp\tmp”
プロジェクト右クリック > コード・カバレージ > コード・カバレージを収集し表示
すると下記のようにエディタのしたにコード・カバレージのバーが表示されます。
ここでテストのボタンを押せばテストが実行されます。通った箇所はグリーンで表示されます。通ってないところは、赤く表示されます。
実行したら、レポートのボタンを押してください。使われたファイルのカバレージも見ることができます。
今はコアのファイルは見なくていいやという場合は、app/Test/configuration.xmlファイルに設定を記述して、プロジェクトにファイルを設定(プロパティ > PHPUnit)すれば、コアの部分は無視できます。
書き方は、PHPUnitのマニュアルを参考にしてください。
[gist id=3845010]
上記はCoreの部分を無視する設定です。
プロジェクト > プロパティ > PHPUnit > XML構成の使用にチェックを入れてXMLファイルを設定してください。OKを押すことを忘れずに。
以上がテスト実行の方法です。
補足
ここからいくつか補足情報を書きます。
インクルードパス
グローバルインクルードパスにPHPUnitのディレクトリを追加しておきましょう。パスが通ってると実行に問題はないかと思いますが、テストケースを書いているときに補完が効くようになります。
テストファイルとテストされるファイル間の移動
エディタで右クリック > ナビゲート > (テストに移動 or テスト済みクラスへ移動) (Ctrl + Shift + T)
ショートカットで移動できます。
今回の場合テストケースとテストされるファイルのディレクトリの構造が違っていますが、きちんと移動してくれます。
カスタムテストスイート
プロジェクトの設定でカスタムテストスイートを設定できますが、カスタムテストスイートが実行できるのはすべてのテストケースを実行するときのみです。つまりはプロジェクト右クリックのテストの実行をするときだけです。個別のテストでは実行されません。もしカスタムテストスイートが実行された場合は、ウィンドウに通知が表示されます。
カスタムテストスイートを設定して実行してみたのですが、NetBeansSuite.phpファイルと入れ替わるわけではなさそうです。
挙動がよくわからなかったので、バグ報告してしまいましたが、もしかしたら、機能を改善してくれるかもしれません。
現状では、Fixtureを使いたい場合は、NetBeansSuite.phpファイルを直接書き換えるしかなさそうです。
追記:このファイルを別の方法で入れ替える方法を書きました。
NetBeans PHPUnit Custom Script
追記:下記のようなテストスイートファイルを作成して登録すれば、テストケースは実行されますが、フィクスチャを使ったケースをテストできません。
追記:自分の設定ミスです。書き直しました。下記のように書けばOKです。しかし、すべてのテストでしか有効ではありません。。。
[gist id=3879106]
Format+ (PHP CakePHP Framework Plugin)
テストとは全く関係ないのですが、プラグインに新しい機能をつけたものをbetaバージョンとして公開しました。
NetBeansのフォーマットの機能は、ドキュメントブロックをインデントしてしまうのですが、Format+アクションは次のように動作します。
- 通常のフォーマット(フォーマットのオプションで設定された通り)
- インデントの解除
- 改行コードを強制的にLFへ変更
なんでこんな機能をつけたかというと、コーディング規約に従うためです。キーマップに登録しておくと便利かもしれません。(e.g. F12)さらにPHPCSを使うとわかりやすいですね。
ダウンロードは下記からお願いします。まだプラグインポータルへは登録していません。