8.6. RemoteWebDriverに変更する
Selenium Grid2を使用する場合には、WebDriverの生成部分を修正する必要があります。
ローカル環境のFirefoxに対してブラウザをテストする場合には、下記のように生成していたと思います。
driver = new FirefoxDriver();
この部分をDesiredCapabilitiesオブジェクトに実行する環境を指定して、それを引数にRemoteWebDriverを生成するように変更します。例えば、OSがWindowsでChromeのバージョン30を指定する場合のコードは下記のようになります。
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の初期化を行うだけです。
テストメソッドについては変更ありませんので割愛します。
@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の記述を追加するだけです。
<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の自動テストをさらに活用していただければ幸いです。
次回は、テストの実践的な書き方を紹介させていただきます。