実はCapybaraってよく分からないんです
というか、この辺の用語がいつも混乱してとても困っていたのでいったん整理。今回のターゲットは何やら最近 JavaScript を含む Web アプリのテストでよく名前を聞く
capybara-webkit
からスタート。
間違ってたら突っ込んでください! 間違ってなかったら褒めてください!
名前
- capybara-webkit
- Capybara の driver. Capybara のテストを WebKit を通じて実行できる。WebKit と言えばみんな大好き、Google Chrome や Safari のエンジンですね。
- capybara
- テスティングフレームワークに対して Web アプリのテストを書きやすくする語彙を提供してくれる( DSL や Driver で実装されている )。driver は default で rack_test で、JavaScript を含む場合は Selenium になる。1
- cucumber
- 語彙の定義をしてあれば日本語でもテストを記述できる BDD フレームワーク。主に受け入れテスト用として人気?
ここまで全部 Ruby 製。
links
ただし
Cucumber を PHP アプリに対して本当に使えることが分かった
に書いたように、アプリケーションは Ruby 製である必要はない。その場合は
jeroenvandijk/capybara-mechanize - GitHub
を使う。mechanize については今回は端折ります。
もう一度まとめると
- capybara の default driver である rack_test は rack アプリしかテストできない
- default の javascript_driver である selenium は remote server にアクセス可能
- rack_test を capybara-mechanize に差しかえると non-JavaScript の部分も remote server へアクセス可能
みたい。ということは rack_test 使ってる間は本物の http request は飛ばないのか…。
ちなみに capybara は Web アクセスをシミュレートしてくれるので、これは外から Web アプリをテストするためのものですね2。純粋に JavaScript のユニットテストを行う場合は QUnit, Jasmine, 最近だと Mocha なんかを使います。
ところでなんでCapybaraなんだろう
たぶんだけど提供してくれる API がステキなんじゃないかなぁという印象。Ruby でテストを書きたいだけなら他にも選択肢はあるし。Selenium じゃないのはブラウザ部分を取っ替えてより速く実行できるのがみんな好きみたい。
Capybaraってテスティングフレームワークですか?
違います。
Web のアクセスをシミュレートするヘルパーです。
だから実際のテストは Cucumber や RSpec なんかで書きます。
おまけ
Jasmine にも Web サーバ起こすだけのやつと Selenium 使うやつがあったけど、WebKit 使うやつはないのかなぁと思ったらこれが見つかった。
jasmine-headless-webkit – The fastest way to run your Jasmine specs!
ブラウザ立ち上げっぱなしで guard-livereload で回してもいいけど、CLI で完結するのもステキ。何らかのサーバで動いているであろう CI に向いてますね。もちろん Selenium と違って起動も速いので普段使いにもオススメです。
これは今度試そう。
こんな感じか。
余談
レガシーなコードもたくさんあるのでそういうときにせめて外からテスト揃えておくと安心だよねぇと調べてから思ったけど、それって
Rails での spec:requests にも同じことが言えるんじゃ?
と思い始めた。今まで request を元に内部で分岐する部分のテスト以外は真面目に書いてなかったけど、
単にちゃんとページが返ってくる
ことを spec でガードしておくのも大事だなと急に思い直した。初期の頃にはほとんど意味を感じない spec だけど、ある程度複雑になってきたときに予想していなかったところに影響が出てしまったことを素早く検知するために、
「ページが表示されて当たり前じゃん」と思っていても spec:requests は書いておいた方がいい
んだな。たぶん。なるほど。なんか Model や Helper やらに意識がいきすぎてた。
参考
JavaScriptのテスト事情-ダイジェスト版- 2011年10月13日
あとで見つけたんだよ! ほんとだよ!