CakePHP 2.0のリリースから3ヶ月が経ち、2.0での開発を検討することが多くなってきているかと思います。私もやっと昨年末辺りから各プラグインの移行等々2.0での開発を始めているところです。
今回は、NetBeans上で効率よくテストするための設定方法をご紹介します。この設定を行うことで、NetBeans上からテストの作成、実行、実装とテストの切替えが容易に行えるようになります。
2012-03-19注記: 本設定のみでは、CakePHPのFixtureを用いたテストを行うことができません。Fixtureを利用できるようにする方法についてはこちらで紹介しているのであわせてお読みください。
2012-01-24注記: 本設定方法では、CakePHPのFixtureを用いたテストを行うことができません。Fixtureを利用できるようにする方法を検討中です。(ご存知の方が居れば教えてください orz
0. CakePHP 2.0, PHPUnit のインストール
これがないと始まりませんね。PHPUnitは、 第3章 PHPUnit のインストール を参考にインストールしましょう。
また、NetBeansからPHPUnitを利用できるように、NetBeansの環境設定でPHPUnitのパスを設定しておきます。
CakePHPのファイル取得は、gitが利用できるのであれば、github から clone するのが早いかと思います。
git clone https://github.com/cakephp/cakephp.git /path_to/cake_project
CakeとPHPUnitの準備ができたらNetBeansでプロジェクトを作成します。
1. NetBeansでプロジェクト作成
プロジェクトペインで右クリックか、「ファイル」→「新規プロジェクト」で既存のソースからプロジェクトを生成します。
2. PHPUnit用bootstrapファイルの作成
CakePHPの機能を利用してテストを行う際は、各種設定やライブラリを事前に読み込む必要があります。
標準では app/webroot/test.php でその事前準備を行っているので、これを少し書き換えてPHPUnitのブートストラップファイルとして利用します。
app/webroot/test.php をコピーし、app/webroot/phpunit.php 等のファイル名で保存します。
app/webroot/phpunit.php を開き、最後の行にある
CakeTestSuiteDispatcher::run(); |
をコメントアウトまたは削除し、
App::load('CakeTestSuiteCommand'); |
を書き加えます。
※このブートストラップファイルの位置を変更する場合は、上部に記載されている各種パスも変更してください。
3. プロジェクトのPHPUnit設定
プロジェクトのプロパティを開き、先ほど作成したブートストラップファイルのパスを指定します。
テストフォルダも指定しておきます。
4. ソースディレクトリを変更
NetBeans内でテストを実行するために、ソースディレクトリを変更します。
ファイルペインから、 nbproject/project.properties を開きます。
src.dir=.
とか書かれている部分を
src.dir=app
と変更します。
なお、この変更によりルート直下にあるlib, plugins, vendorsがソースディレクトリとして認識されなくなるので、インクルードパスとして含めておきます。
変更したら、NetBeansを再起動します。
(プロジェクトを開き直すだけでもOK。
以上で、準備は完了です。
早速、テストを書いてみましょう。
5. テストコードを作成する(準備)
例によってFizzBuzz問題を実装してみましょう。
とりあえず、FizzBuzzクラスを中身は空の状態で app/Lib/ の中に作ります。
ツールから「PHPUnitテストを作成」します。
こんなコードがPHPUnitによって自動生成されます。(PHPUnitのテンプレートがデフォルトの場合
NetBeansからテストを実行してみます。
何も書いてないので、成功したことになりますね。
cakeからも実行してみます。
怒られました。CakePHPのtest.phpで実行するにはCakeTestCaseを継承する必要があるので、テストコードをCakeTestCaseを継承したものに書き換えます。
CakePHP側でもテストを実行できるようになりました。
6. テストコードを作成する(実装)
準備が整ったところで、テストを書いていきます、
FizzBuzz::fizzbuzzメソッドは、数値を与えると3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」、それ以外の場合は与えられた数値を返すメソッドとします。
とりあえず、1の場合は1が返るのでこんな感じのテストコードを書きます。
public function testFizzbuzz() { $this->assertEquals(1, FizzBuzz::fizzbuzz(1)); } |
まだ何も実装していないのでテストは失敗します。
実装を書きます。
static function fizzbuzz($n) { return $n; } |
テストを実行してみましょう。
ちなみにテストの実行にはショートカットキーがありますので、それで実行するようにするとスムーズにコーディングとテストの実行が出来ます。
テストが通りましたね。ただし、これはまだ不完全なテストなので仕様に沿ってテストを追加していきます。
public function testFizzbuzz_3のときはFizzを返す() { $this->assertEquals('Fizz', FizzBuzz::fizzbuzz(3)); } |
実行します。
1の場合は成功しましたが、3の場合は失敗しましたね。
失敗した場合は右側のペインの方に、どのテストが失敗したのかの情報が出てきます。
これを参考にして、テストが通るように実装し、またテストを実行します。
このように、テスト→実装を繰り返して仕様を満たすコードを作り上げていきます。
今回ご紹介した手法を用いてNetBeans上でテストの実行をできるようにすることで、いちいちブラウザに切り替えてテストを実行せずともショートカットキーひとつでテストの実行ができるようになります。これにより、TDDをよりリズミカルに実践することができます。
ブラウザ側もコードカバレッジやSQLのログがみれたりと、便利な機能があるので併せて利用するとより効率的ですね。
それでは、あなたのテストライフがより快適になりますように!
Pingback: CakePHP 2.x + PHPUnit on NetBeans 第2版 @ php-tips
Pingback: CakePHP Run PHPUnit with NetBeans | 管理人の日記~つらつらなるままに~