RSpec + Seleniumを試す。
個人的な備忘録です。この記事は個人の理解によって書いたものであり、内容を保証するものではありません。
1.Seleniumとは
Java, Ruby, Pythonなどの言語からWEBブラウザを操作するためのAPIです。Seleniumを使うと実際にブラウザが起動して処理が実行されます。
詳細は本家のページ(http://seleniumhq.org/)に書いてあります。
2.今回のテーマ
インテグレーションテストを自動化するために、RSpecからSeleniumを使いたいと思います。なぜ、RSpec + Seleniumなのかというところですが、RSpecはRubyのテスト用ライブラリでRubyならではの生産性の高さが魅力です。Rubyを使うという意味ではTest::Unitも選択肢にありますが、個人的にRSpecを使ったほうが読みやすいコードを書きやすいと思います。
Seleniumを使う理由ですが、テストをWEBアプリケーションを作っている言語で書かなくてもよいということがあります。例えば、Javaでアプリケーションを作ったので、インテグレーションテストもJavaで書くというのは個人的に避けたいです。Javaはコンパイルによる静的チェックや継承の制限、JVMの解析によるパフォーマンス分析のやりやすさが魅力で、チームでの開発では魅力的な言語ですが、Rubyと比較すると記述が冗長な部分があり、言語レベルでの生産性の高さではRubyの方が優れていると思います。WEBアプリケーションはJavaで作ったけど、テストを効率的に書きたいというときに選択肢の一つとして、Ruby+Seleniumはありだと思っています。
ちなみに、状況によりますが、Railsなどのテストがサポートされているフレームワークでは、インテグレーションテストもそのフレームワークのルールに従って作るほうが効率がいい場合もあると思います。
3.試してみる
開発環境はMac OS X 10.8.2 でrvmを使っています。APIのリファレンスはhttp://selenium.googlecode.com/svn/trunk/docs/api/rb/index.htmlを参考にしました。テストを実行するプログラムのディレクトリ構成は以下のとおりです。
selenium_rspec |- spec |- vendor |- .rspec |- .gitignore `- Gemfile
ライブラリの管理はbundleを使います。Gemfileは以下のとおりです。
source "http://rubygems.org" gem 'rspec' gem 'selenium' gem 'selenium-webdriver'
bundleでgemをインストールします。
bundle install --path vendor/bundle
specディレクトリに以下のプログラムを配置します。ちなみに、使うブラウザによってWebDriverを生成するコードが異なります。今回は最もシンプルなFireFoxで試しました。RSpecではspec/**/*_spec.rbにマッチするファイルを自動で認識して実行してくれますので、その規約にそってファイルを作ります。
firefox_example_spec.rb
require 'selenium-webdriver' describe "Google", "FireFox Example" do before do @webdriver = Selenium::WebDriver.for :firefox end it "Http get should be successfull." do @webdriver.navigate.to "http://www.google.co.jp" element = @webdriver.find_element(:name, 'q') element.send_keys "Hello World" element.submit @webdriver.title.should == "Google" end after do @webdriver.quit end end
Googleにアクセスして、HelloWorldと入力するテストです。Matcherではページのタイトルが"Google"であることを検証しています。
プロジェクトのルートで以下のコマンドを実行すると、ブラウザが起動してテストが自動実行されます。
bundle exec rspec
ちなみに、プロジェクトルートに.rspecファイルを配置すると、カラー表示や結果の表示を変更できます。
.rspec
--format documentation --color
今後はJenkinsとの連動にチャレンジしたいと思います。