Web アプリケーションを自動テストするための商用ツールやオープンソースのフレームワークの例として、QTP、RFT (Rational Functional Tester)、Selenium、Webdrive などがあります。この記事では、自動テストの領域でよく使われるようになってきたツール、Sahi について学びます。Sahi はオープンソースのツールであり、さまざまなブラウザーでスクリプトの記録や再生を行える強力な機能や、テスト・スクリプトを作成するための異なる言語用 (Java、Ruby) ドライバーを備え、Ajax および非常に動的な Web アプリケーションに対応しています。また Sahi は https や NTLM による認証もサポートしています。図 1 はユーザーによる操作をシミュレートする場合の Sahi の役割を示しています。
図 1. ユーザーによる操作をシミュレートする
Sahi には以下のようにいくつかの強力な機能や特徴があります。
- Sahi コントローラー (IDE)
- さまざまなブラウザーで動作し、スクリプトを Sahi フォーマットまたは Java フォーマットの 2 つのモードで記録することができます。
- 確実なオブジェクトの識別
- HTML の構造に依存しません。直感的な API (
near、in methodなど) により、ページへの変更がごくわずかな場合にも容易にブラウザー要素を特定することができ、(理解するのが難しい可能性がある) XPath を必要としません。 - 暗黙的な wait 処理
- Ajax やページ・ロードの場合にも wait を実装する必要がなく、テスターはアプリケーションの内部動作を知る必要がありません。
この記事のこれから先では、Sahi を使用してテストを行う方法について、サンプル・アプリケーションを使って順に説明します。この先を読み進めるには、サンプル・アプリケーションとテスト・ケースをダウンロードしてください。
Sahi をインストールして構成するためには、以下の手順に従います。
- 最新のビルド (「参考文献」を参照) をダウンロードし、ファイルを解凍します。Sahi には Java 1.5 またはそれ以降が必要です。
- Sahi のプロキシー・サーバーを起動します。起動スクリプトは <sahi_root>\userdata\bin にあります。
- Windows の場合: start_dashboard.bat
- Linux の場合: start_dashboad.sh
図 2. Sahi のダッシュボード
この例ではブラウザーの構成を気にする必要はありません。Sahi には、ブラウザーを起動するための GUI ツールが用意されています。start_sahi.batまたはstart_sahi.shを実行してそのツールを起動し、次にブラウザーのアイコンをクリックしてプロキシー・サーバーとブラウザー・プロセスを起動します。 - Ant などのビルド・ツールを使用して暗黙的に実行するためには、
start_sahi.batまたはstart_sahi.shを実行する必要があります。注: Internet Explorer (IE) の場合に限り、Sahi のプロキシーを使用するためには手動でブラウザーを構成する必要があります。あるいは、Sahi のプロキシー・サーバーを起動する際、Sahi に用意されているツールを使用してブラウザーのプロキシーを設定することもできます。プロキシーのホストとポートは localhost:9999 です (ポートを変更するには <sahi_root>\config\sahi.properties に変更を加えます)。
Sahi には、Sahi と Java という 2 つのスクリプト・フォーマットが用意されており、デフォルトのオプション (Sahi) は <sahi_root>\config\sahi.properties で変更することができます。Sahi フォーマットは Java のスクリプトに似たフォーマットであり、Sahi の Java スクリプト・エンジン内でのみ実行することができます。この記事の例では、Sahi フォーマットよりも一般的な Java フォーマットを使用します。これは大規模なテスト・プロジェクトの場合に Java フォーマットのスクリプトの方が他のテスト・ツールやフレームワークとの統合が容易なためです。Java フォーマットには一般的な Java コードのスニペットが含まれ、そのコード・スニペットを JUnit や TestNG. などのツールと統合することができます。
簡単なテストを実行するには、以下のようにします。
- テスト対象の Web アプリケーションを開きます。ALT キーを押し、ページ上でダブルクリックします (ここでは説明用として Firefox 3 を使用しました)。
- 図 3 のスクリーン・ショットの画面では、「Record (記録)」をクリックします。
図 3. すべての実行内容を記録するための Sahi コントローラー
「Record (記録)」をクリックすると、ボタンの表示が「Stop (停止)」に変わります。 - Web アプリケーションで何らかの操作を行い、「Stop (停止)」をクリックします。アプリケーション内で実行されたすべてのステップが記録されています (図 4)。
図 4. コントローラーによって記録されたスクリプト
操作が記録されている間、必要に応じてアサーションを挿入することができます。これらのツールには他にも挿入のためのオプションが用意されていますが、挿入は手動で行うことをお勧めします。
ユニット・テストのフレームワークである JUnit は、テスト駆動開発を確立する上で非常に重要です。多くの場合、JUnit フォーマットでテスト・スクリプトを作成すると便利であり、レポート作成に活用することができます。先ほどの例では Java フォーマットでテスト・スクリプトを記録しました。
この Java フォーマットのスクリプトを JUnit 形式のフォーマットにするためには、Eclipse で Java プロジェクトを作成し、<sahi_root>\lib にある JUnit4 ライブラリーと sahi.jar を追加します。JUnit4 フォーマットのテスト・スクリプトを作成する場合には、Sahi 環境に必要な変数をいくつか初期化する必要があります。この記事の例では BaseTestCase.java を継承し、他のテスト・ケースはすべて、このクラスを継承することで実行できるようにします。
demo4sahi クラスは BaseTestCase クラスを継承して Sahi プロキシー関連の初期化タスクをすべて実装し、以下の 2 点を検証します。
- E メール・フォーマットが適切な場合、「
OK」が返されるかどうか。 - E メール・フォーマットが不適切な場合、「
Error」が返されるかどうか。
リスト 1 は JUnit4 フォーマットの典型的なテスト・スクリプトを示しています。
リスト 1. JUnit4 フォーマットのテスト・スクリプト
public class test4demo extends BaseTestCase {
@Before
public void setUp() {
login();
}
@After
public void tearDown() {
logout();
}
@Test
public void testDemo1() {
browser.textbox("email").setValue("demo for sahi");
browser.submit("Submit").click();
assertTrue(browser.label("error").exists());
}
@Test
public void testDemo2() {
browser.textbox("email").setValue("demo@sahi.com");
browser.submit("Submit").click();
assertTrue(browser.label("ok").exists());
}
}
|
人間が介入することなくテスト・スクリプトを実行するためには、Sahi ランタイムのすべての初期化と終了処理を実装する必要があります。基本的な初期化部分は 4 つあり、表 1 はその概要です。
表 1. Sahi 環境の初期化
| BaseTestCase のメソッド | 説明 |
|---|---|
createConn() | SAHI_BASE_PATH、USER_DATA_PATH とブラウザー・タイプを初期化し、ブラウザー・プロセスを作成します。 |
delConn() | ブラウザー・プロセスを削除し、システムを初期状態に戻します。 |
setIEProxy() | テストの実行前に IE のプロキシーを設定します。IE にのみ使用します。 |
login()、logout()、その他よく使用される上位レベルのユーティリティー | すべてのスクリプトに使用できるパブリック・メソッドです。 |
BaseTestCase が実行されると、すべてのテスト・スクリプトの親クラスとして、他のどのメソッドよりも前に
createConn メソッドを呼び出します。こうすることで、BaseTestCase
はブラウザーを開き、ユーザーによる操作をシミュレートすることができます。リスト 2 は BaseTestCase のコードの一部を示しています。
リスト 2.
BaseTestCase
public class BaseTestCase {
protected Browser browser;
protected Proxy proxy;
protected boolean isProxyInSameProcess = false;
protected String browserType = "firefox";
@Before
public void createConn() throws Exception {
Configuration.initJava("f://Program/sahi", "f://Program/sahi/userdata/");
if (isProxyInSameProcess) {
proxy = new Proxy();
proxy.start(true);
}
browser = new Browser(this.browserType);
browser.open();
}
@After
public void delConn() throws Exception {
browser.setSpeed(100);
browser.close();
if (isProxyInSameProcess) {
proxy.stop();
}
}
public void login(){
browser.navigateTo("http://localhost:8080/demo");
browser.textbox("username").setValue("ligang");
browser.password("password").setValue("welcome");
browser.submit("Login").click();
}
/**
* Setting IE's proxy during testing environment initialization
*
* @param enable
*/
public void setIEProxy(boolean enable) {
try {
Runtime.getRuntime().exec(
new String[] {
SetEnv.sahiBasePath
+ "\\tools\\toggle_IE_proxy.exe",
(enable ? "enable" : "disable") });
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
......
}
|
Apache Ant は一般的なビルド・ツールですが、特に Java ベースのプロジェクトに使用されます。Sahi フレームワークには、build.xml ファイルで使用できる Ant 用の JAR ファイルが含まれています。ただし、最初から Sahi に含まれているこのコンポーネントは Sahi の構造に合わせて設計されています。JUnit を使用してインフラ全体を構築したいと思われるかもしれませんが、JUnit はそれほど柔軟でも強力でもありません。この記事のサンプル・プロジェクトのリグレッション・テスト用として build.xml が作成されており、このファイルには以下の内容が含まれています。
- Sahi プロキシー・サーバーの起動と停止 (リスト 3 と4)。
リスト 3. Sahi プロキシー・サーバーの起動<target name="start_sahiserver"> <echo message="starting sahi server" /> <java fork="true" spawn="true" classname="net.sf.sahi.Proxy"> <classpath> <fileset dir="${sahi.dir}"> <include name="**/*.jar" /> </fileset> </classpath> <arg value="${sahihome.dir}" /> <arg value="${sahiuser.dir}" /> </java> <antcall target="proxyon" /> </target>
リスト 4. Sahi プロキシー・サーバーの停止<target name="stop_sahiserver"> <echo message="going to stop Sahi server" /> <sahi stop="true" sahihost="localhost" sahiport="9999" /v <antcall target="proxyoff" /> </target>
- IE プロキシーの設定を開いたり、閉じたりする (リスト 5)。
リスト 5. IE プロキシーを開く/閉じる<target name="proxyon"> <exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe"> <arg value="enable" /> </exec> </target> <target name="proxyoff"> <exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe"> <arg value="disable" /> </exec> </target>
- レポート作成
このアクションは別に実行されるため、Eclipse IDE で容易にデバッグを行うことができます。
Web アプリケーションのテストでは、効率的にオブジェクトを特定することが重要です。他の多くのテスト・ツールとは異なり、Sahi には Web ページ上のオブジェクトを特定することができる強力な API がいくつかあります。表 2 は、そうした API の例の概要を示しています。オンラインのドキュメントと完全なリストへのリンクは「参考文献」セクションを参照してください。
表 2. オブジェクトを特定するための特別なメソッド
| 特徴 | メソッド | サンプル・コード |
|---|---|---|
| 正規表現をサポートします | ほとんどすべての要素識別子 | browser.link(/Link to .*/) |
| DOM の関係に基づいて特定します | near, in |
browser.button("delete").in(browser.cell("item1")).click()
|
| 位置関係に基づいて特定します | under | browser.button("delete").under(browser.cell("item1")) |
この記事では、Web アプリケーションのテストを自動化するためのツール、Sahi について説明しました。Sahi はさまざまなブラウザーでスクリプトの記録や再生を行えるオープンソースのツールです。この記事では、テスト・スクリプトを作成するための異なる言語用ドライバーについて学びました。そしてサンプル・アプリケーションとテスト・ケースを使用し、スクリプトを JUnit 用のフォーマットにする方法と Apache Ant を使用してテストを行う方法を示しました。また Sahi の高度な API の概要も説明しました。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample web application | webapp4sahi.zip | 7KB | HTTP |
| A Sahi test example | Demo4SahiTest.zip | 287KB | HTTP |
学ぶために
- Sahi について学んでください。Sahi は Web アプリケーションのテストを自動化するためのビジネス対応のツールです。このサイトでドキュメントやチュートリアル、サポート・フォーラムを利用することができます。
- Sahi についての詳しい資料を読んでください。
- developerWorks の Web development ゾーンには Web ベースのさまざまなソリューションを解説した記事が豊富に用意されています。
- developerWorks の
Technical events and webcasts で最新情報を入手してください。
製品や技術を入手するために
- Sahi をダウンロードしてください。
- 皆さんの次期開発プロジェクトを IBM ソフトウェアの試用版を使用して革新してください。ダウンロード、あるいは DVD で入手することができます。
議論するために
- ディスカッション・フォーラムに参加してください。
- 今すぐ developerWorks
プロフィールを作成し、Sahi に関するウォッチ・リストを設定してください。developerWorks
コミュニティーとずっとつながっていられます。
- Web
開発に関心を持つ他の developerWorks メンバーを見つけてください。
- Web
のトピックに焦点を絞った developerWorks のグループの 1 つに参加し、皆さんの知識を共有してください。
- Roland Barcia 氏が彼のブログの中で Web
2.0 とミドルウェアについて語っています。
- developerWorks のメンバーが Web のトピックに関して共有するブックマークを調べてみてください。
- 即座に答えを得るために、Web 2.0 Apps
フォーラムを訪れてください。
- 即座に答えを得るために、Ajax フォーラムを訪れてください。
