–>CakeMatsuriを迎えるにあたってのリレー形式ブログ第2弾です。yandoさんの記事の後で恐縮ですが、これまでCakePHPと過ごしてきた日々を振り返ってみます。Railsでも有名だった最速開発のスクリーンキャストをPHPでもやってみた、というものでした。PHPは2000年頃に興味を持ってやっていたのですが、その後仕事はJavaやRubyが中心となり、疎遠となっていました。そのためPHPでもこんな事ができるのか!!と衝撃を受けました。CakePHPをダウンロードし、動かしてみると、その導入のしやすさは(エラーメッセージの親切さも相まって)、これまでに体験したことのないものでした。blogチュートリアルを作って、アレコレいじっていた記憶があります。PHP熱が再発した瞬間でした。ミニ案件との出会いその直後、たまたま小さい案件で、言語は何でも良いという仕事に偶然と出会い、CakePHPの採用を決めました。当時のバージョンは1.0でした。当時は日本語の情報も少なく、Cake本体のコードを読みながら進めていたものでした。書籍執筆のきっかけちょうどその頃、同僚が「Web2.0ビギナーズバイブル」の共著を持ちかけてきました。この本はWeb2.0開発を始める人向けの本で、言語部分はそのものの入門とフレームワークの入門をペアにした企画でした。書籍としては(雑誌は既出でした)始めてCakePHPを取り上げることになりましたが、実は企画を依頼された段階ではsymfonyだったのです。CakePHPを使った後で比較のためにSymfonyも使ってみたことはあったのですが、どうしてもCakePHPでやりたいということを言って変更してもらった経緯がありました。そのときsymfonyで書いていたら今はどうしていたのかな?と思うことがあります。これまで雑誌やメルマガの経験はあったのですが、初めての書籍はとても困難でしたが、ここから学ぶことも大変多く、その後「Webアプリケーションテスト手法」「CakePHPによる実践Webアプリケーション開発」の計3冊も共著させていただくことになったのは感謝でいっぱいです。CakePHPコミュニティとの出会いその後、yandoさん主催で始まったCakePHP勉強会に参加・発表したり、CakePHPカンファレンスで講演させていただいたり、様々なところでCakePHPユーザとの出会いを繰り返してきて新しい輪が構築できました。新しい輪は、仕事面でも指名でCakePHP案件をいただくこともありました。直近では「CakePHP1.2ガイドブック」のトークショーを池袋ジュンク堂でやったのですが、これも楽しいイベントになりました。CakeMatsuriへ今月末、10/30、10/31にCakePHPコミュニティの活動として、国内最大のイベントなるCakeMatsuri(昨年はCakePHPカンファレンス)が開催されます。今年は2日間で、30日はこれまで何回か実施したハンズオンの延長線上になるワークショップ(すみませんもう定員に達しました)、31日は海外からコア開発者を招待しての講演や、CakePHPを使った事例発表などがあるカンファレンス(まだ参加者募集中です)から構成されています。コミュニティの輪に身を投じてみて、私は様々な出会いやきっかけを得ることができました。皆様もCakeMatsuriに参加して新しい輪を広げてみてはどうでしょうか?聴講者として参加するも、LTなど短い時間からでも、苦労したことを事例発表するなど、様々な参加スタイルがありますので、皆様の参加をお待ちしております。–>9/30に行われた第46回PHP勉強会で発表した内容ですが、そのままブログで読めるように展開します。経緯CakePHPはユニットテスト実行時にテストデータを投入するfixture機能をサポートしています。CakePHPのユニットテストはSimpleTestをベースにしており、UnitTestCaseと、それを継承してWebブラウザ動作のテストを行うWebTestCase、2つのテストケースを持っています。CakeではそれぞれCakeTestCase、CakeWebTestCaseという名前になります。CakeWebTestCaseはWebTestCaseを継承しているだけで、何も機能拡張をしていません。{}CakePHPオフィシャルのCookBookでも、以下のように解説されています。拡張したもので、特に機能追加はありません。持つ機能以外のものは使えないことを意味します。おいてフィクスチャは利用できず、テストケースにデータベースに対する更新や保存が含まれていた場合、恒久的にデータベースの値が変更されることを意味します。テストの結果は、しばしばデータベースが持つ値に基づくので、テスト手順の一部としてデータベースが期待した値を持つことを確認してください。実際に開発の場面では、WebTestCaseを使って、ログインからの操作を試したり、データベースに依存した操作・結果を求めなければならない場面に遭遇します。そこで今回はfixutureを使えるようなWebTestCaseを作ってみます。今回fixtureを使えるWebTestCaseを作る上で、考慮したポイントは以下のとおりです。流用して差分のみ別クラスに作成することにしました。すると、後でCakeのバージョンが変わったても問題が少ないし、後で本体に組み込んでもらうときもわかりやすいと思ったからです。実施の手順は以下のとおりです。実際のテストケースを記述それぞれの手順を詳細に解説します。変更まず流用元のテストケースをコピして、継承する元になるクラスを作成します。「FixturableWebBaseTest」に変換これはお使いのエディタを開いて、置換機能を使えばあっという間に完了です。3.FixturableWebBaseTestのスーパークラスをWebTestCaseに変更このままでは、単にCakeTestCaseの名前を変更しただけなので、そのスーパークラスをUnitTestCaseからWebTestCaseに変更します。手順3でWebTestCaseを使ったCakeTestCaseと似たものができました。このままではWebアクセス時にfixtureを読み込むようにはできません。FixturableWebBaseTestを継承したクラスを作成します。このクラスでは、Webテスト中なのか、通常動作中なのかを判定するロジック(CakeTestCaseからの差分)を記述します。Webテスト中なのか、そうでないのかを判定するために、以下の方法を検討しました。以下のファイルで識別するUserAgentを使って識別するHTTP独自ヘッダで識別するまずUserAgentでテスト中か判断する方法を思いついたのですが、Webテストの場合UserAgentそのものを判断してビューを切り替えたり(特に携帯など)するので、これは方法としては最適ではないと判断し却下。HTTP独自ヘッダは、やはり通常運用しているときにセキュリティホールを作る事にも繋がるので、微妙なところです。通常(本番)運用する場合はCakeのデバッグレベルを0にして運用すると思うので、独自ヘッダの判定前にデバッグレベルを判定すれば問題ないということも言えます。そこで今回は、tmp/tests以下にテンポラリファイルを作って判定するという方法を採用しています。最後の準備として、bootstrapに初期化コードを追加します。bootstrapはCakePHPで動作するすべてのアクションが必ず通過する最初のポイントなので、ここで利用するデータベースを切り替えるようにします。}}bootstrapはテストコードをtest.phpから実行しようとした場合も通過してしまうので、このURLはフィルタする必要があります。通常運用で呼ばれないようにデバッグ値が0より大きい場合にデータベースの切り替えを実行するようにします。6.実際のテストケースを記述これでWebTestCaseでfixtureが使える準備は整いました。後はテストケースを記述するだけです。今回サンプルとして、私の執筆した「CakePHPによる実践Webアプリケーション開発」で作ったCalendarNoteをテストしてみます。}}このテストシナリオは以下のとおりです。ログイン画面にアクセスできるか検証するタイトルがCalendarNoteになっているか検証するログインボタンが出ているか検証するユーザ名hide、パスワードpasswordでログイン(サブミット)する次の画面に、フルネームが表示されていて、ログアウトリンクがあるか検証する。2009年1月の月単位スケジュール一覧に遷移できることを検証する。2008年12月28日という文字列の表示を検証する。スケジュール詳細へのリンクが表示されることを検証する。フォームのタイトルに正しい値が入っていることを検証する。フォームのコンテンツに正しい値が入っていることを検証する。テストコードに目を向けると、最初にApp::importでテストケースの親クラスを取り込んで、テストケースの親クラスをFixturableWebTestCaseに指定する以外、ほとんど通常のモデルなどのテストコードと書き方は同じだということに気がつくでしょう。fixtureの記法に関しては、まったく同じです。変更」したために、CakeTestCaseと同じ機能が利用できるようになっているのです。記述方法が同じなら、実行方法も同じで、http://localhost/test.phpのようにブラウザからの実行や、コンソールからの実行なども問題ありません。CakeMateを使ってTextMate上からもテストが実行できます。コンソールやTextMateなどCLI環境から実行する場合なども、裏でHTTPアクセスするので、Apacheは動作している必要があります。Webテストで、どのようなブラウザ動作ができるのかは、本家のSimpleTestサイトか、こちらも私が執筆に参加した「Webアプリケーションテスト手法」にて確認してください。最後に本カスタマイズはPHP5.2.10、CakePHP1.2.5で検証しています。CakePHP1.2系であれば特に問題なく動作すると思いますが、うまく動作しない場合はコメントいただけると助かります。今後の展開としては、まずこの記事を英語にしてBakeryにアップしたいと思います。それをきっかけにコア開発者の目にでもとまったら、本体への組み込みなんか検討してくれるかもしれません。して一度やろうとしてやめたのかもしれないんですけど、Cake祭り(*1)でコア開発者が日本に来るので、直接聞いてみたいなと思います。Cake祭り:昨年はCakePHPカンファレンスとして実施した、イベントの第2回目。今年もコア開発者が日本に来るので要注目のイベントです。LiveTalk)で司会を勤めました。LiveTalkと銘打ったように「Cafeでの楽しいおしゃべり」的な雰囲気を出せたのではないかと思います。花火大会やガンダムを見るBBQなど誘惑の多い、しかも真夏日な暑い一日でしたが、来場していただいた皆様に感謝です。本日の模様はUSTなどされなかったのですが、後日動画サイトに一部アップされるかも?しれません。参加者の皆様のBlogを見るのが楽しみやら、心配やら。本の話をしなかったしなー(汗)またCakePHPオフ会や、PHPカンファレンス、CakePHPカンファレンスでお会いしましょう。サイト、羽田空港HP、JR東日本フードサービス、佐川急便HPなど大規模サイト開発においても実績のあるCakePHP。CakePHP公認ガイドとして好評を博した『CakePHPガイドブック』が最新バージョン1.2に対応し『CakePHP1.2ガイドブック』として生まれ変わりました。そこで刊行を記念し、『CakePHPによる実践Webアプリケーション開発』(2009年3月刊)の著者岸田氏も交え、CakePHPの達人たちによるトークセッションを開催いたします。7月にドイツで開かれるCakeFestBERLIN2009の模様や開発現場のプロならではの濃い話を十二分に語ってもらいます。CakePHPを使っている人は勿論、これからCakePHPを使おうとしている人も必聴のトークセッションです。詳しくはコチラを参照ください。当日は私が司会を務めます。ガイドブックに込められた思いや、CakePHP最新動向、安藤さんによるCakeFESTレポートなど盛りだくさんでお送りしますので、ぜひご参加ください。参加確実の方は、ジュンク堂へ予約電話を入れてもらえると、人数把握できますので、よろしくお願いします。イベント終了後には懇談会も予定しております。懇談会については、コチラ(ATND)から参加表明ください。皆様の参加をお待ちしております。このビヘイビアを使うと、商品カテゴリとかディレクトリみたいに、ツリー構造になっているモデルを簡単に扱うことができます。簡単になるのは、ツリー構造を取得したり、階層を1つ上に移動したり、特定の階層の下に追加したり、といった自分で作ったら、チョー面倒な処理ばかりです。left,rightの列があればいいんでしょ、ぐらいにしか思ってませんでした。ソースも追わなかったし・・・・で、たまたまSQL関係で調べ物をしていたら、すばらしいページを発見。入れ子集合モデル』いや、(自分にとっては)すごく難しい話なんですが、すごくわかり易く解説してあって、left,rightってそういう事だったのね、とわかってきた時は感動します。CakePHPのtreeはparent_idが必要なんですが、この理論で行くといらないですね。何かの都合でparentを持つことにしたと思うんですけど、TreeBehaviorのコードからそこまで読み取ることはできませんでした。