Seleniumで動的な値を扱う

テストにおいては各試験項目に見合ったテストデータを使用するわけですが、「今日の日付」など動的な値を扱わなければいけない場合があります。例えば書籍の貸し出しを行うと「貸出日」がアプリケーションで記録される、という場合に貸出日はテストを実行した日付になるため、テストケースで予め固定した値を書いておくわけにはいきません。
そのような動的な値をSeleniumにおいて扱う方法を試してみました。

Javascript+変数を使用する。

まずは、Seleniumで提供されている変数の仕組みを利用する方法です。
storeコマンドを使うとjavascriptを使って出力する値を変数に入れることができます。
そしてそれ以降のコマンドでは%変数名%と指定することで変数値を使用することができます。ここでは今日の日付を取得して「MM/DD」という形式で変数値を設定してみます。

<!-- 日付を取得して変数TODAYを作成 -->
<tr>
    <td>store</td>
    <td>javascript{((new Date()).getMonth() + 1) + '/' + (new Date()).getDate()}</td>
    <td>TODAY</td>
</tr>
<!-- 変数TODAYを使用してコマンドを実行 -->
<tr>
    <td>type</td>
    <td>searchword</td>
    <td>${TODAY}</td>
</tr>
<tr>
    <td>verifyText</td>
    <td>id=BookRentDay</td>
    <td>${TODAY}</td>
</tr>

上記変数を利用した結果は以下のようになります(キーワード欄)。


Javascriptは上記のような単文だけでなく、複数の文を使うことも可能です。ここでは「YYYY年MM月DD日」という書式で変数に設定してみます。

<tr>
    <td>store</td>
    <td>javascript{td = new Date();yy = td.getYear();
                   mm = td.getMonth() + 1;dd = td.getDate();
                   yy + '年' + mm + '月' + dd + '日'}</td>
    <td>TODAY</td>
</tr>
〜以下同様〜

こちらの利用結果は以下の通りです。

このようにJavascriptを使って取得及び加工した値を変数としてテストケースで使用することができます。

DbUnitでDB更新の期待値を検証

DB更新を伴うテストの場合、Selenium単体では画面上の表示は検証できますが、DBそのものがちゃんと更新されているかどうかの検証はできません。そのような場合にはDbUnitを利用するというのも一つのアイデアかと思います。DbUnitを利用した「DB更新検証用サーブレット」を作成してSeleniumのテストケースから呼び出すというわけです。

DB更新検証用サーブレット
ExcelでDB更新の期待値を作成 <- assert -> DBの値を取得

DbUnitを使用する際の一つの方法としてExcelファイルを用いる方法がありますが、そのExcelファイル(更新期待値)に動的な値を設定する方法を書いていきます。

まず、Excelファイルでは動的な値を設定したいセルに変数を記述します。ここでは[TODAY]という変数を設定してみました。

java側のソースでは、ReplacementDataSetクラスのaddReplacementObjectメソッドを使用してエクセルで記述した[TODAY]部分に今日の日付を設定しています。その上でgetTableメソッドで指定したテーブル(この例ではrentalテーブル)の情報を取得しています。

// 実際のテーブル情報を取得
IDataSet actualDataSet = dbconn.createDataSet();
ITable actualTable = actualDataSet.getTable("rental");

// 期待値テーブル情報を取得
File expectedFile = ResourceUtils.getFile(
        this.getClass().getResource(
                XLS_EXPT_DIR +  "/expectedData.xls"));
ReplacementDataSet expectedDataSet = new ReplacementDataSet(new XlsDataSet(expectedFile));
expectedDataSet.addReplacementObject("[TODAY]", dfm.format(dt));
ITable expectedTable = expectedDataSet.getTable("rental");

// 実際のテーブル情報と期待値のテーブル情報を比較して検証
Assertion.assertEquals(expectedTable, actualTable);