Seleniumとは?

Seleniumは、Webブラウザのテストを自動化するためのツールのスイートで、以下のプロダクトから構成されている。

  • Selenium IDE … テストケースを作成・実行するためのGUIツール。Firefoxアドオンとして動作する
  • Selenium RC … Selenium IDEで作成したテストケースをコマンドラインで実行でき、Firefox以外のブラウザでもテスト可能
  • Selenium Grid … 様々なOS、ブラウザ上でSelenium RCを複数インスタンス実行し、テスト時間を短縮できる
  • Selenium WebDriver … Selenium 2.0から導入された、ブラウザをプログラムから操作するためのライブラリ

図1 : SeleniumのWebサイト

以前のSeleniumはHTMLで記述したテストケースをブラウザ上のJavaScriptで実行するというものだったため、テストケースから添付ファイルを選択することができないなどセキュリティに起因する制約があった。しかし、Selenium 2.0からWebDriverというWebブラウザそのものを外部プログラムから制御する機能が統合され、この欠点は解消されている。

ブラウザの操作からテストケースを生成する

Selenium IDEを使用することで、Firefox上でブラウザの操作を記録してテストケースを生成することができる。Selenium IDEはダウンロードページからダウンロードしたxpiファイルを、Firefoxのアドオンマネージャ(Firefoxの[アドオン]メニューで表示可能)にドラッグ&ドロップしてインストール可能だ。

インストール後、Firefoxの[Web開発]メニューから[Selenium IDE]を選択すると、Selenium IDEが別ウィンドウで起動する。記録状態でブラウザの操作を行うことで、自動的に操作がコマンドとして記録されていく。また、右クリックメニューから値の検証を行うためのコマンドを挿入することができる。記録したテストケースはSelenium IDE上で実行可能だ。

図2 : Selenium IDEを起動したところ

図3 : コンテキストメニューから検証コマンドを挿入可能

図4 : テストケースを実行したところ

テストケースはSelenium IDE上で編集できるので、あとから細かい調整を行うことも可能だ。また、Selenium IDEの実行速度が速すぎてテストが失敗するような場合はテストの実行速度を調整することもできる。

作成したテストケースはHTML形式で保存することできるほか、Ruby、Python、Java、C#の各種テスティングフレームワークでWebDriverもしくはSelenium RCを使用したテストコードとしてエクスポートすることが可能だ。

ただし、WebDriverを使用したコードにエクスポートする場合、すべてのコマンドを忠実にエクスポートできるわけではないという点に注意して欲しい。例えば、clickAndWaitコマンドはウェイトなしで出力されるため、エクスポート後にウェイト処理を追加する必要があるだろう。

Selenium Builder

前述のように、Selenium IDEはWebDriverに完全に対応しているわけではない。WebDriverを使用したテストケースを生成するのであれば、Selenium Buildeを使用するといいだろう。

Selenium BuilderもSelenium IDEと同様にFirefoxアドオンとして動作する。インストール後、CTRL+ALT+Bで起動する。テストを開始するURLと、Selenium1か2(WebDriver)のいずれかを選択すると、操作の記録が始まる。Selenium Builderのウィンドウの「Record a verification」をクリックすると、ブラウザで表示している任意の要素を選択して値の検証を行うコマンドを挿入できる。

図5 : Selenium Builderを起動したところ

図6 : Selenium Builderで作成したテストケース

作成したテストケースはSelenium Builder上で実行するほか、「File」→「Save」でJava、Ruby、Python、C#などのテストケースとしてエクスポートすることが可能だ。

まとめ

一般的にブラウザを使用したテストの自動化はユニットテストと比較して導入の難易度が高い。これはテストケースの作成・維持のためのコストがユニットテストと比較して大きくなりがちだったり、どこまでテストするべきかの判断が難しいためだ。無闇に自動化するのではなく、適切な箇所・用途に絞って利用するといいだろう。