Technote

by sizuhiko

phpshでCakeを試食する

<!– more –>

普段 Rails でプログラミングをしていて、便利だなぁと思う機能の1つに

rails c

があります。

コマンドラインからRailsアプリケーションのコードを実行できるコンソールで、コードをファイルに書かなくてもすぐ試せるので「あれっ、こんな書き方で良いのだっけ?」という事をお手軽に試すことができます。

Rubyにはirbといった対話型ツールもあります。PHPではこれに相当するものは php -q などが標準で使えるのですが、イマイチな使い勝手です。

そんな中、facebookから公開されている「phpsh」を知りました。これはPHPの対話型ツールで、いわゆるPHP版のirbみたいなものです。

phpshはhttp://www.phpsh.org/で、コードはgithubで公開されています。

今回はphpsh自体のコードをハックすることなく、オートローダー用のphpファイルを作成して、CakePHPのコードを動かせるようにしてみました。

Taste

この対話型ツールでできることは、実際の製品コードを試す、ケーキで言えば“試食"ということで「Taste」と名付けました。

https://github.com/sizuhiko/Taste

インストール

事前にphpshをインストールしておいてください。インストール方法はgithubのREADMEに書かれているので簡単にできると思います。ちなみに私の環境ではphpshのzipをダウンロードして、以下のコマンドを実行しました。

python setup.py install --prefix=/usr/local

.bashrcに以下の行を追加

export PYTHONPATH=/usr/local/lib/python2.6/site-packages 

後はTasteをインストールします。これはgithubで公開している taste.php を CakePHP のルートディレクトリにコピーするだけです。

実行

phpshは –prefixを付けたディレクトリ/bin にインストールされます。仮にそのディレクトリにパスが通っているとして、以下のコマンドを実行します。

phpsh taste.php

  1. 私の環境では pcntl をインストールしていないので赤字で出ますが、phpshとしては必須ではないので気にしなくていいです。
  2. ログディレクトリのワーニングが出ますが、コンソールのブートストラップを参考していて出ています。こちらも試食には問題ないのでスルーします。

できること

CakePHPのコアクラスや、appに配置されたアプリケーションのコードを試すことができます。それは普通に.phpのコードに書いているのと同じ感覚でできます。 では、おなじみのBlogチュートリアルを作った場合、どんな結果が得られるのか見てみましょう。

モデルクラスを使ってみる

phpshのコンソールでClassRegistryを使ってモデルを取得し、findしてみます。

php> $post = ClassRegistry::init('Post');
php> $data = $post->find('all');

以下のように、色付きで表示することができます。

URLを実行してみる

通常のブラウザから実行したときのように Dispatcher クラスを使ってみると、アクションから出力されるhtmlコードを表示してみることができます。

php> $Dispatcher = new Dispatcher('/posts');

Routerを使って、URLルーティングを試す

php> echo Router::url(array('controller'=>'posts', 'action'=>'index'), false);
/posts

さいごに

このようにphpshからCakePHPを使ってみれば、製品コード上でvar_dumpして確認する必要もありません(ここ重要)。

また、ここで紹介した使い方はほんの一片なので、実際にはもっと便利に使えるんじゃないかなぁと思っています。

現在は、アプリケーションはapp限定です。もしapp以外のアプリケーションディレクトリを使っているひとは、taste.php の 39行目 ‘app’ => ‘app’ の値を変更してください。

CakePHP2.0対応は、そのうちやりたいなぁと思っています….

PHPMatsuriに参加するとできること

<!– more –>

昨日の @hidenorigoto さん「10/15・16[大阪]TDDやBDDも学べるよ!PHP Matsuriに参加しよう! 」からのリレーブログです。

PHPMatsuriは国内外からPHPerを中心にWeb系のエンジニアが集まるハッカソンを中心としたイベントです。今年は大阪で10/15から10/16までの宿泊イベントとして開催されます。
同様のイベントが少なかったり、Matsuriって何っ?みたいな不信感 :ko: を持っている人や、参加を迷っている人もいると思うので、具体的に「何ができるのか」という視点で紹介したいと思います。

大事なことは最初に

今年も多くのスポンサー企業様に支えられ開催することができました。ありがとうございます。

PHPMatsuri 2011 in Osaka はチケット発売中です。まだチケット購入していないかたは、こちらから購入することができます。

とにかく聴いてみる

PHPMatsuriでは、何か開発するという目的でなく、講演を聴くという参加スタイルでも有意義な2日間を過ごす事ができます。 初日は豪華ゲストとスポンサー殿によるカンファレンス形式の講演が夜まで続きます。これだけ多様なメンバーが揃うのもPHPMatsuriならではです。もちろん海外ゲストのセッションには(同時ではありませんが随時)翻訳が付くので安心です。通訳の方はPHPカンファレンスでもおなじみのケイワイトレード殿です。

もし講演で興味を持つ事ができたら、並行して行われているワークショップですぐ体験することができます。当日は公式にアナウンスされているもの以外にも、野良ワークショップが行われるのもPHPMatsuriの特徴です。参加者のみんながやりたいと思う事を、できる人と一緒にやってみる、昨年もこのようなスタイルでいくつかのワークショップが行われました。夜には闇PHPMatsuriが行われるとか….

2日目には参加者が発表を行う大LT大会。ネタあり :lol: 、真面目な発表あり :idea: 、24時間を共に過ごした参加者の発表が続きます。

ただ聴いてみるだけでは、もったいないので「1つ質問をする」という目標を持ってみてはどうでしょうか?海外の憧れプログラマーへの質問も講演のQA時間なら通訳の方が、それ以外の時間も会場にいる仲間が助けてくれることでしょう。

何か作ってみたい

何か作ってみたいけど、ちょっと」という人は、ワークショップに参加してみてはどうでしょうか?人気の次世代フレームワークや、スマートフォン向けアプリの作成は講演とセットで習得することができるまたとない機会です。また夜にはPHPUnitやBehatについてのワークショップもあります。
もしフレームワークについて困った事がおきてもそこには、そのフレームワークの開発者や、百戦錬磨のPHPerがいます。思い切って疑問や要望をぶつけられる、こちらもまたとない機会です。

せっかくですので、このワークショップで習得したことをベースに何か作ってみたり、習得したこと自体でも良いので2日目の大LT大会で発表してみましょう。

発表はスライドがなくてもデモを行うだけでも大丈夫です。一人の体験、経験は他の人にも共感を得る事ができると思います。

他の人と一緒に作ってみたい

ハッカソンや開発合宿というスタイルで何か成果を残したい!という人は、参加者ポジションペーパーを有効活用してもらえればと思います。

昨年は入り口のホワイトボードに各自やりたい事を付箋紙に書いて貼り出して、協力者を募るというスタイルだったのですが、事前の準備などあまりうまく機能しませんでした。 今年はその反省を活かし、事前に参加者同士どういった事がやってみたいのかなどの交流ができるように、ポジションペーパーを記入できるようにしました。積極的に開発をしたいという人はポジションペーパーの記入にご協力ください。それをみた他の参加者の方は、「私でもこんなことならできる」ということで協力を申し出てみるのも良い交流のスタイルだと思います。もちろん1人で黙々と作りたい!という人は、その旨ポジションペーパーに書いてもらっても良いかもしれません。

長い夜の過ごし方

開発スペースは24時間オープンしているので、仮眠をした後でも、貫徹でもいつでも自由に利用することが可能です。

昨年は夜にサプライズイベントがあったり、JIREIマスターが登場したり、Redbullガールが翼を授けてくれたりしました。

今年は何がおきるのかな?深夜には講演のスクリーンを使ってゲーム大会が行われていたり(写真はCakePHPのコアデベロッパーGraham とゲームを楽しむ様子)と、本当に自由な過ごし方ができるイベント。ハッカソン、開発合宿、修学旅行(?)、カンファレンスなど特定の枠にハマらないイベント、それがPHPMatsuriの良いところですね。

何でも良いので発表してみよう

PHPMatsuriの2日目の午後は大発表会です。

発表時間は長くても5分です(発表希望者の人数で短くなる可能性があります。昨年は4分でした)。発表はちょっと、と思っている人も大丈夫です。もし失敗しても、それについてそれほど覚えている人はいないものです。もちろん良い発表をすれば覚えてくれる人もいるでしょうが、さすがに40人近い人数が発表しますので、インパクトを残す発表の方が難しいかもしれません。 :eyes:

せっかくの機会です。発表する内容も講演を聴いて良いなと思った事、作ったもののデモなど様々で大丈夫です。

発表すると参加者投票によって順位が付き、賞品が出ます。現時点でどういった賞があるかということが申し上げられないのですが、例えば各フレームワークの賞だったり、クラウド賞だったり、あえて他の参加者が狙わないジャンルに絞って賞品稼ぎに出るのも良いかもしれません :p

また昨年はお一人にドラ娘をお願いしたのですが、さすがに3時間ドラを叩き続けるのは大変です。今年は交代もしたほうがいいのかなぁと思っています。そこで、私やりたい!という人がいましたら、ポジションペーパーに「ドラ娘やりたい!」と表明していただければ、スタッフから声をかけられるかもしれませんよ!

最後に

昨年、私はBehatというBDDフレームワークに注目し、日本語化することでベストハッカー賞をいただきました(スタッフなのに空気を読まずすみません…)。それからBehatを追い続け、最近公開したCakeBehatにまでつながっています。

参加者の人にも、今後オープンソース活動をするきっかけになったり、多くの勉強会やイベントに出るきっかけになるようなイベントにして欲しいなと思っています。

これだけ様々な楽しみ方ができるイベントに参加しない理由はないですね。まだチケット購入していないかたは、こちらから購入することができます。

なおちょっと目立たないところに、タイムテーブル参加者一覧もありますので参考にしてください。

明日は @koyhoge さんです!

PHPカンファレンス2011に参加しました

<!– more –>今回のPHPカンファレンスは、久々の1日開催と、マルチトラックということで楽しみにしていました。

が、前日朝方までBarから帰してもらえない状況 :ko: で、数分遅刻した上にかなり眠い状態…

カンファレンスのメイントラックでは5.3, 5.4の話題が多く、若干のネタかぶり?という雰囲気もありましたが、PHPも便利になっていくねという確認ができました。 マルチトラックはかなりのチャレンジだったと思うのですが、オブラブなどでの経験からすると、事前にどのセッションに参加希望かだけでも聞いておくと違ったかなぁと。そのセッションに必ず参加しないといけない、という訳ではないのですが、そのセッションをどの会場でやるか、といった目安にはなるかなぁと。ただメイン会場に通訳さんがいたので、それほど柔軟にはできない事情もあったとは思いますが。

私は3つの目的でカンファレンスに参加しました。

  1. カンファレンスのセッションを聴きに
  2. LTでCakeBehatを紹介するために
  3. PHP Matsuri青年団として、Matsuriの宣伝を!

カンファレンスの感想

カンファレンスに関してはアジャイルやTDDのセッションがあったので参加してみようと思ったのですが、どうも「参考にならない人」条件に入っているようだったし、かなりの満員御礼状態で会場に入れないということで、ずっとメイン会場にいました。あ、フレームワークアップデートだけは6Fに移動して見ていました。フレームワークアップデートではLithiumやEthena(こちらはLTでsotarokがやっていましたが)がなくちょっと残念でした。あと昨年のフレームワークアップデートはもうちょっとバリエーション豊かだった気が(気のせいかもしれませんが)。
あと興味を持ったのはHadoopをPHPから操作できるHadooPHPかなぁ。プロトタイプ用ということだったけど、ちょっと試してみたいと思いました。

CakeBehatの紹介LT

スライドをアップしました。 Behat自体の認知度はだいぶ上がって来たと思うので、後はPHPMatsuriで背中を押せば使う人が増えるんじゃないかなぁ?LTの後でSymfony,Cake以外のフレームワークからも使いたいという書き込みがあったので、Matsuriで誰かチャレンジしないかな?と期待しています。

PHPMatsuriの宣伝

LTを5分ちょうどで終えて、3回の紹介、懇親会LTでくどいくらい宣伝させていただきました。

PHPcon当日はまだ申込ができなかったのですが、すでにPHPMatsuriサイトでは参加申込が可能となっています。海外から豪華ゲストもやってきますし、開発するも講演を聴くも、いろんな方向から楽しいイベントにしたいと思っていますのでぜひ参加の検討をお願いします。

CakeFest2011に参加してきました

<!– more –>

昨年のシカゴに続いて2度目の参加となるCakeFest2011。今回はイギリスのマンチェスターにて行われました。 昨年のLTに続き、今年はPechaKucha形式(20秒x20枚)でCakeBehatについての紹介と、LTで日本のLTタイマ係であるドラ娘の紹介という2本の発表を行ってきました。

9/2(金):移動日

昼頃成田を出発し、同日の夜に現地に到着しました。
途中ロンドンで乗り継ぎだったのですが、行く前にイロイロと調べたらロンドンの乗り継ぎはあまり便利ではないということを聞いていて、どうなることかと思っていました。実際、ロンドン空港に到着すると案内表示版には、ほとんど搭乗ゲートが出ていません。遠いゲートまでは25分もあるというのに…. 結局30分前ぐらいに15分程度のゲート案内が出て、移動しました。丸っきりの廊下でしたが、国内線なのでそんなものなのかな、と。

で、マンチェスター空港から電車でホテルへ移動してチェックイン。ホテルのバーではワークショップからの参加者や、既に到着していた@yanodo, @cakephper と合流し、GUINNESSで空腹を満たして寝ました。空港からホテルまで、途中何も食べるところがない(というかよくわからない)というのは誤算でした。

9/3(土):カンファレンス初日

会場は手前に電源の準備された丸テーブルと、階段状の客席になっていて、自由に座ります。PCを持ってワークショップに参加している人は割とテーブル席で、そうでない人は階段席という感じでした。昨年のシカゴは全てテーブル席でみんなPCを持っていたような気がしたので、ちょっと意外な光景でした。しっかり話を聞いたり議論したりする、という雰囲気は濃かったように思います。

今回のCakeFestは部分的に2トラックになっていて、私は主にメイン会場に居ました。初日は@yandoさんがCandyCane(RedmineをCakePHPで移植したもの)の発表をして大きな反響を得ていました。私も微力ながらCandyCaneの開発に携わっていたので、この反響の大きさは嬉しかったです。その後はPHPMatsuriのサイトでも利用しているCMS Croogoについて@fahadから発表がありました。fahadは現在ロンドンで働いているということで、同じ会社からは数名のCakePHP使いが参加していました。

午後は大混雑のMarkによるPHPUnitの話を聞くために奥の部屋(いわゆる会議室)に移動していました。

Pecha Kucha Talksでの発表

本編にも申し込んでいたのですが、そちらかは落選してしまったので、当日の昼休みに夕方から始まるPecha Kuchaに申し込みました。20秒でスライドが自動送りされるという、英語が堪能ではない環境では大変難しい状況だったのですが、何とか思いは伝えられ、当日の夜や翌日には何人かの人に興味を持ってもらえました。ただ海外でもテストを書くということはあまり浸透していないようで、BDDの前にまだTDDがねー的な話があったのも、そんなに日本の状況と変わりないのだな、と思いました。

Pecha Kuchaのスライドはコチラから参照できます。

休憩時間など

CakeFestではセッション間に30分以上の十分な休憩時間が用意されており、各々中庭で歓談したりバーでビールを飲んだりと、なかなか楽しい雰囲気でした。 バーには陽気なバーテンダーがいて、場を盛り上げてくれていました。

9/4(日):カンファレンス2日目

phpnutの基調講演、国際化対応、CakePHP2.0、コアデベロッパーによるパネルディスカッションと、主にCakeDCからの発表が多かった1日でした。またMongoDBを絡めた発表も2つあり、1つは日本から参加の@cakephperさんによるMongoDB Datasource。ちょうどメイン会場が国際化対応だったので見れなかったのですが、だいぶ盛り上がっていたようです。
お昼には恒例のリアルケーキも登場。ちょうどその場にいたコアデベロッパーが揃って記念撮影。左から2番目が国際化対応の発表をしたrenanでオランダで働いているそうです。ブラジル人でもある彼は、国際化対応について問題点と解決策をわかりやすく解説していました。これは日本語圏のユーザにとってもありがたいですね。どの国でも作られたプラグインなどが国際化考慮されていれば言語ファイルなどを用意するだけで良い訳ですし。

で、マンチェスターまで行ってLTの参加枠もあるなら、せっかくなのでLTもやってきました。昨年のLTが長い話を全然打ち切れなくてすっきりしないものになっていたので、日本ではLTのタイマ係=ドラ娘という役がありまして〜という発表をしました。スライドは昨晩から少しずつ作って、長い休憩時間も使い無事完成。LTだと自分のペースで話せるので少し楽です。CakeFest参加者にはDoraGirl, DoraMUSUMEというものをバッチリ印象づけて、このネタでさらに多くの人に声をかけてもらうことができました。あのアプリ(DoraGirl)はどこからダウンロードするの?どうやって使うの?とか。

CakeFestで得たもの

もちろん最新のCakePHP2.0情報を得たり、コアデベロッパーの発表を聴くということはとても有意義なことです。ただもちろん参加するにあたり、最低1つ以上質問をしたいし、発表もしたい。幸いCakeFestでは当日申し込みのPechaKuchaやLTなどで容易に発表可能(倍率1倍 w)ということもあり、昨年の5分から今年は12分弱という時間をもらうことができました。質問はもっとも内容が理解できたMarkのPHPUnitの話でアノテーションの使いどころなどに関して聞きました。

また発表や質問を通じて、コアデベロッパーにアイツは何者?とか、こういうことをやっている人、例えば私だとなんかやたらテストについて発表したり質問したりする人、という印象で持ってもらえていると思っています。(事実Markに関してはそういう風に声をかけてくれる。)

で、じゃぁすぐに何かに役立つわけではないかもしれないけど、何かコア部分に関してやりとりしたくなったときや、もちろん日本のイベントに来てもらえるということも、そういった事の積み重ねではないかなぁ、と思っているのです。ですので、来年は日本からより多くの参加者がCakeFestに行ってもらえると嬉しいなぁと思っています。

その他、雑多にふりかえると

ビールが安い!

例えばGUINNESSのパイントが約3ポンド。500しないぐらい。日本の半額以下ですね。これなら毎日相当量飲めそう。事実他のビールも含めだいぶいっぱい飲みましたが…

マンチェスター・ユナイテッド博物館がいい!

イギリスでのサッカーの歴史を感じる博物館で、展示内容もすばらしかったです。

あと全般、ずっと雨模様だったり、涼しかった(寒いに近いぐらい)だったり。 帰国日はマンチェスター空港からの出発が天候不良で1時間近く遅くなり、ロンドンに付いたら1時間半遅れ、3時間の乗り継ぎ時間があったのですが、おみやげ買ったりロンドン空港内の移動(すごい遠い)したりしていたら全く余裕がなく帰国便に搭乗となりました。ロンドン経由にするなら乗り継ぎ時間にかなり余裕を見ておいた方がいいなぁと感じました。

ロンドン空港はオリンピックに向けて、新ターミナルを作っていたりとまた大きくなる印象。さらに複雑になるのかなぁ〜

CakePHPアプリケーションをBehatでテストする

はじめに

Behatとは、Ruby on Railsでは有名なBDDフレームワークcucumberのPHP版クローンです。以前私が発表した資料が過去記事にありますので、詳しくはそちらを参照ください。

利点は、顧客が理解できるシナリオを自然言語(つまり日本語)で記述し、それ自体がテスト実行可能であるということです。

今までCakePHPアプリケーションのテストは単体テストではSimpleTest、ブラウザベースのテストはSeleniumを使うことが多かったと思いますが、これからはBehat/Minkによってテストの幅が広がるでしょう。

しかし、BehatはSymfonyベースで、これまでCakePHPのアプリケーションを実行するためのプラグインなどは準備されてきませんでした。そこで、「rake cucumber」に習い「cake behat」として実行できるシェルタスクを用意しました。

それが「CakeBehat」シェルです。

https://github.com/sizuhiko/CakeBehat

インストール

前提事項

  1. gitが利用可能なこと
  2. PHPUnitがインストールされていること
  3. CakePHPがインストールされていること
  4. MySQLなどデータベースがインストールされていて、テスト用データベースが準備されていること

導入

CakePHPのvendorsディレクトリへ移動して、以下のコマンドを実行してください。

git clone git@github.com:sizuhiko/CakeBehat.git
git clone git://github.com/Behat/Behat.git && cd Behat
git submodule update --init
cd ..
git clone git://github.com/Behat/Mink.git && cd Mink
git submodule update --init

すると、vendors 配下に CakeBehat, Behat, Mink の3つのディレクトリができているはずです。

次に、CakeBehat/vendors/shells から behat.php と behat.yml.default を CakePHPのvendors直下へコピーします。

すると、vendors直下には、behat.php, behat.yml.default, CakeBehat, Behat, Minkがあるはずです。

続いて、CakeBehat/features を CakePHPのappやcakeと同じディレクトリ階層にコピーします。

初期導入は以上で終了です。

環境設定

Behat/Mink環境設定

vendors直下にコピーしたbehat.yml.defaultをbehat.ymlにコピーします。

4行目に

      start_url: http://test.localhost:8888/application-name/

という設定があります。これはアプリケーションのルートパスを設定するもので、ホスト名、ポート番号、アプリケーション名などを指定します。ホスト名はできるだけtest環境と識別可能なものにしておく事がオススメです。

これでおわり?

基本的な環境設定は、ここまでで、behatは実行可能な状況になっています。では具体的にサンプルアプリケーションのコードを使って解説します。

サンプルアプリケーション(ブログ)

CakeBahet/sample の中にCookBookの「CakePHPブログチュートリアル」の初期状態(Postの一覧と詳細だけ)のコードを準備しました。

データベースの切り替え

config/database.phpはそのまま生成すると$defaultがあります。UnitTestを実施する場合などは$testを作成していることもあるでしょう。Behat/Minkはブラウザアクセスで実行されるので、工夫が必要になります。またテストデータの投入で$testを参照するので、必ず定義が必要になります。 そこで Bakery の「Easy peasy database config」にも書いてるように、環境によってデータベース設定が切り替えられるように対応します。

このサンプルでは、アクセスされたサーバ名を基準に切り替えるようにしており、test.localhost なら test用データベース、それ以外ならdevelopment用データベースを利用するようにしています。

hostsファイルに 127.0.0.1 localhost, test.localhost としておけば、test.localhostでアクセス可能になるでしょう。簡単ですね。

テストシナリオの記述

Behatのシナリオ記述は基本的にcucumberと同じです。もし基本的な記述方法がわからない場合は、達人出版社「はじめる! Cucumber」を読むと良いと思います。

ブログチュートリアルの一覧表示と、詳細表示のテストとして、以下のようなシナリオを書きました。

sample/features/posts.features

# language: ja
フィーチャ: ブログの記事を閲覧した
  なぜならブログの記事を閲覧することで、最新の情報を入手したいからだ

  背景:
    前提 ブログ記事に以下の内容が登録されていること:
      | タイトル | 本文 |
      | タイトル | これは、記事の本文です。 |
      | またタイトル | そこに本文が続きます。 |
      | Title strikes back | こりゃ本当にわくわくする!うそ。 |

  シナリオ: 記事一覧を閲覧できること
    前提 トップページ を表示している
    ならば "タイトル" と表示されていること
    かつ "またタイトル" と表示されていること
    かつ "Title strikes back" と表示されていること

  シナリオ: 記事の本文を閲覧できること
    前提 トップページ を表示している
    かつ "またタイトル" のリンク先へ移動する
    ならば "そこに本文が続きます" と表示されていること

どうですか?最低限の決まりがあるように見えますが、普通のドキュメントとして読む事も可能ですよね?少なくともプログラマでなければ読めないSeleniumのようなテストコードとは違うと思います。これがBehatの特徴でもあります。

Hint

Behat/Minkでどんなステップ記述が利用可能かどうかは、

cake/console/cake behat --steps --lang ja

のように実行すると一覧表示されます。

テストデータの登録

サンプルでは「ブログ記事に以下の内容が登録されていること:」のように記述しました。これは最初から用意されているものではなく、独自に定義する必要があるステップです。ステップは features/steps の下に phpファイルを作成すれば自動的に読み込まれ、利用可能になります。

sample/features/steps/posts_step.php

$steps->Given('/^ブログ記事に以下の内容が登録されていること:$/', function($world, $table) {
  $hash = $table->getHash();
  $world->truncateModel('Post');
  $post = $world->getModel('Post');
  foreach ($hash as $row) {
    $post->create(array('Post'=>array('title'=>$row['タイトル'], 'body'=>$row['本文'])));
    $post->save();
  }
});

ステップの雛形自体は、ステップが存在しないときにBehatを実行すると、以下のように画面表示されるので、そのままコピペして作成すると簡単です。

CakeBehatではテストデータを登録するのが容易になるように、Modelを取得できるようにしています。またテストデータを消去するためにtruncateできる仕組みも用意しました。

  1. データの削除:$world->truncateModel(‘Post’);
  2. モデルの取得:$post = $world->getModel(‘Post’);

後は、AAで書いた表をそのまま利用できる(1行目が自動的にタイトル行として解釈されています)ので Model->createとModel->saveを利用すれば、いつものCakePHPの感覚でデータを登録できるはずです。 データベースは自動的に$testで定義された宛先に接続するようになっています。

実行してみよう

cakeやappのディレクトリに移動して、以下のコマンドを実行します。

cake/console/cake behat

さいごに

基本的なアプリケーションであれば、テスト可能な状況になっていると思います。

何かあれば、CakeBehatをforkしてアップデートに参加してもらえればと思います。

現時点で気になっているのは、

  1. モデルの初期化を shells/behat.php の _loadModels() で実行しているのですが、App::objects(‘model’)でモデルの一覧を取得しているので、プラグインのModelまで初期化できていません。ここで初期化する理由は、Shell(CakePHP) -> Behat(Symfony) -> CakePHPのように呼び出されると、初期化されていないモデルが利用できないので、事前に全てClassRegistry::initしておくことで、この問題を回避しています。プラグイン内のモデルを使う場合は、この記述を変更して、プラグインのモデルも利用可能にする必要があります。
  2. テストデータの削除を明示的にtruncateModelしないといけない。本来は features/support/hook.php のフックポイントでtruncateModelを呼び出せるように仕込んでおきたかったのですが、フックポイントから呼び出すとSTRICTエラーが出てしまい、うまく動作しません。ということから、データ投入ステップで一度データを削除するように記述しています。
  3. GithubのReadmeとWikiがまだ未着手で。。

といったところです。

このネタで、CakeFestに応募しようと思うのですが、後9日か。。。