単純なメソッド呼び出しでブラウザ操作を記述できる

 setUpメソッドの処理が終わると,“test会員登録”メソッドが実行されます。Seleniumのコマンドは,Seleniumインタフェースに対するメソッドとして呼び出せます。open,type,clickといったアクションに対応するメソッドは,HTMLのテスト・ケースと同じように,それぞれのアクションに対応した引数を指定して呼び出します。ここでは,会員登録ページを開き,メールアドレス(test@example.com)とパスワード(test)を入力して,[登録]ボタンをクリックする,というコマンドを送信しています(6)。

 こうしたブラウザ操作の後に,waitForPageToLoadというメソッド呼び出しがあります(7)。これは,ページの遷移が終わるまで待つメソッドです。引数として,何ミリ秒まで待つかというタイムアウト時間を指定します。HTML形式のテスト・ケースではコマンドに“AndWait”を付けてページ遷移を待ちましたが,Selenium RCではこのようにwaitForPageToLoadメソッドでページ遷移を待ちます。

 続く処理で,Webアプリケーションから送信されたメールを読み込み,本文に記載されたURLを取り出してurlという変数に代入しています(8)。これはSeleniumを使った処理ではなく,「SubEthaSMTP Wiser」というテスト用のメール・サーバーのライブラリを使っています。このメール・サーバーは,setUpメソッドから呼び出されるstartWiserメソッドの中で起動しています(5)。このサーバーは,メールを受信すると,普通のメール・サーバーのようにそれを転送するのではなく,すべてのメールをメモリー上に蓄積していくようになっています。蓄積されたメールはgetMessagesメソッドを使って読み出すことができます。

 メールに記されたURLを取り出した後,そのURLにアクセスして,画面上に“完了しました”というテキストが表示されることを検証しています(9)。検証処理は,特定のテキストが存在するかどうかを返すisTextPresentというメソッドと,JUnitのassertTrueメソッドを組み合わせて実行しています。

 HTMLのテスト・ケースではテキストの有無を確認するassertTextPresentコマンドがありましたが,Selenium RCにはアサーションを直接実現するメソッドは用意されていません*2。その代わり,値を取得するメソッドがいくつか提供されています。JUnitをはじめとする各言語/開発環境に対応したテスティング・フレームワークに用意されたメソッドで検証を実行します。

 このように,実際のWebアプリケーションのテストでは,ブラウザの操作だけでは完結できないデータベースの初期化やメールの受信といった処理が必要になる場合があります。Selenium RCは汎用のプログラミング言語でテスト・ケースを記述できるので,ブラウザの操作だけでは完結できないテストも自動化できます。

 ここではJavaでテスト・ケースを作る例を紹介しましたが,Selenium RCを使えばほかの言語でも同じようにテストを書くことができます。Selenium RCの配布アーカイブには,Javaに加えて,C#などの.NET Framework上で動作する各言語,Ruby,Python,Perlに対応したクライアント・ライブラリが付属しています。また,テスト・ケースとSelenium Serverの間はHTTPで通信しているだけなので,そのほかの言語を使ってSelenium Serverに対して命令を送るのも簡単です。

継続的インテグレーションでバグを早期発見

 Seleniumを使ったテストを作成したら,ぜひ「継続的インテグレーション」に組み込んでみましょう。継続的インテグレーション(Continuous Integration,「常時結合」と訳されることもあります)は,ソフトウエアのビルドからテストまでを頻繁に行い,結合によるバグを早期に発見する手法です。

 継続的インテグレーションを行うには,アプリケーションのビルドからテストまでをすべて自動化する必要があります。実は,先ほど使用した会員登録のアプリケーションは,プロジェクト管理ツールである「Maven」を使ってすべての作業を自動化しています。ここでは仕組みの説明を省きますが,ソースコードを日経ソフトウエアのWebサイト(http://software.nikkeibp.co.jp/)で公開します。お手元の環境で試してみてください(カコミ記事「Mavenを利用してサンプルのビルド/テストを自動化」を参照)。アプリケーションのビルドはもちろん,テスティング・フレームワークのJUnitやテスト用のメール環境であるSubEthaSMTP Wiserなどを含め,ビルドからテストまでに必要な全パッケージの取得や,テスト実行時のアプリケーション・サーバー(Tomcat)の起動/終了などもすべてMavenのコマンドだけで自動的に処理できます。

 ビルドとテストを自動化できたら,継続的インテグレーション・サーバー(CIサーバー)に組み込むことで,継続的インテグレーション環境を実現できます。オープンソースの代表的なCIサーバーとしては,CruiseControl,CruiseControl.NET,Continuum,Luntbuildなどがあります。CIサーバーは,Subversionのようなソースコード管理ツールと連携し,ソースコードがリポジトリにチェックインされると,変更を検知して自動的にビルドを実行します。ビルドが完了すると,それが成功したのか失敗したのかといった情報をメールやインスタント・メッセンジャで通知できます。また,ビルドの履歴をWeb上から確認することもできます。例えばContinuumを利用すると,ビルドの履歴が図14のようなWebページに記録されていきます。これを見れば,どの時点でビルドが失敗したのかがひと目でわかります。

図14●Continuumが出力するビルド結果のログ
図14●Continuumが出力するビルド結果のログ

Mavenを利用してサンプルのビルド/テストを自動化

 本文で紹介した会員登録のアプリケーションは,ビルドからテストまでプロジェクト全体をプロジェクト管理ツールMavenで自動化しています。最低限,インストールしておかなければならないソフトウエアはJava SE 5.0, Tomcat 5.5.23, Maven2.0.5の三つだけです。これらが正しくインストールできていれば,サンプルのビルドからテストまで必要な処理はすべてMavenが実行してくれます*A。このサンプル・アプリケーションは内部で様々なパッケージを使用していますが,必要なものをインターネットからダウンロードする処理も自動的に行われます。

 例えば,アプリケーションをビルドするには,ソースコードを展開したディレクトリで,
mvn package
というコマンドを実行します。ビルドしたアプリケーションは,
mvn cargo:start -Dtomcat.home=<Tomcatをインストールしたディレクトリ>
というコマンドでTomcatアプリケーションとして配備され,起動します。起動したら,ブラウザで http://localhost:8080/selenium-test/register.htmlを開くと会員登録画面が表示されます。

 リスト3のテスト・ケースによるテストも自動で実施されます。すべてを再ビルドしてテストするには,
mvn clean verify -Dtomcat.home=<Tomcatをインストールしたディレクトリ>
というコマンドを実行します。コンパイルからアプリケーション・サーバーの起動,テストの実行,サーバーの終了までを一通り実行します。

 今回はビルド・ツールとしてMavenを使用しましたが,オープンソースのビルド・ツールには,ほかにもAntやNAntといったものがあります。プロジェクトの自動化は,シェル・スクリプトを使用したり,複数のビルド・ツールを組み合わせることでも実現できます。いずれの方法を使うにせよ,コマンドを一つ実行するだけでビルドからテストまでのすべてを自動化できていれば,継続的インテグレーションが可能です。

出典:ずばりわかる!Webプログラミング2.0 74ページより
記事は執筆時の情報に基づいており、現在では異なる場合があります。

この先は会員の登録が必要です。有料会員(月額プラン)は申し込み初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら