本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Sahi を使用して Web アプリケーションのテストを自動化する

Gang Li (liggli@cn.ibm.com), Staff Software Engineer, IBM
Gang Li photo
Gang Li は現在 IBM CDL で IBM Initiate 製品の品質保証を担当しており、自動テストの基盤作成を中心とした作業を行っています。

概要: Web アプリケーションを自動テストするための商用ツールやオープンソースのフレームワークが数多くあるなかで、Web アプリケーションのテストを自動化するためのツールとして、Sahi がよく使われるようになっています。Sahi はさまざまなブラウザーでスクリプトの記録や再生を行えるオープンソースのツールです。Sahi にはテスト・スクリプトを作成するための異なる言語用のドライバーがあり、Ajax や高度に動的な Web アプリケーションに対応しています。この記事では、サンプル・アプリケーションとテスト・ケースを使用しながら Sahi について学びます。スクリプトを JUnit 用のフォーマットにする方法と Apache Ant を使用してテストをする方法を学びましょう。

日付:  2011年 7月 15日
レベル: 中級 この記事の原文:  英語
アクティビティー: 4084 ビュー
お気軽にご意見・ご感想をお寄せください: 


はじめに

Web アプリケーションを自動テストするための商用ツールやオープンソースのフレームワークの例として、QTP、RFT (Rational Functional Tester)、Selenium、Webdrive などがあります。この記事では、自動テストの領域でよく使われるようになってきたツール、Sahi について学びます。Sahi はオープンソースのツールであり、さまざまなブラウザーでスクリプトの記録や再生を行える強力な機能や、テスト・スクリプトを作成するための異なる言語用 (Java、Ruby) ドライバーを備え、Ajax および非常に動的な Web アプリケーションに対応しています。また Sahi は https や NTLM による認証もサポートしています。図 1 はユーザーによる操作をシミュレートする場合の Sahi の役割を示しています。


図 1. ユーザーによる操作をシミュレートする
Sahi がプロキシー・サーバーとして動作し、ユーザー・リクエストを実際のアプリケーションに渡し、レスポンスを取得しています。

Sahi について

Sahi には以下のようにいくつかの強力な機能や特徴があります。

Sahi コントローラー (IDE)
さまざまなブラウザーで動作し、スクリプトを Sahi フォーマットまたは Java フォーマットの 2 つのモードで記録することができます。
確実なオブジェクトの識別
HTML の構造に依存しません。直感的な API (nearin method など) により、ページへの変更がごくわずかな場合にも容易にブラウザー要素を特定することができ、(理解するのが難しい可能性がある) XPath を必要としません。

暗黙的な wait 処理
Ajax やページ・ロードの場合にも wait を実装する必要がなく、テスターはアプリケーションの内部動作を知る必要がありません。

Sahi を使用してテストを行う

この記事のこれから先では、Sahi を使用してテストを行う方法について、サンプル・アプリケーションを使って順に説明します。この先を読み進めるには、サンプル・アプリケーションとテスト・ケースをダウンロードしてください。

インストールと構成

Sahi をインストールして構成するためには、以下の手順に従います。

  1. 最新のビルド (「参考文献」を参照) をダウンロードし、ファイルを解凍します。Sahi には Java 1.5 またはそれ以降が必要です。
  2. Sahi のプロキシー・サーバーを起動します。起動スクリプトは <sahi_root>\userdata\bin にあります。
    • Windows の場合: start_dashboard.bat
    • Linux の場合: start_dashboad.sh
    図 2 に示すように、使用したいブラウザーを起動するためにはブラウザーのアイコンを選択します。

    図 2. Sahi のダッシュボード
    Sahi のダッシュボード: このダッシュボードによって構成を変更することができます。

    この例ではブラウザーの構成を気にする必要はありません。Sahi には、ブラウザーを起動するための GUI ツールが用意されています。start_sahi.bat または start_sahi.sh を実行してそのツールを起動し、次にブラウザーのアイコンをクリックしてプロキシー・サーバーとブラウザー・プロセスを起動します。
  3. Ant などのビルド・ツールを使用して暗黙的に実行するためには、start_sahi.bat または start_sahi.sh を実行する必要があります。

    注: Internet Explorer (IE) の場合に限り、Sahi のプロキシーを使用するためには手動でブラウザーを構成する必要があります。あるいは、Sahi のプロキシー・サーバーを起動する際、Sahi に用意されているツールを使用してブラウザーのプロキシーを設定することもできます。プロキシーのホストとポートは localhost:9999 です (ポートを変更するには <sahi_root>\config\sahi.properties に変更を加えます)。

テスト・スクリプトを Java フォーマットで記録する

Sahi には、Sahi と Java という 2 つのスクリプト・フォーマットが用意されており、デフォルトのオプション (Sahi) は <sahi_root>\config\sahi.properties で変更することができます。Sahi フォーマットは Java のスクリプトに似たフォーマットであり、Sahi の Java スクリプト・エンジン内でのみ実行することができます。この記事の例では、Sahi フォーマットよりも一般的な Java フォーマットを使用します。これは大規模なテスト・プロジェクトの場合に Java フォーマットのスクリプトの方が他のテスト・ツールやフレームワークとの統合が容易なためです。Java フォーマットには一般的な Java コードのスニペットが含まれ、そのコード・スニペットを JUnit や TestNG. などのツールと統合することができます。

簡単なテストを実行するには、以下のようにします。

  1. テスト対象の Web アプリケーションを開きます。ALT キーを押し、ページ上でダブルクリックします (ここでは説明用として Firefox 3 を使用しました)。
  2. 図 3 のスクリーン・ショットの画面では、「Record (記録)」をクリックします。

    図 3. すべての実行内容を記録するための Sahi コントローラー
    すべての実行内容を記録するための Sahi コントローラーのスクリーン・ショット

    「Record (記録)」をクリックすると、ボタンの表示が「Stop (停止)」に変わります。
  3. Web アプリケーションで何らかの操作を行い、「Stop (停止)」をクリックします。アプリケーション内で実行されたすべてのステップが記録されています (図 4)。

    図 4. コントローラーによって記録されたスクリプト
    Sahi コントローラーによって記録されたスクリプトのスクリーン・ショット

    操作が記録されている間、必要に応じてアサーションを挿入することができます。これらのツールには他にも挿入のためのオプションが用意されていますが、挿入は手動で行うことをお勧めします。

JUnit と統合する

ユニット・テストのフレームワークである 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_PATHUSER_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();
		}
	}
    ......
}


Ant を使用してテストする

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()

browser.button("delete").near(browser.cell("item1")).click()

位置関係に基づいて特定しますunderbrowser.button("delete").under(browser.cell("item1"))


まとめ

この記事では、Web アプリケーションのテストを自動化するためのツール、Sahi について説明しました。Sahi はさまざまなブラウザーでスクリプトの記録や再生を行えるオープンソースのツールです。この記事では、テスト・スクリプトを作成するための異なる言語用ドライバーについて学びました。そしてサンプル・アプリケーションとテスト・ケースを使用し、スクリプトを JUnit 用のフォーマットにする方法と Apache Ant を使用してテストを行う方法を示しました。また Sahi の高度な API の概要も説明しました。



ダウンロード

内容ファイル名サイズダウンロード形式
Sample web applicationwebapp4sahi.zip7KBHTTP
A Sahi test exampleDemo4SahiTest.zip287KBHTTP

ダウンロード形式について


参考文献

学ぶために

  • Sahi について学んでください。Sahi は Web アプリケーションのテストを自動化するためのビジネス対応のツールです。このサイトでドキュメントやチュートリアル、サポート・フォーラムを利用することができます。

  • Sahi についての詳しい資料を読んでください。

  • developerWorks の Web development ゾーンには Web ベースのさまざまなソリューションを解説した記事が豊富に用意されています。

  • developerWorks の Technical events and webcasts で最新情報を入手してください。

製品や技術を入手するために

  • Sahi をダウンロードしてください。

  • 皆さんの次期開発プロジェクトを IBM ソフトウェアの試用版を使用して革新してください。ダウンロード、あるいは DVD で入手することができます。

議論するために

著者について

Gang Li photo

Gang Li は現在 IBM CDL で IBM Initiate 製品の品質保証を担当しており、自動テストの基盤作成を中心とした作業を行っています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=710839
ArticleTitle=Sahi を使用して Web アプリケーションのテストを自動化する
publish-date=07152011
author1-email=liggli@cn.ibm.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。