Topics & News
マピオンラボリニューアルしました。

Mapion マピオンラボ テスト Seleniumでラクラク、クロスブラウザ自動テスト!(その2)

Seleniumでラクラク、クロスブラウザ自動テスト!(その2)

こんにちは、中村です。

さてSeleniumでクラスブラウザ自動テストを紹介する前回の続きです。今回はSelenium IDEで生成したJavaのテストクラスを利用してSelenium RCによるクロスブラウザな自動テスト実行までを行います。生成されたJavaのテストクラスは以下でしたね。

package com.example.tests;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class Untitled extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://change-this-to-the-site-you-are-testing/", "*chrome");
    }
    public void testUntitled() throws Exception {
        selenium.open("/");
        selenium.click("link=電話帳");
        selenium.waitForPageToLoad("30000");
        selenium.click("link=ラーメン・餃子");
        selenium.waitForPageToLoad("30000");
        selenium.click("link=東京都");
        selenium.waitForPageToLoad("30000");
        selenium.click("link=足立区");
        selenium.waitForPageToLoad("30000");
        verifyEquals("ラーメン専科", selenium.getText("//td[1]/a"));
        verifyEquals("夢屋", selenium.getText("//tr[2]/td[1]/a"));
        verifyEquals("梅華", selenium.getText("//tr[3]/td[1]/a"));
    }
}

Eclipseでテスト用Javaプロジェクトを作成

Selenium IDEが生成するJavaのテストクラスはJUnit3系互換です。JUnitを手間なく動かせるEclipseで話を進めますが、ここはお好みの開発環境で問題ありません。プロジェクトを作成し、ライブラリのパスなどを設定します。

javaproj.png

パッケージエクスプローラで右クリック→新規→Javaプロジェクトを選択、

projset1.png

プロジェクト名は適当に、JREは1.5以上を指定しましょう。次へを選択し、

projset2.png

ライブラリー→ライブラリーの追加を選択しーの、

projset3.png

JUnitを選択しーの、

projset4.png

JUnit 3を設定。続けてJavaからSelenium操作を行うクライアントライブラリも追加します。ダウンロードしたSelenium RCを解凍し、その中に含まれる selenium-java-client-driver.jar をプロジェクトへ追加します。該当のjarは以下パスです。

selenium-remote-control-1.0.1/selenium-java-client-driver-1.0.1/selenium-java-client-driver.jar
 
projset5.png

外部JARの追加を選択、

projset6.png

selenium-java-client-driver.jar を選択します。これにて設定は完了です。

テストクラスの作成

次にテストクラスです。コピペ!といきたいところですが、そのままでは動かないのでちょっと手直しする必要があります。

makeclass.png

新規→クラスを選択、

makeclass2.png

パッケージは「tests」、クラス名は「TestMapion」としましょうか。後の項目はコピペしてしまうので放置!赤字の部分を修正した以下ソースを記述して保存しましょう。

package tests;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class TestMapion extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.mapion.co.jp", "*iexplore");
    }
    public void testUntitled() throws Exception {
        selenium.open("/");
        selenium.click("link=電話帳");
        selenium.waitForPageToLoad("30000");
        selenium.click("link=ラーメン・餃子");
        selenium.waitForPageToLoad("30000");
        selenium.click("link=東京都");
        selenium.waitForPageToLoad("30000");
        selenium.click("link=足立区");
        selenium.waitForPageToLoad("30000");
        verifyEquals("ラーメン専科", selenium.getText("//td[1]/a"));
        verifyEquals("夢屋", selenium.getText("//tr[2]/td[1]/a"));
        verifyEquals("梅華", selenium.getText("//tr[3]/td[1]/a"));
    }
}

Selenium Serverの起動

あともう少しです(汗)。クライアントライブラリからのコマンドを中継し、実際にブラウザ操作を行うSelenium Serverを起動します。以下パスにあるjarファイルをコマンド起動します。

selenium-remote-control-1.0.1/selenium-server-1.0.1/selenium-server.jar
 

コマンド起動は特に引数なしでOKです。コマンドプロンプト開いてディレクトリ移動して~、というのも面倒くさいのでbatファイル作成して同ディレクトリに配置しちゃいましょう。

  • run.bat
java -jar selenium-server.jar

実行すると以下のプロンプトが立ち上がります。

server.png


テスト実行!

さぁ、すべての準備が整いました!テストの実行です。作成したクラスから実行→JUnitテストを選択しましょう。

rununit.png

ポチっとな。

running.png

おぉぉぉーーー、IEが勝手に動くぅぅぅーーー!

red.png

で、テスト失敗(´・ω・`)

expected "旭川直送ラーメン 吹雪" to match glob "ラーメン専科" (had transformed the glob into regexp "ラーメン専科"
expected "ラーメン専科" to match glob "夢屋" (had transformed the glob into regexp "夢屋"
expected "夢屋" to match glob "梅華" (had transformed the glob into regexp "梅華"
 

あ、そうだ。データが更新されてる。検証値を変更すればもちろんテストはパスします。

:
verifyEquals("旭川直送ラーメン 吹雪", selenium.getText("//td[1]/a"));
verifyEquals("ラーメン専科", selenium.getText("//tr[2]/td[1]/a"));
verifyEquals("夢屋", selenium.getText("//tr[3]/td[1]/a"));
:

検証値を修正して、再度実行!

success.png

無事、テストはパスしました。

実行するブラウザの指定

ではIE以外のブラウザでもテストを実行しましょう。テスト対象のブラウザはsetUpメソッドで指定されています。

:
public void setUp() throws Exception {
    setUp("http://www.mapion.co.jp", "*iexplore");
}
:

指定する文字列値にて起動するブラウザを指定します。中村のWindowsには主要5ブラウザを全てインストールしていますので、それぞれ以下の値を指定します。

  • *iexplore
  • *firefox3
  • *googlechrome
  • *opera
  • *safari

これ以外にもいくつかの値が設定できます。詳しくはリファレンスを参照してください。なおブラウザをデフォルトのパス以外でインストールしている場合、併せてexeファイルのパスをスペースで区切って指定する必要があります。中村の環境ではFirefoxを少し変えていたため、以下のように指定する必要がありました。エスケープ文字列、要注意。

"*firefox3 C:\\Program Files\\Mozilla Firefox 3.5 ja\\firefox.exe"

全ブラウザを一気にテスト!

TestMapionクラスをベースに主要5ブラウザをそれぞれにテストするクラスを作成し、それらをまとめて実行するTestSuiteを作ってしまいましょう。ここらへんはJUnit的なお話なので以下ソースをご参照ください。

  • TestMapionFF
:
public class TestMapionFF extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.mapion.co.jp", "*firefox3");
    }
    :
  • TestMapionGoogleChrome
:
public class TestMapionGoogleChrome extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.mapion.co.jp", "*googlechrome");
    }
    :
  • TestMapionOpera
:
public class TestMapionOpera extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.mapion.co.jp", "*opera");
    }
    :
  • TestMapionSafari
:
public class TestMapionSafari extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.mapion.co.jp", "*safari");
    }
    :
  • TestAllBrowser
package tests;

import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAllBrowser extends TestCase {

    public static Test suite(){
        TestSuite suite=new TestSuite();
        suite.addTestSuite(TestMapion.class);
        suite.addTestSuite(TestMapionFF.class);
        suite.addTestSuite(TestMapionGoogleChrome.class);
        suite.addTestSuite(TestMapionOpera.class);
        suite.addTestSuite(TestMapionSafari.class);
        return suite;
    }
}

TestAllBrowserクラスにてテスト実行することにより、それぞれのブラウザが順番に起動されテストが実行されるようになりました。今回作成したソースは以下から入手可能ですので興味のある方はご参考ください。SeleniumTestSrc.zip

多少の手続き的な準備はありますが、一つのテストケースからクロスブラウザな自動テストを行う仕組みは簡単に出来たと思います。一度しっかりとしたテストケースが出来てしまえば、クロスブラウザで回帰試験が自動で行なえることは魅力的です。今回はSeleniumコマンドであるSeleneseの詳細な説明をほとんど行なっていませんが、もちろんAjaxバリバリなページでもテストが出来るよう便利なコマンドが多く用意されています。そこらへんは次回のエントリーあたりで紹介させてもらおうかと思います。

comment
ニックネーム 

「再帰」→「回帰」だと思います。前回はミスタイプかと思ったのですが、今回もあったので念のため…。

匿名:2009.12.18 20:59

ご指摘ありがとうございます。修正させて頂きました。
単純に単語を間違えて覚えておりました。。。

マピオン中村:2009.12.21 10:59

trackback

この記事のトラックバックURLhttp://labs.mapion.co.jp/mtos/mt-tb.cgi/30

Mashup Awards 7 (#MA7)
ユーザーアーカイブ