Technote

by sizuhiko

CakeBehat の master を CakePHP2.0 対応に切り替えました。Seleniumによるテストも簡単に。

CakeBehat for CakePHP2.0

PHPMatsuri 2011 で完了させた CakePHP2.0 対応ですが、しばらく 2.0 ブランチで開発バージョンとして扱っていたものを最新のCakePHP,Behat,Minkで動作確認してmasterに昇格させました。

https://github.com/sizuhiko/CakeBehat

はじめに

CakeBehatはCakePHPからBehatを呼び出してテストするためのプラグインです。CakePHP1.3対応として公開したのが2011年6月投稿です。

http://my.opera.com/sizuhiko/blog/2011/06/20/cakephp-behat

インストール

前提事項

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

導入

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

cd plugins
git clone git@github.com:sizuhiko/CakeBehat.git
cd ..

すると、plugins 配下に CakeBehat のディレクトリができているはずです。CakeBehatプラグインを有効にするためにbootstrapでプラグインの読み込みを行います。

app/Config/bootstrap.phpの最後に追加します。
....

CakePlugin::load('CakeBehat');

次に、CakeBehatで必要なBehatやMinkをダウンロードし、featues を初期化します。CakePHPのルートディレクトリに移動して、以下のコマンドを実行します。

lib/Cake/Console/cake CakeBehat.init

するとCakePHPのルートディレクトリに featues ディレクトリができているはずです。 その他にplugins/CakeBehat/Console/Command の下に behat.phar と mink.phar がダウンロードされます。

環境設定

Behat/Mink環境設定

app/Config/behat.yml がinitコマンドによって生成されています。

5行目に

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

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

実行する

基本的な環境設定は、ここまでで、behatは実行可能な状況になっています。 具体的にサンプルアプリケーションのコードを使っての解説は、以前のPostと同じなので、以下のURLから確認してください。

http://my.opera.com/sizuhiko/blog/2011/06/20/cakephp-behat

ただし実行コマンドがプラグイン化に伴って変更されています。プラグイン名が付いたので、cake behat というシンプルなものからは少し遠くなってしまいましたが、以下のコマンドを実行してください。

lib/Cake/Console/cake CakeBehat.bdd

Ajaxを利用したページをテストしたい

最新版のMinkでは、Ajaxを使ったページをテストできるように、ブラウザエンジンを選択することができるようになっています。

  1. GoutteDriver : Ajaxは使えないがライトなブラウザテストが可能
  2. SahiDriver:ブラウザのプロキシ設定が必要だが、様々なブラウザでテストが可能
  3. ZombieDriver:Node.js を使ったブラウザテストが可能
  4. SeleniumDriver:Mink1.2 からサポートされた、お馴染みのSeleniumによるテストが可能

公式のBehatやMinkのドキュメントを参照すると、Seleniumなどを使う場合の方法が書いていませんコードを書いて初期化しないといけませんが、Behat+Minkのインテグレーションでは、behat.ymlに設定するだけで簡単にSeleniumによるテストが実行できるようになります。

JavaScriptセッションエンジンを指定する

CakeBehatではデフォルトのJavaScriptセッションエンジンをSeleniumとしています。app/Config/behat.yml の 4行目に

javascript_session:   selenium

設定を入れてあります。まだ試していませんが、sahiやzombieを使う場合はこの設定を変更すれば動作するはずです。

JavaScriptを使ったページをテストしたいシナリオでは

@javascript アノテーションをfeatureに指定します。

サンプルアプリケーション(blogチュートリアル)のindex.ctpでDeleteボタンがクリックされたときにtrエレメントを消すだけの実装を追加してみました。app/View/Posts/index.ctp

<td><a href="javascript:void(0);" onclick="$(this).closest('tr').remove();">Delete<?php echo $index++; ?></a>

のようにしました。

このリンク「Delete3」をクリックして3行目を削除するfeatureを書きます。

  @javascript
  シナリオ: 記事を削除できること
    前提 "トップページ" を表示している
    かつ "Title strikes back" と表示されていること
    もし "Delete3" のリンク先へ移動する
    ならば "Title strikes back" と表示されていないこと

「リンクをクリックする」みたいなステップへ書き換えた方が本当は直感的なのですが、とりあえず「リンク先へ移動する」を使っています。

後は、Seleniumを実行しておくだけです。

java -jar selenium-server-standalone-2.14.0.jar 

これだけです。特にSeleniumを使うと意識しなくても、@javascriptを付けたシナリオだけでFirefoxが起動してテストが実行されます。もちろんこのJavaScriptを使ったテストも成功します。

さいごに

BehatやMinkは少しのバージョンアップ違いでうまく動かないケースがあります。もしCakeBehatを使ってうまく動作しないケースなどはgithubのissueなどに書き込んでいただければ、改善していきたいと思っていますのでよろしくお願いします。

PHPMatsuriで"できたこと"

<!– more –>DSC05649

大事なことは最初に

PHPMatsuri 2011は昨年に続き、多くの参加者に恵まれまして、無事終了することができました。今年は幹事的な立場で進めてきたのですが、大勢のスタッフやスポンサー、参加者の皆様に支えられたことを感謝しています。

人数もスタッフ、ゲスト、参加者合わせて目標としていた100名に近い96名と、ほぼ満員御礼で開催できたことがとても嬉しいです。

さて今回は、イベント開催前にリレーブログ「PHPMatsuriに参加するとできること」で書いた内容をふりかえる形で開催/参加報告にしたいと思います。

とにかく聴いてみる

DSC05620

初日は午前中から、夜の闇PHPMatsuriまでとても濃いセッションが展開されました。昨年は「ハッカソンで何かを作る」というよりは講演スペースで聴く人の割合が多かったのですが、今年は聴講中心という人の割合よりも、ワークショップとセッションへ交互に参加するという、より幅広くイベントを楽しむスタイルの人が多かったと思います。

夜には昨年はJIREIマスターか登場したのですが、今年は闇の者(NINJA)が登場し、会場を盛り上げていました。闇PHPMatsuriは当初プログラム計画にない持ち込み企画だったのですが、闇の皆様には大変感謝しています。海外のゲストもとても楽しんでいたと思います。

2日目の発表LT大会でも、昨年とほぼ同数の40名近くの参加者がPHPMatsuriでの体験を発表。このLTが中盤にさしかかった休憩時間には「今回イベントとか初参加なのですけど、LTを見て作ったものを発表してみたいな、と思うのですが(エントリーしていないけど)これから可能ですか?」という声をいただき、審査時間の間にリジェクトトーク時間を急遽作りました。これは昨年になかったサプライズで、スタッフのshin1x1さんや、多くの方が「まぁ発表しなくても良いかな?」から「発表したい」に変わっていく瞬間を見れたことはスタッフとして嬉しいことです。リジェクトトークの時間はおよそ30分ぐらいあったのですが、賞品がもらえる訳でもないこの時間に隙間無く発表者が飛び入り参加したのは、PHPMatsuriの中毒症状というか、始めてイベントに参加した人にとっても、これから他のイベントに参加するきっかけになったのではないかと思っています。

また通常のスポンサード以外にも、初日の15時ティータイムにスイーツの差し入れをしてくれた「わったい菜」のスイーツが絶品でした。

何か作ってみたい

初日の昼間の状況は前述したとおりですが、各フレームワークのワークショップも大変盛況でした。昨年は時間が近くなったら何となく集まってやっていたワークショップも、今年は「どこでやりますか?」「すぐ始まりますか?」など参加者の意欲がとても熱く、最初はスタッフもバタバタしてしまい申し訳なかったなぁと思いました。ワークショップに関して今年は特に熱かった(部屋の温度が暑かったのは参加者の熱気では?と思うぐらい)!

また、そこかしこでは、明日の発表に向けて黙々と作っている人などもいて、それぞれの祭りを楽しんでいる様子が伺えました。

それを証明するのが、増井さんと有志の方が定点カメラで撮影した深夜の様子。昨年はほとんどいなかった貫徹組が今年はとても多かったのがビックリでした。コアデベロッパーも質問が来るかもしれないからと、ずっと起きてくれていたのにも感謝です。

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

残念ながらまだ他の人と一緒に作ってみて発表、というところまでは中々難しいですね。ただポジションペーパーに協力いただいたのは嬉しかったです。少しずつ、昨年よりも今年の盛り上がりが熱かったように、共同製作のようなことが来年以降あるのではないかと期待しています。

長い夜の過ごし方

DSC05675

今年の会場はとても広く、会場の外でも開発を続ける様子が見受けられました。隣のビジネスコーナーや、談話室、はたまたマッサージチェアでといった具合に自分に合った?!スタイルで開発をしていたのが印象的でした。

夜のテストワークショップに至っては時間を延長して4時間以上やっていたり、スポンサーセッションがあったり、闇の忍者が現れたりと。

その後深夜はアングリーバードのゲーム大会が行われていたり、例のEpic Saxが流れていたり、ともかく様々な楽しみ方で盛り上がっていました。

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

DSC05804

そして多いに盛り上がったLT大会。あれほど接続テストをしたのに、いざ本番でうまく画面がでなかったり、緊張でタイマーを見てなくて一番大事なところで発表が終わったり(これは関東のLTでは一番盛り上がるネタ手法)、キモいw 発表があったりと、あっという間に3時間が過ぎたのではないかと思います。

もちろん前述したとおりリジェクトトークもあり、ビールタイムもありで、盛りだくさんではなかったかと。

後は今年もsioさんにドラ娘を任せっきりになってしまって、皆さんドラ娘も貴重な機会なので叩いてみるといいよ、と思うのですがなかなかに難しいですね。一度叩くとこれも中毒になるものなので、ぜひ来年はドラ娘に協力していただける方がいるといいなぁと思っています。

最後に

すでにここまでにも嬉しかった事などを書いたのですが、ちょっと書ききれなかったところでもあるので2つほど印象に残っていたことを紹介します。

  1. CakePHPで何か作ろうと思って参加したけど、Titanium が面白そうでそちらで作ったものを発表します、という発表があった。これはPHPMatsuriのようにセッションやワークショップがあった効果だと思っています。また参加者の人が通常仕事では出会う場面がなかったかもしれない、新たな発見をする機会でもあったのではないかと。
  2. CakePHPコアデベロッパーのグラハムが、昨年よりも多くの質問がきたり、声をかけてくれる人が増えたけど何かしたの?と驚いていた。これまでに公開されたblogの記事をいくつか読んで感じたのは、せっかくの機会なので交流を持とうと思ってくれていた人の多さでした。海外のコアデベロッパーに会うには、もちろん海外のカンファレンスに行くのが近道です。ただ参加費や言葉の問題などを考えると簡単ではありません。PHPMatsuriではそういった開発者にも交流の機会を作りたいという思いもあるので、それは今回とても参加者の熱意に感謝しているところであります。

PHPMatsuriは1月ぐらいから、少しずつ準備が始まり、3月の震災以降開催場所の検討やイベントの内容などオンラインで様々なスタッフ協議が行われてきました。来年のことを現時点で考えられないぐらい抜け殻になっている青年団がほとんどだと思いますが、コメントボードに書かれていた熱い想いを受け止めていければなぁと思います。

まぁ偶然とは言え、ハッカー賞、次点が某方面で出ましたので、そういう流れなのかもしれませんが、またお知らせができるときがくるまで、各地の勉強会・開発合宿・カンファレンスなどで盛り上がって行ければなぁと思っています。

本記事中の写真は@koyhogeさん、@suzukiさんのflickrよりお借りしています。

イベント全体の様子は、アルバムサイトを是非ご覧下さい。

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