SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

WebDriverの採用で生まれ変わったOSSのブラウザテストツール「Selenium 2」入門

「Selenium2」テスト徹底活用! Jenkinsによる自動実行とSelenium Grid2による複数環境でのテスト

WebDriverの採用で生まれ変わったOSSのブラウザテストツール「Selenium2」入門 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

8.6. RemoteWebDriverに変更する

 Selenium Grid2を使用する場合には、WebDriverの生成部分を修正する必要があります。

 ローカル環境のFirefoxに対してブラウザをテストする場合には、下記のように生成していたと思います。

コード1 RemoteWebDriverに書き換える前のWebDriver生成コード
driver = new FirefoxDriver();

 この部分をDesiredCapabilitiesオブジェクトに実行する環境を指定して、それを引数にRemoteWebDriverを生成するように変更します。例えば、OSがWindowsでChromeのバージョン30を指定する場合のコードは下記のようになります。

コード2 RemoteWebDriverに書き換えたコード
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setPlatform(Platform.valueOf("WINDOWS"));
capabilities.setBrowserName("chrome");
capabilities.setVersion("30");
driver = new RemoteWebDriver(capabilities);

 このようにテスト対象の環境をしめすDesiredCapabilitiesオブジェクトを切り替えながらテストすれば複数環境のテストが可能になります。

 今回は、JUnitのパラメータ化テストを使って環境の切り替えを実現します。パラメータ化テストとは、異なるパラメータを与えて複数回テストを実行する機能です。この環境指定の部分をパラメータとして扱い、複数環境でテストを実施します。

 下記のコードをご覧ください。まず、①でテストクラスに@RunWith(Parameterized.class)を宣言します。

 次に、②のパラメータを返す@Parameter宣言付きのメソッドを定義します。

 パラメータとして渡すのは、テスト実行環境の情報です。今回はMac、Windowsの2つのプラットフォームに4つのブラウザを用意していますので、その情報をList型で返却しています。

 情報は③のコンストラクタに渡されるので、④のインスタンス変数に保持します。

 あとはsetupメソッドで⑤のRemoteWebDriverの初期化を行うだけです。

 テストメソッドについては変更ありませんので割愛します。

コード3 複数環境対応のテストコード
@RunWith(Parameterized.class) // ① アノテーション宣言を追加
public class MyWebAppTest {
	private WebDriver driver;
	private String baseUrl;
	private boolean acceptNextAlert = true;
	private StringBuffer verificationErrors = new StringBuffer();
	private DesiredCapabilities capabilities; // ④ パラメータの指定を格納

	// ② 環境を返却するメソッド
	@Parameters
	public static List<String[]> parameters() {
		List<String[]> browsers = new ArrayList<String[]>();
		browsers.add(new String[] { Platform.MAC.toString(), "firefox", "24" });
		browsers.add(new String[] { Platform.MAC.toString(), "safari", "6" });
		browsers.add(new String[] { Platform.WINDOWS.toString(), "chrome", "30" });
		browsers.add(new String[] { Platform.WINDOWS.toString(),
				"internet explorer", "10" });
		return browsers;
	}

	// ③ コンストラクタ
	public MyWebAppTest(String platform, String browser, String version) {
		capabilities = new DesiredCapabilities();
		capabilities.setPlatform(Platform.valueOf(platform));
		capabilities.setBrowserName(browser);
		capabilities.setVersion(version);
	}

	@Before
	public void setUp() throws Exception {
		driver = new RemoteWebDriver(capabilities); // ⑤ RemoteWebDriverを生成
		baseUrl = "http://xxx.xxx.xxx.xxx:8080";
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
	}
	// 以降省略。    

8.7. テストを実行する

 さっそく、Jenkinsからテストを実行してみましょう。

 次々に異なるブラウジング環境でのテストが実行されることが確認できます。

9. テストの並列実行

 テスト環境が増えたり、テストコードが増えてくるともう一つ悩ましい問題が発生します。

 それはテストの実行時間です。せっかく自動化を行っても、一晩中実行してもテストが終わらないといった事態も起こり得ます。迅速に問題点がフィードバックされなくなってしまっては、自動テストの価値も下がってしまいます。

 今回はmavenの機能を使い、テスト実行を並列化します。

9.1. pom.xmlを編集する

 mavenを使ってJUnitテストを並列実行するには、下記のpluginの記述を追加するだけです。

コード4 並列実行を行うpom.xml
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <parallel>methods</parallel>
            <threadCount>4</threadCount>
        </configuration>
    </plugin>
</plugins>

9.2. テストを実行する

 さっそく、Jenkinsからテストを実行してみましょう。

 異なるブラウジング環境でのテストが同時並行で実行されることが確認できます。

9.3. 更新処理への配慮

 今回用意したサンプルアプリケーションについては、更新処理のないものでしたので簡単に並列化ができました。しかし、実際のテストではほとんどの場合、更新処理があり、単純に並列実行することはできません。

 更新を含むテストを考慮する場合、参照系のみ並列化したり、それぞれデータベースの接続先をもった複数のwarファイルをデプロイし、パラメータでベースとなるURLを指定し、テスト環境ごとに参照するwarを変えるなどの考慮が必要です。

10. まとめ

 ここまで、Jenkinsを利用したSelenium2の自動実行、Selenium Grid2による複数環境のテストを説明しましたが、いかがでしたでしょうか。これらの方法を用いて、Selenium2の自動テストをさらに活用していただければ幸いです。

 次回は、テストの実践的な書き方を紹介させていただきます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
WebDriverの採用で生まれ変わったOSSのブラウザテストツール「Selenium 2」入門連載記事一覧

もっと読む

この記事の著者

五座 淳一(株式会社DTS)(ゴザ ジュンイチ)

株式会社DTS 金融企画部所属。主に大規模・金融機関向けシステム開発のアーキテクト担当しています。ウォーターフォール型の開発に、CIなどアジャイル開発のプラクティスを取り入れ、開発プロセスの改善を試みています。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7505 2013/11/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング