Railsでは有名なBDDフレームワークcucumberのPHP版クローンです。以前私が発表した資料が過去記事にありますので、詳しくはそちらを参照ください。利点は、顧客が理解できるシナリオを自然言語(つまり日本語)で記述し、それ自体がテスト実行可能であるということです。今までCakePHPアプリケーションのテストは単体テストではSimpleTest、ブラウザベースのテストはSeleniumを使うことが多かったと思いますが、これからはBehat/Minkによってテストの幅が広がるでしょう。BehatはSymfonyベースで、これまでCakePHPのアプリケーションを実行するためのプラグインなどは準備されてきませんでした。behat」として実行できるシェルタスクを用意しました。それが「CakeBehat」シェルです。https://github.com/sizuhiko/CakeBehatインストール前提事項gitが利用可能なことPHPUnitがインストールされていることCakePHPがインストールされていることMySQLなどデータベースがインストールされていて、テスト用データベースが準備されていること導入CakePHPのvendorsディレクトリへ移動して、以下のコマンドを実行してください。3つのディレクトリができているはずです。CakePHPのvendors直下へコピーします。Minkがあるはずです。CakePHPのappやcakeと同じディレクトリ階層にコピーします。初期導入は以上で終了です。環境設定Behat/Mink環境設定vendors直下にコピーしたbehat.yml.defaultをbehat.ymlにコピーします。http://test.localhost:8888/application-name/という設定があります。これはアプリケーションのルートパスを設定するもので、ホスト名、ポート番号、アプリケーション名などを指定します。ホスト名はできるだけtest環境と識別可能なものにしておく事がオススメです。これでおわり?基本的な環境設定は、ここまでで、behatは実行可能な状況になっています。具体的にサンプルアプリケーションのコードを使って解説します。中にCookBookの「CakePHPブログチュートリアル」の初期状態(Postの一覧と詳細だけ)のコードを準備しました。データベースの切り替えconfig/database.phpはそのまま生成すると$defaultがあります。UnitTestを実施する場合などは$testを作成していることもあるでしょう。Behat/Minkはブラウザアクセスで実行されるので、工夫が必要になります。テストデータの投入で$testを参照するので、必ず定義が必要になります。config」にも書いてるように、環境によってデータベース設定が切り替えられるように対応します。test用データベース、それ以外ならdevelopment用データベースを利用するようにしています。しておけば、test.localhostでアクセス可能になるでしょう。テストシナリオの記述Behatのシナリオ記述は基本的にcucumberと同じです。Cucumber」を読むと良いと思います。ブログチュートリアルの一覧表示と、詳細表示のテストとして、以下のようなシナリオを書きました。これは、記事の本文です。そこに本文が続きます。こりゃ本当にわくわくする!うそ。表示されていることどうですか?最低限の決まりがあるように見えますが、普通のドキュメントとして読む事も可能ですよね?少なくともプログラマでなければ読めないSeleniumのようなテストコードとは違うと思います。これがBehatの特徴でもあります。jaのように実行すると一覧表示されます。テストデータの登録サンプルでは「ブログ記事に以下の内容が登録されていること:」のように記述しました。これは最初から用意されているものではなく、独自に定義する必要があるステップです。phpファイルを作成すれば自動的に読み込まれ、利用可能になります。}});ステップの雛形自体は、ステップが存在しないときにBehatを実行すると、以下のように画面表示されるので、そのままコピペして作成すると簡単です。CakeBehatではテストデータを登録するのが容易になるように、Modelを取得できるようにしています。テストデータを消去するためにtruncateできる仕組みも用意しました。Model->createとModel->saveを利用すれば、いつものCakePHPの感覚でデータを登録できるはずです。データベースは自動的に$testで定義された宛先に接続するようになっています。実行してみようcakeやappのディレクトリに移動して、以下のコマンドを実行します。behatさいごに基本的なアプリケーションであれば、テスト可能な状況になっていると思います。何かあれば、CakeBehatをforkしてアップデートに参加してもらえればと思います。実行しているのですが、App::objects('model’)でモデルの一覧を取得しているので、プラグインのModelまで初期化できていません。CakePHPのように呼び出されると、初期化されていないモデルが利用できないので、事前に全てClassRegistry::initしておくことで、この問題を回避しています。プラグイン内のモデルを使う場合は、この記述を変更して、プラグインのモデルも利用可能にする必要があります。テストデータの削除を明示的にtruncateModelしないといけない。フックポイントでtruncateModelを呼び出せるように仕込んでおきたかったのですが、フックポイントから呼び出すとSTRICTエラーが出てしまい、うまく動作しません。いうことから、データ投入ステップで一度データを削除するように記述しています。GithubのReadmeとWikiがまだ未着手で。このネタで、CakeFestに応募しようと思うのですが、後9日か。