Selenium on Rails

概要

Selenium on Rails は、Rails アプリケーションを Selenium Core [http://www.openqa.org/selenium-core/] でテストするための簡単な方法を提供します。

このプラグインは、次の 4 つのことを行います。

  1. Selenium Core ファイルが /public を汚染することはありません。
  2. スイートファイルを作成する必要はなく、実行時に (/test/selenium 内に各ディレクトリにつき 1 つのスイートが) 作成されます (スイートはネストできます)。
  3. テストケースを HTML で記述する代わりに、それより便利なさまざまな形式を使用できます (あとの「形式」を参照してください)。
  4. フィクスチャのロードとセッションの抹消 (/selenium/setup)。

インストール

Rails は開発時期によってページのレンダリング方法を変えているため、残念ながら Selenium on Rails の以前のバージョン間での互換性は確保されていません。したがってインストールに必要なものも、Rails のバージョンによって、次のように別の場所に置かれています。

Rails 2.2 以降の場合:

http://svn.openqa.org/svn/selenium-on-rails/stable/selenium-on-rails
	

Rails 2.1 の場合:

http://svn.openqa.org/svn/selenium-on-rails/tags/rails_2_1/selenium-on-rails
	

Rails 2.1 以前の場合:

http://svn.openqa.org/svn/selenium-on-rails/tags/pre-rails-2-1/selenium-on-rails
	

GitHub の次の場所には、常に最新のリリースがあります。

git clone git://github.com/paytonrules/selenium-on-rails.git
	

インストールの手順は次のとおりです。

  1. Selenium on Rails をインストールします: script/plugin install <URL>
  2. Windows 上では次のようにします: gem install win32-open3
  3. RedCloth gem が利用可能な場合、Selenese テストケースでは RedCloth を使ってマークアップを向上させることができます。
  4. プラグインのディレクトリで Rakefile を実行してテストを行い、問題がないことを確認します (RedCloth がインストールされていない場合、RedCloth がインストールされていることを前提にしている少数のテストが失敗します)。
  5. テストケースを作成します: script/generate selenium <TestName>
  6. サーバーを起動します: script/server -e test
  7. ブラウザで localhost:3000/selenium にアクセスします。
  8. すべてが問題なく動作していれば、Selenium テストランナーが表示されるはずです。右上のフレームには、すべてのテストケースが表示され (まだ 1 つだけです)、上のフレームには作成したテストケースが表示されます。

形式

テストケースはさまざまな形式で記述できます。どの形式を使うかは、好みの問題です。テストファイルを作成するには、script/generate selenium を実行するか、または /test/selenium ディレクトリ内に手作業でファイルを用意します。

RSelenese、.rsel

RSelenese ではテストを Ruby で記述できます。これは私のお気に入りの形式です。

setup :fixtures => :all
	open '/'
	assert_title 'Home'
	('a'..'z').each {|c| open :controller => 'user', :action => 'create', :name => c }
	

利用可能なコマンドについては、SeleniumOnRails::TestBuilder を参照してください。重要な注意: RSelenese は、ページがロードされたときに一度だけ、その背後で Selenium 用 HTML テーブルを作成します。これは、次のようなコードを記述した場合、このコードはテストが実行されるときではなく、テストがロードされるときにだけ実行されることを意味します。

(1..10).each do |index|
	    do something
	end
	

これはよくある間違いで、最初はテストが成功するものの、次回からはテストが失敗するという結果になります。

Selenese、.sel

Selenese は (良い意味で) 最も低レベルな形式です。必要なコマンドを '|' を区切り文字として記述するだけです。

|open|/selenium/setup|
	|open|/|
	|goBack|
	

Selenese テストを手作業で記述したくない場合には、Selenium IDE を使用できます。Selenium IDE は Selenese をサポートしています。

HTML/RHTML

テストは HTML/RHTML でも記述できますが、この形式は、既存のテストがあって、それを再利用したい場合に便利でしょう。

部分的なテストケース

いくつものテストケースで同じ操作を行う場合は、これらの操作を独立した部分的なテストケースに入れ、これをほかのテストケースからインクルードすることができます。これは、構造化プログラミングにおいて小さな関数が推奨されるのと同様、強く推奨される方法です。

部分的なテストケースは通常のテストケースと同じですが、ファイル名をアンダースコア (_) で始める必要がある点が異なります。

#_login.rsel
	open '/login'
	type 'name', name
	type 'password', password
	click 'submit', :wait=>true
	

RSelenese テストケースで部分的なテストケースをインクルードするには、次のようにします。

include_partial 'login', :name => 'Jane Doe', :password => 'Jane Doe'.reverse
	

Selenese テストケースでは、次のようにします。

|includePartial|login|name=John Doe|password=eoD nhoJ|
	

RHTML テストケースでは次のようにします。

<%= render :partial => 'login', :locals => {:name = 'Joe Schmo', :password => 'Joe Schmo'.reverse} %>
	

設定

いくつか設定可能な項目があります。selenium.yml.example ファイルの名前を selenium.yml に変更して rails アプリケーションの設定ファイルがある場所に置き、このファイルに対して必要な変更を加えてください。

環境

プラグインはデフォルトではテスト環境でのみ利用できるようになっています。この設定を変更するには、たとえば次のようにします。

#selenium.yml
	environments:
	    - test
	    - development
	

Selenium Core のパス

バンドルされたバージョンの Selenium Core を使いたくない場合は、 selenium_path に目的の Selenium Core が置かれているディレクトリを設定します。

#config.yml
	selenium_path: 'c:\selenium'
	

Rake タスク

すべての Selenium テストを 1 つの Rake タスクとして実行できます。継続的ビルダを使っている場合、これは Selenium をビルドプロセスに統合するための非常に便利な方法です。Windows 上ではまず win32-open3 がインストールされていることを確認します。次に、実行するブラウザを以下の要領で指定する必要があります。

#config.yml
	browsers:
	    firefox: 'c:\Program Files\Mozilla Firefox\firefox.exe'
	    ie: 'c:\Program Files\Internet Explorer\iexplore.exe'
	

これで設定は完了です。まずサーバーを起動します。

script/server -e test
	

次にテストを実行します。

rake test:acceptance
	

これでうまく動作するはずです。もしうまくいかなかったら私に連絡してください。

結果の保存

test:acceptance の結果を保存するには、保存先のディレクトリを指定する必要があります。

#config.yml
	result_dir: 'c:\result'
	

これで、test:acceptance を実行すると、結果の書き込まれたテーブルが、指定されたディレクトリに .html ファイルとして保存されます。

user_extension.js

Selenium は、Selenium Core の機能を拡張する方法である user_extension.js をサポートしています。Selenium on Rails では、目的に応じて Selenium Core の機能を拡張する手段を提供しています。

具体的には、Selenium Core の user-extensions.js.sample のサンプル機能を複製した lib/test_builder_user_accessors.rb.example および lib/test_builder_user_actions.rb.example を用意しています。

これらのサンプルを実行するには、ファイル名の最後の .example と .sample を取り除いてから、サーバーを再起動します。

今後の課題

  • Standalone mode

    必要に応じてサーバーを起動できるようにするために、Windows では test:acceptance に関してまだまだ作業の必要あり。

  • ドキュメントの更新

作業対象外

  • エディタ

    テストケース用エディタの作成は現在、このプラグインの作業対象範囲には入らないとみなされています。Selenium IDE [http://www.openqa.org/selenium-ide/] がすばらしい成果を挙げていて、Selenese と RSelenese のどちらの形式についてもサポートしています [http://wiki.openqa.org/display/SIDE/SeleniumOnRails]。

クレジット

  • Jonas Bengston — 原作者
  • Eric Smith, http://blog.8thlight.com/eric — 現在のメンテナ
  • Jon Tirsen, http://jutopia.tirsen.com — もとになったアイデアを提供 [http://wiki.rubyonrails.com/rails/pages/SeleniumIntegration]
  • Eric Kidd, http://www.randomhacks.net — RSelenese をコントリビュート
  • Marcos Tapajós http://www.improveit.com.br/en/company/tapajos — いくつかの有益な機能を追加。現在のコミッタ
  • Ryan Bates, http://railscasts.com — Rails 2.1 のバグフィクス
  • Nando Vieira, http://simplesideias.com.br
  • Gordon McCreight, サポートされていないメソッドをすべてリストアップする便利なスクリプトを作成

コントリビュートする ##

コントリビュートの方法は簡単です。上に示した github のリポジトリをフォークし、必要な変更を加えたら、pull request を送ってください。重要 関連するユニットテストのないフォークは取り込みません。テストは存在していなければならず、かつテストをパスしなければなりません。この条件を満たさなければ、私は変更を取り込みません。