諸々の理由でCodeIgniterで開発してるんだけど、時間がないのでなんとなくTDDでやってる。テストありきのほうが戻りが少ないだろうという理由。
そんなわけでCIUnitにKenji_sがパッチを当てたバージョンを使ってるのだが、コントローラのテストのためにPOSTとGETをクリアしたくなったのと、今作ってるやつが複数DBを見る構造(これも諸々の理由)なので複数DBに接続して結果を見たかったのでちょっといじった。そのパッチ。
CodeIgniterは3系の話が出てるんで、出たらまた変わりそうだけど、RequirementがPHP5.3系になる(ツッコミもらった。ツッコミの通り、3系も5.2.4以降が対象だそう。ただ5.2は2011年でEOLになってるし、5.3もあと1年くらいなので、これから作るなら5.4以降だといいのでは。と言いつつ殆どの人はレン鯖のバージョンに引っ張られるんだろうしな。今見てるプロダクトも5.1が絶賛稼働中だし。)んで、5.3ならFuelPHPでいいんじゃないかな。Kenji_sも今はFuelPHPのほう使ってるようで、Issue溜まってるし。CodeIgniterはControllerのインスタンスにClassLoaderがロードしたクラスを変数として外挿するような密結合な作りなのでUnitTest書いててどうも不可思議なことが多くて困る。
なんというか、PHP自体があんまりUnitTest向きじゃないと思う。理由は、POSTとGETを処理系が勝手にグローバル変数にしてしまう点と、出力が本当にそのまま出力な点。register_globalsをしないようにしたところで、POSTとGETというグローバル変数に置いてしまうのだからどうしようもない。まあクリアすりゃいいんだけど。出力の方はもうどうしようもなくて、油断してPHPタグの外にスペースを書こうものなら出力されるし。
CIUnitで書いていいのはモデルのテストまでで、Controllerのテストはせずに、振る舞いのテストをCucumberでやるほうがいいんじゃないかとも思う。今のプロジェクトではやらんけど…。
PHPUnitそのまま使えるっぽいな。これでよかったかもしれぬ。
追記:ジェームズの記事読んだけどフレームワークのコード変えたりしてるな。やってることもCIUnitと似てる(index.phpをbootstrapとして使うとか)。CIUnitならfixtureの読み込みがかなり簡略化されてるし、DB設定もCodeIgniterそのままだし楽。PHPUnitだとDBUnit入れたり、fixutureをYAMLで書きたかったPHPUnit_Extensions_Database_DataSet_YamlDataSetを使うようにしたりしないといかんのが面倒。ただPHPUnitを直接使うユーザのほうが多いので、ハマるとこは少ないし、そっちのほうが応用は効くよな。
『Google Androidプログラミング入門改訂2版』『入門Chef Solo - Infrastructure as Code』『はじめてのフレームワークとしてのFuelPHP』を購入しました tatsu-zine.com/books/androidp…
— kuwa1 (@kuwashima) April 13, 2013
リモートアプリの本当に振る舞いだけのテストをやろうと思って試したら失敗した。
結論:LinuxかOSX使え。
とりあえず動くのはSeleniumだけだけど遅い(Cygwinではパッチが必要)。
Capybara-webkitはビルドの機種依存がベタ書きなので、Linux/OSX/FreeBSD(/Win32?)のみ。
poltergeistはPhantomJSのコンパイルが無理。あとX欲しいとか言われる。
mechanizeは実行するとRackアプリじゃねえとか言うし、terminusはインストールできるけどtimeoutする。
Ruby-installer 1.9.3とWaitr-WebDriverでFirefoxとChromeが動くのは試した。ならSeleniumでもいいんだろうけど。
やっぱHeadlessで高速に動かしたいよな。
RubyInstaller 1.9.3とdevkit入れて、Capybara-SeleniumドライバとかWatirDriverなら動く。
RubyInstall 2.0.0は、まだ入れちゃダメだ…。
headless系が難しいな。動的ページでなければmechanizeとかで全然いいけど。ただmechanizeはpage.form.inputとかインスタンス細かく作るしpage.submit formみたいな書き方なので、step定義するときちょっとめんどくさい。
Capybara-webkitはdevkitのバッチで環境変数設定すればビルドできるけど、まだちゃんと動かせてない。poltergeistはプロセス周りでエラーになるようだが。
CapybaraでページがAJAXで更新後になるまで待つには using_wait_time(10) {page.should have_css('td.book')} 等とするといいらしい。
読了。因果応報的な何か。短編のほうは超後味悪い感じ。とりあえず読みやすい。