Webのユニットテスト⑦ Java

前回の続きです。
Hudsonの分散プロジェクトで、
作成したユニットテストを複数ブラウザで実行してみます。


と思ったのですが・・・ここで問題発生(;´Д`)


Antでユニットテストを実行してみたら、
バージョンが違う「/org/apache/tools/ant/Project.class」クラスがあるんで、
ビルドできないって怒られます。


「/org/apache/tools/ant/Project.class」はAntのクラスなのですが、
なぜか「selenium-server.jar」にも同じクラスが入っているのが原因みたいですね・・・


仕方がないので・・・方針を変更したいと思います。
SeleniumServerをプログラム内で起動していましたが、バッチで起動することにします。
よくよく考えてみたらSeleniumServerは立ち上げっぱなしでいいので、こっちの方がいいかも。


selenium-server-run.bat
SeleniumServerを以下のコマンドで起動します。
バッチファイルを作っておくと便利だと思います。

java -jar selenium-server.jar


■WebTester.java
SeleniumServerを起動する処理を削除しました。
ついでにユニットテスト時のスクリーンショットを撮る機能を実装してみました。

package sample;

import java.util.Properties;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class WebTester {

  private Properties prop;
  private Selenium selenium;
  private String className;
  private String methodName;

  public void setUp() throws Throwable {

    // プロパティファイル読み込み
    if (this.prop == null) {
      this.prop = new Properties();
      this.prop.load(this.getClass().getResourceAsStream("/WebTester.properties"));
    }

    // テスト対象のサーバURL&ブラウザ設定をプロパティから読み込む
    String url = this.prop.getProperty("SeleniumTest.Url");
    String browser = this.prop.getProperty("SeleniumTest.Browser");

    // seleniumインスタンス起動
    this.selenium = new DefaultSelenium("localhost", 4444, browser, url);
    this.selenium.start();
  }

  public void tearDown() throws Throwable {

    // 画面のスクリーンショットを保存
    captureScreenshot();

    // Seleniumインスタンスを停止
    this.selenium.close();
    this.selenium.stop();
  }

  public Selenium getSelenium() {
    return this.selenium;
  }

  public void open(String url) {

    // アプリケーション名の取得
    String appName = this.prop.getProperty("SeleniumTest.App");

    // ブラウザを最大化で表示
    this.selenium.open(appName + url);
    this.selenium.windowMaximize();

    // 呼び出し側のクラス名&メソッド名を保持しておく
    this.className = Thread.currentThread().getStackTrace()[2].getClassName();
    this.methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
  }

  public void captureScreenshot() {
    captureScreenshot(this.className + "." + this.methodName + ".png");
  }

  public void captureScreenshot(String fileName) {

    // スクリーンショット保存ディレクトリが指定されている場合に、スクリーンショットを保存する
    String ScreenshotDir = this.prop.getProperty("SeleniumTest.ScreenshotDir");
    if (ScreenshotDir != null) {

      // 画面のスクリーンショットを保存
      this.selenium.captureScreenshot(ScreenshotDir + "/" + fileName);
    }
  }
}