Technote

by sizuhiko

PHPmatsuri was greatest event for PHP developer.

<!– more –>I went PHPmatsuri on last weekend. PHPmatsuri was great-full Hackathon style event about PHP in Japan. I had prepared about the event as staff.

私は先週末PHP祭りに行ってきました。PHP祭りは、日本のPHP界隈では最大のハッカソン形式のイベントです。私はスタッフとして準備に携わってきました。

In 10/2 morning(8:00 am), staffs meets up hall of the event(Harumi Grand Hotel). We were setting some desks, chairs, electronics line, audios and reception space.

スタッフは10/2の朝8:00に晴海グランドホテルに集合して、会場のセッティングを行います。

I wait participants of the event at front of the hotel, and I showed them to the room. I could look for them easily, because any participants had iPhone and navigated by google-map.

受付が始まる直前にホテルのフロント前に移動し、参加者を会場へ案内します。皆さんiPhoneを片手に地図を見ながら来るので、すぐに参加者とわかりました。

At first, I started ice break for strained participants. And I introduce to them Mr. Hiro Yoshioka, then started first session. The session has be very important for Japanese developer. Should check his blog & slides.

まず最初はアイスブレークから。皆さんの緊張を解きほぐします。会場が暖まったところで、よしおかさんに基調講演をしていただきました。このセッションはPHPに限らずに日本の開発者にとってぜひ聞いて欲しかったセッションとなりました。ぜひよしおかさんのブログをチェックしてください。

The important thing is “English or die” for us. Almost Japanese developer have satisfaction with only Japanese information. Because some Japanese hacker translate English to Japanese with his effort. But Yoshioka san says, “should dispatch some information with English to world-wide”. I know it is very important.So, I wrote this post in English. Some guys same thinks, time line on twitter about phpmatsuri filled with his impressive words.

注目すべきキーワードは“English or Die"でした。日本ではみんな日本語訳のドキュメントを作るのが好きで、著名なブロガーやハッカーがやってくれていますね。でもそうではなくて各自が英語を使って海外に発信していくのが重要だと。僕もそう思うし(だから英語で書いてみた)、よしおかさんの講演中のtwitter TLを見ればみんな共感していたのがわかります。

The second session was Practical PHP5.3 by Mr. Nate Abele. He is developing lithium now. Before, he was CakePHP lead developer. In 9/25, Mr. Rasmus Lerdorf talk about same keywords at PHP-conference. Nate talked about some details more than Rasmus with using sample codes.For example PSR-0, closure…

次のセッションはNateによる実践PHP5.3。1週間前のPHPカンファレンスでRasmusが講演した内容と似ていたけど、より詳細に踏み込んだ感じだった。特にPSR-0とかクロージャとかlithiumの例も交えて解説していました。

Since afternoon, the room was separated to 2 space between conference and Hackathon. On the conference space, talked about CakePHP2.0 by Graham Weldon, Lithium by Nate Abele & Joel Perras and some sponsor’s session. On the Hackathon space, opened workshop about Symfony2, CakePHP and Lithium by the core developer. I presided on conference space, but had very interesting to Hackathos space.

午後からは会場を講演スペースと開発スペースに分割しました。講演スペースでは、コアデベロッパーから各フレームワークのセッションあり、スポンサーセッションあり。開発スペースではコアデベロッパーと一緒にワークショップができたり、各々のテーマで開発したりしていました。僕は司会進行だったので講演スペースに付きっきりでしたが、開発スペースがすごく気になっていました。

After dinner, Mr. Kris Wallsmith talked about Symfony2 at confernce space. Same time, Redbull’s girls came to Hackathon space.

夕食が終わると、KrisによるSymfony2のセッションが開始。ちょうどその頃レッドブルガールがキャンペーンにやってきてくれました。

In that time, I was not able to be heard while preparing next surprise present. I was waiting for 3 cakes. When Symfony2 session ended, the cakes carried into the room. Everybody crowded around cakes and take many photos. So, the nice idea(real cake) was started by Japanese CakePHP community on 2 years ago. In this time, it added Lithium and symfony. The cakes made by Paper Moon. I know the shop is very nice cafe. I recommend for you.

僕はちょうど次のサプライズに向けて準備中でSymfony2のセッションはほとんど聞けませんでした。それは日本のCakePHPイベントでは恒例のリアルケーキです。今回は僕が担当だったのと、とにかくLithiumの出来映えがどうなのか心配だったのです。Symfony2セッションが終わるころホテルの人にケーキが運び入れてもらいました。みんな群がって来て写真を取りまくっていました。ケーキは南麻布のPaper Moonさんにお願いしました。良い店なのでお勧めです。

And sounds of StarWars heard, JIREI master entered. He look like Jedi master! JIREI means the use-case. 2 teams of CakePHP and symfony competed presentation to get a degree of JIREI master. So, @HIROCAST won competition and became JIREI master. He talked about Agile development by symfony.

スターウォーズの曲と共にJIREI masterが入場。ここから事例紹介セッション「JIREI night」が始まります。CakePHPとsymfonyに別れ交互に事例発表を行い、勝ったのは@HIROCASTさんの「アジャイルな開発をチームでやってみた」(symfony)に決定しました。

Time is over 23:00. But everyone continue to develop about themself theme. I started myself theme too. I tried OpenpearPEG for develop parser of Cucumber feature.

事例紹介が終了したのが23時過ぎ。ここからようやく自分の開発時間です。OpenpearPEGでCucumberのパーサーを作ろうと思っていました。

About 2 hours later, I saw some problem. But file of feature don’t match PEG because it isn’t structured. I started giving it up. I was looking for difference theme. So, I got destiny project. It’s Behat. I had feeled very interesting about this project. I decided this to be my theme.

Time is over 5:00. My challenge finished. I go back to my room. What my room-mates was developing his theme in the room !

2時間ぐらい頑張ったのですが、自然言語はPEGと相性が悪いように思い、諦めかけて違うテーマを探していたら、運命の出会いが待っていました。それが「Behat」です。これで行くぞ、と決めたのです。そして5時頃なんとか日本語フィーチャが通るようにハックして部屋に戻りました。合部屋の人はすっかり寝ているのかと思ったら、なんと部屋で開発していました!みんな頑張ってるなー

I got up 7:00 on 10/3. After breakfast, I wrote presentation for demonstration on event room. Everybody get up, but they were maybe very tired. Afternoon 10/3, demonstration about every theme started. The entries are 33. Each presentation is 4 minutes, and the style is Japanese LT having "Dora-Musume”. Whenever demonstration finished , the auditor posts the score from Google-Form.

1時間半ぐらい寝て、7:00から朝食を取りイベント会場でデモ大会用のプレゼンを作成。みんな会場入りするけど、お疲れの様子です。どうも結構な人数が徹夜でやっていたようで。。10/3午後からデモ大会の開始です。発表は1人4分、日本のLT形式(もちろんドラ娘付き)です。なんと33人のエントリーがありました。各プレゼンが終わると事例発表と同じGoogleフォームから投票できるようになっています。そういえばドラ娘の写真がありません。どなたかプリーズ。

My position is 8th in sector-1. But I started on 7th by few accidents. Since sector-2, I presided. All demonstration was finished 3 hour later. The talker and auditor was very tired. long long time LT had been first time for us.

僕は最初の8番目の予定だったのですが、並び順を間違えて7番手でプレゼンとなりました。その後セクター2からは司会にバトンタッチ。全部のLTが終わったのが3時間後(1時間おきに休憩はありましたよ)。こんなに長いLTは初めてで、すごく疲れました。

And……. I won Hacker Prize. It means best performance into these demonstrations. I got new iPod-touch of prize. I’m very happy !

そして運命の結果発表。僕はハッカー賞に選ばれました。これは最高得点の賞なんです。賞品は新しいiPod Touchです!

Long long time was spent, phpmatsuri finished. I think almost participants and staffs were satisfaction. And for Japanese PHP developer, it will become to trigger to publish some information positively. I think so.

At last, thanks for 2 days. @yando and staffs, everybody.

長い時間が過ぎ、PHP祭りは終了しました。参加者/スタッフともに満足できる内容だったと思っています。また日本のPHP開発者にとって積極的に情報発信をするきっかけになるイベントになったんじゃないかと思いました。最後に、2日間ありがとうございました。特に@yandoさん、そしてスタッフ・参加者の皆様に感謝です。

第50回PHP勉強会@関東に参加してきた

<!– more –>第50回PHP勉強会@関東に参加してきました。

とても豪華なメンバーが集まっていて、さすが50回!!
ネタも旬な内容でしたが、ustムリなセッションもあったりして、細かい内容のレポートは避けておきます。

会場を貸していただいたコンテンツワン様ありがとうございました。
広いしキレイだし言う事なしです。

んで、その後最寄りの日比谷バーに移動したのですが、乾杯がいきなりオリジナルカクテル。
@gusagiさんすごいよ!

完全貸し切りのスペースで、立食パーティ。懇親会LTもあり(発表しました)、楽しい時間はあっという間に過ぎました。
次の区切りはハードルが上がりますね。100回はあと何年後?ですかね。
最後には記念デザートもあり、記念尽くしな懇親会でした。

LTでも言いましたが、永和システムマネジメントは「PHP x Agile も応援します」ので、お仕事ありましたら、連絡ください www。

参加した皆様、発表者の皆様お疲れさまでしたー
幹事の@gusagiさんに感謝です。

CakeMatsuri 2009 TOKYO ふりかえり

<!– more –>昨年のCakePHPカンファレンスでは、一講演者としての参加だったのですが、今回は中の人として参加しました。
Blogを書くまでがイベントです、ということで、一息ついたところでの思いをKPTでまとめてみました。
イベント全般に関しては、スタッフで「ふりかえり」をしたので、当日の担当範囲中心に。

Keep:
二日間にわたり、かなり多くのかたと交流できたのが、今回のテーマ「交流」にマッチしていて、よかったのではないかと思います:yes:
特にこれまで勉強会などで会ったことのない初対面のかたと、いろいろな話ができたので楽しかったです。
コア開発者とも仲良くなれた気がしました!!:up:
また1日目の懇親会でJoelに先日のPHP勉強会で発表した「WebTestCaseでfixtureを使う」について、プレゼンできたことが良かったです。後で英語に翻訳してBakelyにアップするぜ!と宣言した(自分を追い込んだ)ので、頑張ります。:star:

Problem:
ワークショップ(実務者編)のユニットテスト基礎・実践は、実質基礎しかできませんでした:ko: 。イベントごとという意味ではオブジェクト倶楽部などの経験もあったので大丈夫かな?と思っていたのですが、ちょっと上級内容だったのかな?と。。。ただ資料としては、後で十分振り返ってできる内容になっているので、持ち帰ってゆっくり確認してもらえると、理解が深まるかな?と思います。
2日目の2次会は、grahamの向かいの席でがっつり英語談義だったのですが、途中から疲労:faint: とアルコール:beer: から頭の回転がおかしくなってきて、だんだんと聞き取りもできなくなってきてしまいました。

Try:
PHPerにはコマンドラインは難しい?というのもあったので、別の方式が良いのかな?とも思ったのですが、実務ではconsoleのテストを使ったりすることの方が多いので、やはりコマンドラインは捨てがたいのですよね。なので次回以降は、オブラブの合宿前にもやった「環境構築前夜祭」をできれば良いなと思います。地方からの参加で必ずしも前夜祭に参加できない(当日移動など)の方もいるので、資料は事前公開ということで。
そういったことも含め、実務者コースのハンズオンの感触は、今回かなり掴めたので、進め方などもっと良い形でできるようにしたいと思っています。
後は英会話ですなー、毎日仕事で使っていたときより明らかに落ちてるし(とは言っても元々たいしたこともないけど)。。。何か解決策を見つけて英会話力をアップしたいと思うのでした:) 。


最後に。
参加者の皆様の温かい声援や、Blogでの感想に助けられました。ありがとうございます。
ワークショップの持ち出し企画はやりたいなーと思いますが、ちょっとしばらくイベントは・・・と思ったりしてます:pが、来年には実施したいですね。
また皆様にお会いできるのを楽しみにしています。

わたしとCakePHP

<!– more –>CakeMatsuriを迎えるにあたってのリレー形式ブログ第2弾です。yandoさんの記事の後で恐縮ですが、これまでCakePHPと過ごしてきた日々を振り返ってみます。

CakePHPとの出会い

はじめてCakePHPという名前を聞いたのは、「10分で作るCakePHPアプリ」というRuby on 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など短い時間からでも、苦労したことを事例発表するなど、様々な参加スタイルがありますので、皆様の参加をお待ちしております。

CakePHPのWebTestCaseでfixtureを使う

<!– more –>9/30に行われた第46回PHP勉強会で発表した内容ですが、そのままブログで読めるように展開します。


経緯

CakePHPはユニットテスト実行時にテストデータを投入するfixture機能をサポートしています。CakePHPのユニットテストはSimpleTestをベースにしており、UnitTestCaseと、それを継承してWebブラウザ動作のテストを行うWebTestCase、2つのテストケースを持っています。CakeではそれぞれCakeTestCase、CakeWebTestCaseという名前になります。 ただしCakeWebTestCaseはWebTestCaseを継承しているだけで、何も機能拡張をしていません。

cake/tests/lib/cakewebtest_case.php

class CakeWebTestCase extends WebTestCase {
}

CakePHPオフィシャルのCookBookでも、以下のように解説されています。

CakeWebTestCase は、SimpleTest の WebTestCase をただ拡張したもので、特に機能追加はありません。SimpleTest の Web testing に関する文書中に記載がある全ての機能は、 CakeWebTestCase で利用できます。これはまた、 SimpleTest が持つ機能以外のものは使えないことを意味します。すなわち、 CakeWebTestCase においてフィクスチャは利用できず、テストケースにデータベースに対する更新や保存が含まれていた場合、恒久的にデータベースの値が変更されることを意味します。テストの結果は、しばしばデータベースが持つ値に基づくので、テスト手順の一部としてデータベースが期待した値を持つことを確認してください。

しかし実際に開発の場面では、WebTestCaseを使って、ログインからの操作を試したり、データベースに依存した操作・結果を求めなければならない場面に遭遇します。そこで今回はfixutureを使えるようなWebTestCaseを作ってみます。

考察

今回fixtureを使えるWebTestCaseを作る上で、考慮したポイントは以下のとおりです。

  1. なるべく書かない
  2. Cakeのバージョンが変わっても簡単に移行したい
  3. いつかは本体に組み込んで欲しい

そこで、今回はUnitTestCaseを継承している、caketestcase.php を流用して差分のみ別クラスに作成することにしました。こうすると、後でCakeのバージョンが変わったても問題が少ないし、後で本体に組み込んでもらうときもわかりやすいと思ったからです。

実施

実施の手順は以下のとおりです。

  1. caketestcase.php をコピーして、
fixturablewebbasetestcase.php に変更
  2. 上記ファイルの「CakeTest」 部分を 「FixturableWebBaseTest」に変換
  3. FixturableWebBaseTestのスーパークラスをWebTestCaseに変更
  4. FixturableWebTestCase を作成
  5. bootstrap に初期化コードを追加
  6. 実際のテストケースを記述

それぞれの手順を詳細に解説します。

1.caketestcase.php をコピーして、
fixturablewebbasetestcase.php に変更

まず流用元のテストケースをコピして、継承する元になるクラスを作成します。

cd {アプリケーションのHOMEディレクトリ}
mkdir app/vendors/webtest

cp cake/tests/lib/cake_test_case.php app/vendors/webtest/fixturable_web_base_test_case.php

2.上記ファイルの「CakeTest」 部分を 「FixturableWebBaseTest」に変換

これはお使いのエディタを開いて、置換機能を使えばあっという間に完了です。 app/vendors/webtest/
fixturablewebbasetestcase.php を編集してください。

3.FixturableWebBaseTestのスーパークラスをWebTestCaseに変更

このままでは、単にCakeTestCaseの名前を変更しただけなので、そのスーパークラスをUnitTestCaseからWebTestCaseに変更します。

class FixturableWebBaseTestCase extends WebTestCase {
    // extends を変更する
}

4.FixturableWebTestCase を作成

手順3でWebTestCaseを使ったCakeTestCaseと似たものができました。ただしこのままではWebアクセス時にfixtureを読み込むようにはできません。 FixturableWebBaseTestを継承したクラスを作成します。このクラスでは、Webテスト中なのか、通常動作中なのかを判定するロジック(CakeTestCaseからの差分)を記述します。 またWebテスト中なのか、そうでないのかを判定するために、以下の方法を検討しました。

  • tmp/tests 以下のファイルで識別する
  • UserAgentを使って識別する
  • HTTP独自ヘッダで識別する

まずUserAgentでテスト中か判断する方法を思いついたのですが、Webテストの場合UserAgentそのものを判断してビューを切り替えたり(特に携帯など)するので、これは方法としては最適ではないと判断し却下。 HTTP独自ヘッダは、やはり通常運用しているときにセキュリティホールを作る事にも繋がるので、微妙なところです。ただし通常(本番)運用する場合はCakeのデバッグレベルを0にして運用すると思うので、独自ヘッダの判定前にデバッグレベルを判定すれば問題ないということも言えます。 そこで今回は、tmp/tests以下にテンポラリファイルを作って判定するという方法を採用しています。 app/vendors/webtest/fixturablewebtest_case.php

<?php
App::import('Vendor', 'webtest' . DS . 'fixturable_web_base_test_case');

/**
 * FixturableWebTestCase class
 */
class FixturableWebTestCase extends FixturableWebBaseTestCase {
    /**
     * @overwrite 
     */
    function startCase() {
        $this->_lockWebTesting();
    }
    /**
     * @overwrite 
     */
    function endCase() {
        $this->_unlockWebTesting();
    }
    /**
     * bootstrap.php から呼び出す
     */
    function initIfTestMode() {
        if(file_exists(FixturableWebTestCase::_getLockFileName())) {
            parent::_initDb();
            Configure::write('Acl.database', 'test_suite');
        }
    }
    /**
     * TMPファイルを作成して、Webテスト中であることを宣言
     */
    function _lockWebTesting() {
        touch($this->_getLockFileName());
    }
    /**
     * TMPファイルを削除して、Webテスト中でなくす
     */
    function _unlockWebTesting() {
        unlink($this->_getLockFileName());
    }
    function _getLockFileName() {
        return TMP.'tests'.DS.'fixturable.web.test.tmp';
    }
}

5.bootstrap に初期化コードを追加

最後の準備として、bootstrapに初期化コードを追加します。bootstrapはCakePHPで動作するすべてのアクションが必ず通過する最初のポイントなので、ここで利用するデータベースを切り替えるようにします。 app/config/bootstrap.php

if(($_SERVER['PHP_SELF'] != '/webroot/test.php') && Configure::read() > 0) {
  if(App::import('Vendor', 'webtest' . DS . 'fixturable_web_test_case')) {
    FixturableWebTestCase::initIfTestMode();
  }
}

bootstrapはテストコードをtest.phpから実行しようとした場合も通過してしまうので、このURLはフィルタする必要があります。また通常運用で呼ばれないようにデバッグ値が0より大きい場合にデータベースの切り替えを実行するようにします。

6.実際のテストケースを記述

これでWebTestCaseでfixtureが使える準備は整いました。後はテストケースを記述するだけです。 今回サンプルとして、私の執筆した「CakePHPによる実践Webアプリケーション開発」で作ったCalendarNoteをテストしてみます。

<?php 
App::import('Vendor', 'webtest' . DS . 'fixturable_web_test_case');

class UsersWebTest extends FixturableWebTestCase {
    var $fixtures = array('app.group', 'app.user', 'app.users_group',     'app.schedule', 'app.schedules_user',
        'app.aco', 'app.aro', 'app.aros_aco'
    );

    function startTest($method) {
        parent::startTest($method);
        Configure::write('Acl.database', 'test_suite');
        $this->addHeader('Accept-Language:ja');
    }
    function testLoginAndCheckSchedule() {
        $this->assertTrue($this->get('http://calendarnote.localhost/users/login'));
        $this->assertTitle(new PatternExpectation('/CalendarNote/'));
        $this->assertSubmit('Login');

        $this->clickSubmit('Login', array(
            'data[User][username]'=>'hide',
            'data[User][password]'=>'password',
        ));
        $this->assertText('Hidetoshi Nakata');
        $this->assertLink('ログアウト');

        $this->assertTrue($this->get('http://calendarnote.localhost/schedules/index/month/2009/01'));
        $this->assertText('2008年12月28日');
        $this->assertTrue($this->clickLink('10:00-12:00 Nengashiki'));

        $this->assertFieldByName('data[Schedule][title]', 'Nengashiki');
        $this->assertFieldByName('data[Schedule][contents]', 'In Japan, there are the New Year holidays and a New-Year's-greetings ceremony is performed to the first day of work.');

    }
    function endTest($method) {
        parent::endTest($method);
        $this->get('http://calendarnote.localhost/users/logout');
    }
}

このテストシナリオは以下のとおりです。

  1. ログイン画面にアクセスできるか検証する
  2. タイトルがCalendarNoteになっているか検証する
  3. ログインボタンが出ているか検証する
  4. ユーザ名hide、パスワードpasswordでログイン(サブミット)する
  5. 次の画面に、フルネームが表示されていて、ログアウトリンクがあるか検証する。
  6. 2009年1月の月単位スケジュール一覧に遷移できることを検証する。
  7. 2008年12月28日という文字列の表示を検証する。
  8. スケジュール詳細へのリンクが表示されることを検証する。
  9. フォームのタイトルに正しい値が入っていることを検証する。
  10. フォームのコンテンツに正しい値が入っていることを検証する。

テストコードに目を向けると、最初にApp::importでテストケースの親クラスを取り込んで、テストケースの親クラスをFixturableWebTestCaseに指定する以外、ほとんど通常のモデルなどのテストコードと書き方は同じだということに気がつくでしょう。特にfixtureの記法に関しては、まったく同じです。 これは「caketestcase.php をコピーして、
fixturablewebbasetestcase.php に変更」したために、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)でコア開発者が日本に来るので、直接聞いてみたいなと思います。


(*1) Cake祭り:昨年はCakePHPカンファレンスとして実施した、イベントの第2回目。今年もコア開発者が日本に来るので要注目のイベントです。今すぐ申し込みへ。 http://matsuri.cakephp.jp/