Jasmine で 継続的なJavaScriptのテストをする

風邪で3日も寝込んでしまったので、JavaScriptのテストツールについて調べてみた。その中で、特に Jasmine というのが気になった。使ってみるとなかなかよさげ。

Jasmineは、JavaScriptでBDD(behavior-driven development)を行うフレームワークで、RubyRSpecのように振る舞いを定義する。Sencha Touchのテストにも使われているらしい。ちなみに、RSpecについては スはスペックのス が詳しい。

なぜこれが良いかは、公式ドキュメントにずばりある。
Background · jasmine/jasmine Wiki · GitHub

There are some great JavaScript testing frameworks out there already, so why did we write another?

None of the existing frameworks quite worked the way we wanted. Many only work from within a browser. Most don't support testing asynchronous code like event callbacks. Some have syntax that's hard for JS developers or IDEs to understand.

So we decided to start from scratch.

適当意訳

既に数多の優れたJavaScriptテスティングフレームワークがあるのに、なぜ別のを作ったか?

我々の望みを完全に実現するフレームワークが無いからです。ほとんどのものはブラウザ中でしか動かないし、イベントコールバックの様な非同期テストをサポートしていない。またいくつかは難しい文法やIDEを必要とする。

だから、我々は一から作ることを決めたのです。

JsUnitやQUnitSeleniumのことを言ってるなぁという感じですが、たしかに後発なゆえ、なかなか良くできているかと思いました。BDDというところもなかなか良い。

Jasmine の使い方は他に色々あるので、以下のサイトなどを参考にしてください。

Jasmine には 静的なHTMLファイルを用いたスタンドアローンと、rubyでサーバを立ててテストする rubygems 版があります。rubygems 版のメリットは、コマンドラインから実行可能という点。継続的テストにはこれが必要不可欠。

Jasmine では、 Selenium-rc を利用して自動的にブラウザを起動してテストする仕組みが有ります。

rake jasmine:ci

で実行できる。
デフォルトでは FireFox でのテストになる。実施するブラウザを変更したい場合は、環境変数 JASMINE_BROWSER に実施したいブラウザを指定すれば良い。Jasmineの場合、jasmine_config.rb で設定することが可能だ。
jasmine_runner.rb と同じ場所に jasmine_config.rb という名前のファイルを作成し、以下のように記述すれば safari でのテストが可能になる。

ENV["JASMINE_BROWSER"] = 'safari'

safariでの実行で注意することは、ポップアップブロックが有効になっているとテストが途中で止まってしまうため、これを無効にする必要がある。safariのメニュー「sfari」から「ポップアップウインドウを開かない」のチェックを外す。

なお、chromeは指定してもなぜかfirefoxになってしまう。。。
また今度調べてみよう。