読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

PhantomJSとPoltergeistでHeadlessなJavascriptテスト環境を作る

RailsでJavascript/CoffeeScriptをテストするときの決定版(にしたい)!Konachaの続き。

最初はブラウザリロードすればいいんだから、わざわざやらなくていいか、と思ったけど、当該環境がファントムとかポルターガイストとか中二病の諸症状を悪化させる瘴気にまみれていたため、やらざるを得なくなりました。

ところでヘッドレスとは、ただ単にGUIじゃないよ、というだけで、かっこつけてんじゃねーよとか最初は思ったけど冷静になってみると、別にそんなかっこよくもねーか、ということでとにかくそういうことで。

Rails前提の話です。

PhantomJSのインストール

http://phantomjs.org/
PhantomJSが、そのヘッドレスブラウザの本体。
macだとhomebrewで入る。

brew install phantomjs

ウィンドウズのかたはゲイツとかにインストール方法を聞いてください。

poltergeistのインストール

poltergeistはPhantomJSと連携してくれるcapybaraのドライバ。
gemでインスコ

group :development, :test do
~snip~
  gem 'konacha'
  gem "poltergeist"
end

設定ファイルを少々

poltergeistを使うようにconfig/initializersに設定ファイルを置く。

# config/initializers/konacha.rb
if defined?(Konacha)
  require 'capybara/poltergeist'
  Konacha.configure do |config|
    config.driver = :poltergeist
  end
end

ヘッドレスっぷりを感じる

以下のコマンドを実行して、ブラウザが立ち上がらずにテストが通ることを確認する。
※このへんはRailsでJavascript/CoffeeScriptをテストするときの決定版(にしたい)!Konachaを参照

bundle exec rake konacha:run

guard-konachaでテストを自動実行

https://github.com/alexgb/guard-konacha
ここまで来ると、コマンドを叩くのもめんどくさくなってくる。ゲイラの気持ちがよくわかります。

  • gemでインストール
group :development, :test do
~snip~
  gem 'konacha'
  gem "poltergeist"
  gem 'guard-konacha'
end
  • Guardfileに設定追加
~snip~
guard :konacha do
  watch(%r{^app/assets/javascripts/(.*)\.js(\.coffee)?$}) { |m| "#{m[1]}_spec.js" }
  watch(%r{^spec/javascripts/.+_spec(\.js|\.js\.coffee)$})
end

なお、Guard自体のインストールはGuard+Spork+GrowlでRspecを自動実行する設定あたりで。

  • Guard実行
bundle exec guard start

あたりまえだけど、Guardfileが一緒だからRspecのほうも動いちゃうんだよなぁ。ウォークスルーテストやるとけっこう時間がかかっちゃう。まあ、RSpecとkonachaのどちらかの設定をコメントアウトしつつ、かな。

これ、Jenkinsとかでも、PhantomJSだけ別の方法でインストールすればほぼ済むんじゃないかな。

ただねぇ、これ、スゲーおそいんだよね。guardがどうこうっていうよりkonacha:runが遅いのかな。自動的にテストが走ってくれるのはいいんだけど、細かく結果を確認するんだったらブラウザリロードのほうが現実的だね。

ともあれ、ファントムファントム!