Selenium WebDriver + Excelファイル でデータ駆動型テスト

前回の続きです。
Selenium WebDriverのテストケースを試験的に運用してみたのですが、各画面の入力項目や期待値があるため、通常よりも扱うパラメータが多くなってしまい、テストケースの管理がしづらくなったり、シナリオテストのコードの見通しが悪くなったりしてしまいました。
そこで JUnit ParameterizedXLSBeans を組み合わせてパラメータをExcelファイルで管理し、データ駆動型テスト(異なるテストパスでデータを変更できるテスト)をしてみたところ結構イイ感じだったので書いておきます。

JUnit Parameterizedとは?

@Parametersアノテーションを記述したメソッドでテストデータの設定をし、テストデータの数だけテストケースを繰り返し実行してくれる機能です。
テストケースの内容を変えずにパラメータのみを変更して繰り返しテストを実行したい場合に便利です。

XLSBeansとは?

ExcelとJavaBeansをJava 5のアノテーションマッピングするためのライブラリです。

以下サンプル - Amazonの商品検索をするテストケース

WebDriverで以下の動作をするテストケースを作成します。

  • ブラウザを起動
  • Amazonトップ画面を開く
    • 検索カテゴリーを選択
    • 検索テキストを入力
    • Goボタンを押下
  • 検索結果画面が表示
    • 検索結果一覧画面に期待する商品名が表示されるか検証

入力値となる検索カテゴリー、検索テキスト、期待する検索結果はJavaのテストクラスではなくExcelファイルのテーブルに記述し、テストデータとテストシナリオを分離します。

ExcelファイルとマッピングするBeanクラスの作成

以下のようなExcelファイルを用意します。
ファイル名:Test.xls シート名:Test


ExcelのテーブルとマッピングするBeanクラスは以下2つのクラスファイルです。
アノテーションでシート名、カラム名を指定でき、Publicフィールドもサポートしているのでとてもシンプル。

@Sheet(name="Test")
public class TestSheet {
    @HorizontalRecords(tableLabel="テストケース一覧", recordClass=TestData.class)
    public List<TestData> testDataList;
}

public class TestData {

    @Column(columnName="TestNo")
    public String testNo;

    @Column(columnName="カテゴリー")
    public String category;

    @Column(columnName="検索ワード")
    public String searchText;

    @Column(columnName="期待する検索結果")
    public String searchResult;
}

JUnitのテストケースを作成

@RunWith(Parameterized.class)
public class ExcelTest {

    /** WebDriver */
    private static WebDriver driver;

    /** テスト用パラメータ Excelの1レコードに該当 */
    private TestData testData;


    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        driver = new FirefoxDriver();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        driver.quit();
    }

    public ExcelTest(TestData testData) {
        this.testData = testData;
    }

    @Parameters
    public static List<TestData[]> data() throws Exception {
        // Excelファイルの読み込み
        TestSheet sheet = new XLSBeans().load(
                new FileInputStream("Test.xls"), TestSheet.class);

        // Parametersの設定
        List<TestData[]> list = new ArrayList<TestData[]>();
        for (TestData testData : sheet.testDataList) {
            list.add(new TestData[] {testData});
        }
        return list;
    }

    /**
     * テストケース
     * Excelファイルのレコード数だけ繰り返し実行される
     *
     * @throws Exception
     */
    @Test
    public void Amazon検索() throws Exception {

        // 初期表示するページ
        driver.get("http://www.amazon.co.jp/");

        // 検索カテゴリ、テキストの入力
        new Select(driver.findElement(By.id("searchDropdownBox"))).selectByVisibleText(testData.category);
        driver.findElement(By.id("twotabsearchtextbox")).sendKeys(testData.searchText);

        // Goボタン押下
        driver.findElement(By.id("navGoButton")).click();

        // 検索結果を検証
        assertThat(testData.testNo, driver.getPageSource(), is(containsString(testData.searchResult)));
    }
}

感想

XLSBeansとJUnit Parameterizedの組み合わせはExcelファイルの読み込み処理がとてもシンプルで導入しやすいため気に入ってます。
またテストデータがExcelファイルとなるのでテストケースのパラメータが一覧で管理しやすく、テスト内容の説明や意図なども合わせて記載できます。
テストケースのシナリオとテストデータが分離されるのでテストデータの確認や修正はExcelファイルだけで済みますし、テストケースのシナリオにはゴテゴテとパラメータが記述されないのでスッキリします。
サンプルで紹介したテストケースは入力パラメータや期待値の数が少ないので分かりにくいかもしれませんが、業務系アプリの場合 入力値は結構な数になってしまうことが多いので管理 保守面のメリットは大きいと思います。
自分はExcelファイルからソースコードを生成するのはあまり好きではないのですが、こういうExcelの利用の仕方は悪くないかなーと思っています。