Railsのように2つのBDDフレームワークを実行できるようにするインテグレーション・プラグインです。それぞれのフレームワークの特徴は、共に外側のインターフェースを自然言語で記述できることでコミュニケーション・ツールとしての役割を持っています。BehatをCakePHPから利用するためのプラグインとしてCakeBehatを公開してきました。いう意味で、これはCakeBehatの改良版と言って間違いありません。CakeBehatからの進化ポイントは以下のとおりです。READMEで書いているのですが、英語(あっているか不安がたっぷりですが)で書いてあるので、安心の日本語で解説したいと思います。簡単なチュートリアルを書いているので、こちらの流れを中心に説明していきます。cloneを使うかgithubのサイトからサンプルアプリケーションBddExampleAppをCakePHPのルートディレクトリに展開。ディレクトリが必要になります。参考にインストールして欲しいのですが、ディレクトリ名が解決できない問題(?)があるのでvendorsディレクトリをvendorにリネームしてください。app/Plugin/fixturefactory/vendorデータベースを作成して、テーブルを作成してください。SQLを実行してください。環境に合わせて変更してください。database.phpのデータベース名やログイン、パスワードなどは前項で設定した値に変更してください。ようなテスト時のホスト名が必要なので、そのままhostsに設定するか違う名前に変更してください。BDDプラグインをインストールします。するか、githubのサイトからダウンロードして展開してください。Composerをインストールして依存関係を解決します。–dev最後にbehatが利用するテスト用URLを設定します。’http://test.localhost:8888/bdd/‘」のようになっているので、実際にインストールしたアクセス可能なURLに変更してください。このときdatabase.phpで設定したテスト用のホスト名になってることが重要です。アクセスして3件のリストが表示されていれば大丈夫です。テストを実行してみるCakePHPのルートディレクトリに移動して以下のようにコマンドを実行します。behatのテストでseleniumを利用しているので、可能であればコチラ(http://www.phpunit.de/manual/3.6/ja/selenium.html)を参考にseleniumをダウンロードして実行しておいてください。対して透過的になっていて、意味もPHPUnitと似ている(実際内部はPHPUnitである)ので、感覚は掴みやすいと思います。オプションがない状況でしたが、代表的な使い方は以下のとおりです。--helpスペックファイルの命名ルールは以下のようにspec.phpで終わる3通りです。post.spec.phppost_spec.phpPostSpec.phpモデルをテストするモデルをテストするためにCakeTestCaseを継承したCakeSpecというPHPUnitのテストケースを用意しています。classアノテーションで指定します。あとはフィクスチャですが、これはCake本来のテストで利用するものと同じで、宣言する場所と意味がちょっと変わってきます。Cakeのユニットテストでは、テストケースクラスのメンバ変数として$fixuresを宣言するのですが、スペックでは$W(ワールド)インスタンスのfixtures変数にセットします。arrayの書き方は同じです。スペックコードではitブロックの度にfixturesが解決されるのでitの前のbeforeやbefore_eachブロックで書いておけば1ファイル中に何度出て来ても問題ありません。loadFixtures()のような動きなのですが、この場合もCakeTestCaseではfixturesにテストケース内で利用するすべてのフィクスチャを書いておく必要がありますが、スペックでは下位階層で利用する分だけでOKです。PHPがどのようにDSLで解釈してPHPコードをPHPUnitに実行させるかを見た方が良いでしょう。PHPUnitのTestSuiteとTestCaseを利用しています。このうちitブロックがTestCaseに該当します。その他のdescribe、contextやbeforeはTestSuiteになっています。インスタンスになります。呼び出す事で利用可能になります。このスコープが重要になってくるのが、次のコントローラのテストです。コントローラをテストするコントローラをテストするためにControllerTestCaseを継承したControllerSpecというPHPUnitのテストケースを用意しています。モデルと同様にclassアノテーションで指定します。ControllerTestCaseを継承しているのでもちろんtestAction()が利用可能なのですが、ここで重要になるのが、スコープです。fixturesに関してはモデルと同じく下位階層に対して有効になります。PHPの評価(マッチング)はHamcrestを利用しているので自然言語で書く事が可能です。私はPHPUnitのassertXXXXXを覚えるよりも直感的で、こう書いたらできそう(実際できる!!)というのが良いと思っています。以外のテストコードも使い方例として入れてあるので、それを読むとわかるのではないかと思います。対して透過的になっているので、詳しくは公式のドキュメントかhelpで見るのが良いでしょう。オプションがない状況でしたが、代表的な使い方は以下のとおりです。--helpこれ以外に関していえばCakeBehatと基本的な仕組みは変わっていません。見ると良いかな....(手抜きですみません)実際のサンプルには日本語記述も入っています。http://docs.behat.org/quick_intro.html#writing-your-step-definitions)を読むといいね、ってことなんですが、Behatのドキュメントで最初に出会えるステップの書き方は、FeatureContextにステップを追加していく書き方です。これだと独自ステップが少ないうちは良いのですが、増えて来たら分割するのか、どういう単位で分割するのか、そのままビッククラスにするのか...という分岐点にたたされます。それぐらいなら最初から分けておこうということで、例えばフィーチャの単位であったり自分たちで決めたルールでステップファイルを分割できる方式にしておきましょう。書き方に従って書いてみましょう。サンプルアプリケーションもこの流れに沿っています。基本的にステップをstepディレクトリ以下に書くようにすることで、FeatureContextを弄る必要はなくなるはずで、将来プラグインのバージョンが上がってFeatureContextが書き変わっても問題はおきません。CakePHPとの関係まぁこのままだとただのBehatなので、プラグインは何をしてくれるの?というとCakeBehatと同じくapp/Config/database.phpの設定を元にテストデータを投入するためのインターフェースを用意しています。)先の日本語フィーチャでテストデータを登録するステップで、以下の2つのCakePHP連携APIが利用可能です。テストデータを登録するモデルのインスタンスを取得します(ClassRegistory::init(モデル名)と同じです)テストデータは自動で削除されないので、このように必要なタイミングにてtruncateModelを呼び出すようにしてください。表示している」のように表示するページを指定する場合はURLを書くようにガイドされています。ページ別名を書けるようにしています。この方がフィーチャファイルの可読性があがると覆います。今後の展開このプラグインを使ったBDDについてCakeFest2012の30分枠で話します。その後、CakeBehatは完全にこちらへ移行となり(マイグレーションもそれほど難しくないと思う)ます。PHPについては、私のdevelopブランチを利用しています。こちらは本家にはない機能(subjectもその1つ)を実装していたりします(そのうちPRするかも)。Behat/Minkについても日本語問題をチェックしていたりしますので、統合的にメンテしていきたいと思っています。これらで発生した問題についてもgithubのissueに日本語で構わないので指摘していただければと思います。