紫だちたる雲の細くたなびきたる blog

春はあけぼの(をかし)

えーん終わらないよぉ

すでに1週間以上の遅れ!共通部品のできの悪さが原因っていうわけじゃないからなぁ…。
と、言うわけで、自分が開発しやすい環境を無理矢理作る事にした。

環境その1:DBUnit

とにかくデータベースのデータが自由にならない、っていうかDBアクセスが重すぎる(でかいテーブルが多すぎ!)。というわけでテストデータの入れ替えを楽にする事ができるDBUnitを導入した。テストデータをExcelで準備すればかなり楽。

環境その2:HsqlDB

テスト環境とは言え好き勝手にデータをいじるのは良くないね、って事で自分のマシン上で動くデータベースを導入。テーブルを準備するのに手間取ったけどなんとかできた!大きすぎるテーブルは僕のプログラムと関係している列だけ抜粋。HsqlDBJavaで動くのでOracleSQLServerは言うに及ばずPostgreSQLMySQLに比べても導入が簡単。検索のスピードは別にして、動作も軽快なので単体テスト(というよりユニットテスト)環境に最適なのだ。

環境その3:テスト用データベースアクセスクラス

beanにデータベースアクセスのインスタンスを渡してやる方式だったらDBUnit用のテストコードが簡単に書けたのだが、beanのインスタンス変数としてそれを持たせる方式(*1)なので色々と改造が必要になった。
まず、共通が用意しているデータベースアクセスクラスを継承させてテスト用のデータベースアクセスクラスを作り、メソッドをオーバーライドしまくって、HSQLDBにアクセスさせるようにする。データベースにアクセスするbeanに無理矢理データベースアクセスクラスのインスタンスを渡すメソッドを追加し(後で削除しやすいようにコメントをつけておく)、なぜか共通のデータベースアクセスクラスのインスタンスをデータベース接続処理でメモリに割り当てていたので、そこは仕方なくコメントアウトする。(*2)。これで無理矢理HSQLDBに対してプログラムが動く。勿論他の人には一切影響がないので好き放題テスト可能となる。

テスト自動化

後はテストデータとテストコードを書いて実行するのみ!何度でも同じテストを実行できるのでプログラムをどんなに改造しても一定の品質を保つ事ができる。やっぱり僕はこのスタイルが好きだ。問題は単体テストエビデンス。どうやって残そうかな。

*1:これだからオブジェクト指向がわかってないというのだ。まったく。

*2:厳密に言えばソースを書き替えているので正当なテストとは言えないのだが、他にも環境に不備があっていろいろと書き替えているので気にしない