DBUnitイイ!

Javaユーザにはとっくにお馴染みだと思うんです、DBUnit
でもJava使い以外にもDBUnitを広めたいっ!!

  • テスト仕様作成時に、Excelでテストデータ・期待値データを作っておく
  • テスト実行前にDBUnitでテストデータをDBへロード
  • テスト実施後にDBUnitで結果データをExcelファイルへ出力
  • Excelマクロで期待値データと結果データを比較して差分を出力

ということが出来て、DBの中身をチェックする細かい試験が本当に楽です。チェック漏れも激減します。

Seleniumと合わせて、テストデータのロードと出力までは自動化できそう。SeleniumからExcelマクロの実行まで出来ると完璧!と思ったけれどそれは無理そう。

ExcelマクロのRuby化ができるらしい(http://jp.rubyist.net/magazine/?0027-ExcellentRuby)ので、そこまでやると完璧かなーと思うのですが。

DBUnitを使う時にはDatatypeFactoryを指定しよう

DBUnitを使ってDBのデータをExcelファイルに落とすとき、IDatabaseConnectionを取得するタイミングでデータタイプファクトリーを指定します。指定しなくても動くので、指定していないコードを多く見かけるんだけど。

データタイプファクトリーの指定方法は下記のような感じです。

IDatabaseConnectionを返すメソッドの中身の例:

    Class.forName(driverName);
    Connection conn = DriverManager.getConnection(connectionUrl, user, passwd);
    IDatabaseConnection retConn = (new DatabaseConnection(conn, schema));
    DatabaseConfig config = retConn.getConfig();
    config.setProperty(
        DatabaseConfig.PROPERTY_DATATYPE_FACTORY, 
        new Oracle10DataTypeFactory());
    return retConn;

ここではOracle10用に指定。
Oracleの場合、指定しないとDate型の時刻情報を切り捨てられてしまいます。

日付変換Excelマクロ for DBUnit with Oracle

DBUnitOracleのデータをExcelファイルに出力すると、Date型・Timestamp型の情報は1970年1月1日からの経過ミリ秒で返ってきます。

そして、DBUnitExcelファイルのデータをDBに投入するには、Date型・Timestamp型のカラムに相当する部分はJDBC形式の日付文字列(yyyy-MM-dd HH:mm:ss形式)になっていないと取り込めません。

つまり、DBUnitで出力したExcelファイルは、そのままDBUnitでのデータ投入には使えないのです。えー、この矛盾は一体なぜ??

文句を言っても仕方ないので、Excelマクロで無理矢理解決。

使い方:
以下のようなマクロを作って呼び出してください。

続きを読む

DBUnitで出力したExcelファイルをDBUnitでロードしたい

いくつか妨げになることがあり、すんなりいきません。
解決策はこんな感じです。

  • 出力されたExcelファイルのシートがテーブル間の参照関係を無視した並びになっている
    • ←一旦外部参照制約を外してロードしてから再度外部参照制約を付ける
    • Excelマクロでシートを依存関係に従って並べ替える
  • 参照専用のViewも出力されてしまう
    • ←出力対象を指定して実行する
    • Excelマクロで不要シートを削除
  • Oracleの場合、先ほど書いたDate型/Timestamp型の問題もありますが、ExcelマクロでOK

Excelマクロ、便利です。